# ADRES Health Affiliation Status Source: https://docs.usecroma.com/api-reference/colombia/adres-health-affiliation-status /api-reference/openapi.json post /co/adres/affiliation-status/v1 Look up a person's affiliation to the Colombian health system (BDUA): the entities (EPS) they are or were affiliated to, the régimen (contributivo/subsidiado), affiliation dates, and affiliate type. `document_type` defaults to `CC`. Returns `found: false` when the document is not registered in BDUA. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # CNDJ Ruling Source: https://docs.usecroma.com/api-reference/colombia/cndj-ruling /api-reference/openapi.json post /co/cndj/ruling/v1 Retrieve one CNDJ disciplinary ruling by its `registration_number` + `ficha_number` key: the editorial fields (titulación, descriptores, fuentes normativas, salvamentos) plus the ruling document and its extracted full text when it carries a text layer. `found: false` when no document is stored for that key. # CNDJ Rulings Search Source: https://docs.usecroma.com/api-reference/colombia/cndj-rulings-search /api-reference/openapi.json post /co/cndj/rulings-search/v1 Search disciplinary rulings from the Relatoría de la Comisión Nacional de Disciplina Judicial (CNDJ) by free text or the advanced filters (reporting magistrate, topic, respondent, matter, subtopic, filing year). Returns the matching summaries with their `numero_unico` + `numero_ficha` key; read one in full with `cndj-ruling`. # Consejo de Estado Jurisprudence Search Source: https://docs.usecroma.com/api-reference/colombia/consejo-de-estado-jurisprudence-search /api-reference/openapi.json post /co/consejo-estado/search/v1 Search the Relatoría del Consejo de Estado's traditional jurisprudence corpus (broadly providencias before December 2021) by section, type, date window, radicado, ponente, party or challenged rule. Each row carries the providencia's metadata plus a `url` permalink to feed to `consejo-estado-providencia`. For December 2021 onward use the SAMAI endpoints. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Consejo de Estado Providencia Source: https://docs.usecroma.com/api-reference/colombia/consejo-de-estado-providencia /api-reference/openapi.json post /co/consejo-estado/providencia/v1 Retrieve the full text of one providencia from the Relatoría del Consejo de Estado, by the `url` permalink a search row exposes. `found: false` when the permalink resolves to no document. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Contaduría State Delinquent Debtor Records Source: https://docs.usecroma.com/api-reference/colombia/contaduría-state-delinquent-debtor-records /api-reference/openapi.json post /co/contaduria/state-delinquent-debtors/v1 Check whether a person or entity is a delinquent debtor to the Colombian State, from the Contaduría General de la Nación's register (Boletín de Deudores Morosos del Estado). Returns two verdicts: delinquent debt owed to the State (Ley 901 de 2004) and default on a payment agreement (Ley 1066 de 2006). `document_type` defaults to `CC`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Contraloría Fiscal Records Source: https://docs.usecroma.com/api-reference/colombia/contraloría-fiscal-records /api-reference/openapi.json post /co/contraloria/fiscal-records/v1 Check whether a person is reported as a responsable fiscal in the Contraloría's SIBOR boletín (certificado de antecedentes de responsabilidad fiscal). `document_type` defaults to `CC`. Returns the verdict plus a verification code. # DIAN Doctrina Document Source: https://docs.usecroma.com/api-reference/colombia/dian-doctrina-document /api-reference/openapi.json post /co/dian/doctrina/v1 Retrieve the text of one DIAN doctrine document by the `document_id` returned by `dian-doctrina-search`: the official title and the body of the oficio, concepto or norm. Compiled norms run to millions of characters, so the body is returned in character ranges: `content.total_length` is the full size, and when `content.has_more` is true request the next range with `offset: content.next_offset`. `found: false` when no document carries that id. # DIAN Doctrina Search Source: https://docs.usecroma.com/api-reference/colombia/dian-doctrina-search /api-reference/openapi.json post /co/dian/doctrina-search/v1 Full-text search over DIAN's published tax doctrine and related legal compilation: oficios, conceptos, decretos, resoluciones, leyes and high-court rulings. Each hit carries the `document_id` used by `dian-doctrina-document`, plus the title, issuing body, epigraph and a matching excerpt. Optional filters: `document_type` (e.g. `Oficios`, `Conceptos`) and `year`. Paginated with `page` and `per_page`; `capped: true` means the source returned more matches than are retrievable, so narrow the query. # DIAN Electronic Document Source: https://docs.usecroma.com/api-reference/colombia/dian-electronic-document /api-reference/openapi.json post /co/dian/electronic-document/v1 Validate a Colombian electronic document (factura electrónica, nota crédito/débito) by its CUFE/UUID and the emisor or receptor NIT. Returns the issuer, recipient, totals and taxes, current legitimate holder, validations, and events. Set `include_pdf: true` to also receive `pdf_url`, the URL of the official PDF representation. `found: false` means the document is not registered under that CUFE, or the NIT matches neither the emisor nor the receptor. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Policía Criminal Records Source: https://docs.usecroma.com/api-reference/colombia/policía-criminal-records /api-reference/openapi.json post /co/policia/criminal-records/v1 Check a person's Colombian criminal record (antecedentes). `document_type` defaults to `CC`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Procuraduría Disciplinary Records Source: https://docs.usecroma.com/api-reference/colombia/procuraduría-disciplinary-records /api-reference/openapi.json post /co/procuraduria/disciplinary-records/v1 Check a person or entity's antecedentes with the Procuraduría General de la Nación (disciplinary, penal, contractual, fiscal, and pérdida de investidura records from SIRI). `document_type` defaults to `CC`. Returns the verdict, the registered name, and the antecedente sections reproduced from the certificate. # Rama Judicial Cases by Entity Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-entity /api-reference/openapi.json post /co/rama-judicial/cases-by-entity/v1 Search Colombian judicial cases by entity name. Optional filters narrow by entity type, court code, recent activity, and page. # Rama Judicial Cases by Radicado Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-radicado /api-reference/openapi.json post /co/rama-judicial/cases-by-radicado/v1 Resolve a Colombian judicial case by radicado and return case metadata plus the first 40 actuaciones (actions) available. # Rama Judicial Cases by Radicado (Batch) Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-radicado-batch /api-reference/openapi.json post /co/rama-judicial/cases-by-radicado/v1/batch Resolve up to 50 Colombian judicial cases by radicado in one request. Returns one result per radicado in input order, each with its own status, so a single bad radicado never fails the batch. Each item counts as one request against your quota. # Registraduría Vital Status Source: https://docs.usecroma.com/api-reference/colombia/registraduría-vital-status /api-reference/openapi.json post /co/registraduria/vital-status/v1 Check a Colombian cédula's vital status. Returns `found: false` if the cédula isn't in the registry; otherwise `status` is `ALIVE` or `DECEASED`. # RUES Entities by Name Source: https://docs.usecroma.com/api-reference/colombia/rues-entities-by-name /api-reference/openapi.json post /co/rues/entities-by-name/v1 Search Colombian businesses in RUES by name, paginated, each result enriched with its full registry record (DetalleRM). # RUES Entity by NIT Source: https://docs.usecroma.com/api-reference/colombia/rues-entity-by-nit /api-reference/openapi.json post /co/rues/entity-by-nit/v1 Resolve a Colombian business by NIT and return its full RUES record: registry detail, financial statements, renewal history, related parties and registry notices. # SAMAI Corporaciones Source: https://docs.usecroma.com/api-reference/colombia/samai-corporaciones /api-reference/openapi.json post /co/samai/corporaciones/v1 Every corporación (despacho) SAMAI exposes, with its code and name. A code scopes a process search. # SAMAI Processes Source: https://docs.usecroma.com/api-reference/colombia/samai-processes /api-reference/openapi.json post /co/samai/processes/v1 Search live contentious-administrative processes (Consejo de Estado plus every Tribunal and Juzgado Administrativo) by party, radicado, or class, scoped to a corporación. Returns one page of matches with the reporting magistrate, class, filing date, parties and the official detail link. A radicado search derives the corporación from the radicado when none is given. # SAMAI Secciones Source: https://docs.usecroma.com/api-reference/colombia/samai-secciones /api-reference/openapi.json post /co/samai/secciones/v1 The secciones (salas) inside one corporación, with their codes and names. # SECOP Contract by ID Source: https://docs.usecroma.com/api-reference/colombia/secop-contract-by-id /api-reference/openapi.json post /co/secop/contract/v1 Resolve one electronic contract (SECOP II) by its contract id and return the full contract record plus its satellite history: registered additions/modifications, insurance policies (garantías) with insurer and validity, and the delivery plan with planned vs actual progress. `found: false` when no contract matches the id. # SECOP Contracts by Provider Source: https://docs.usecroma.com/api-reference/colombia/secop-contracts-by-provider /api-reference/openapi.json post /co/secop/contracts-by-provider/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/contracts-search/v1` instead. List the public-procurement contracts (SECOP II) awarded to one provider by cédula or NIT, across all contracting entities: the contractor profile (who hired them, values, status, dates). Optional filters: contracting-entity NIT and a sign-date window (`from_date`/`to_date`). Pages of 500, newest first (`page`, 1-based); `capped: true` means the page is full and later pages may exist. # SECOP Process by Notice Source: https://docs.usecroma.com/api-reference/colombia/secop-process-by-notice /api-reference/openapi.json post /co/secop/process/v1 Resolve a Colombian public-procurement process (SECOP II) by its OpportunityDetail noticeUID and return the process header, the per-provider award list, and every awarded contract: providers, documents, values, dates, and execution amounts. Sourced from Colombia Compra Eficiente's open data. `found: false` when no process matches the noticeUID. # SECOP Processes by Entity Source: https://docs.usecroma.com/api-reference/colombia/secop-processes-by-entity /api-reference/openapi.json post /co/secop/processes-by-entity/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/processes-search/v1` instead. List the procurement processes (SECOP II) published by one contracting entity (by NIT), optionally within a publication-date window. The audit population for an entity. Returns lean summaries (drill into one with `secop-process`). Pages of 500, newest first (`page`, 1-based); `capped: true` means the page is full and later pages may exist. # SICAAC Insolvency Cases Source: https://docs.usecroma.com/api-reference/colombia/sicaac-insolvency-cases /api-reference/openapi.json post /co/sicaac/insolvency-cases/v1 Look up Colombian natural-person insolvency cases by document number. `document_type` defaults to `CC` (Cédula de Ciudadanía). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Superfinanciera Complaints Source: https://docs.usecroma.com/api-reference/colombia/superfinanciera-complaints /api-reference/openapi.json post /co/superfinanciera/complaints/v1 Return the action history of a specific jurisdictional complaint filed against a person or entity at Colombia's Superfinanciera. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Supersociedades Financial Statements Source: https://docs.usecroma.com/api-reference/colombia/supersociedades-financial-statements /api-reference/openapi.json post /co/supersociedades/financial-statements/v1 Annual financial statements a Colombian company has filed with the Superintendencia de Sociedades, by NIT: income statement, balance sheet and cash flow per fiscal year, plus the company identity from the filing cover. One filing per year (the preferred entry point, latest re-submission), newest first, up to 10 years. Figures come as filed, in the unit the filing declares. # API Reference Source: https://docs.usecroma.com/api-reference/overview The complete Croma API reference: every endpoint with its request schema, response shape, error codes and an interactive playground to try calls live. Every endpoint in this reference is a `POST` request to `https://api.croma.run`, authenticated with a bearer API key. Pick an endpoint from the sidebar to see its full schema, example request, and a "try it" playground. ## Supported countries Endpoints are grouped by country, and each country has its own path prefix: | Country | Path prefix | | ------------------ | ----------- | | Colombia | `/co/…` | | Peru | `/pe/…` | | México | `/mx/…` | | Global (web tools) | `/global/…` | `GET /jobs/{id}` is country-independent: it returns the status of any [async job](/async-jobs). ## Conventions * **Auth**: `Authorization: Bearer ` on every endpoint. See [Authentication](/authentication). * **Success**: responses wrap the payload under `data`: `{ "data": … }`. * **Errors**: `{ "error": { "type", "code", "message" } }` with a non-2xx status. See [Errors](/errors). * **No match**: a queried record that doesn't exist is a `200`, not a `404`: single-record lookups return `found: false`, list lookups return an empty array. * **Rate limits**: reported via `X-RateLimit-*` response headers. See [Rate limits](/rate-limits). * **Async jobs**: longer-running lookups may return a `202` with a job you can poll or receive via callback. See [Async jobs](/async-jobs) for the list. * **Datasets vs live**: every endpoint is either a [live lookup](/live-lookups) (reads the source at request time) or a [dataset endpoint](/datasets) (answers from the whole source in milliseconds and carries `as_of`); `/catalog` says which via `served_from`. Get a key and make your first request. Wait inline, poll, or get a callback for long-running lookups. # Async jobs Source: https://docs.usecroma.com/async-jobs How Croma async jobs run long lookups: wait inline for the result, poll a status URL or receive a webhook callback, with the full job lifecycle explained. Some Croma lookups take longer to return, anywhere from a few seconds to a couple of minutes. These run as **async jobs**: the same request can resolve three different ways, and you choose which one fits your app. **You don't have to do anything special.** By default these endpoints behave like any other: you `POST` and get `{ "data": … }` back. The options below are opt-in, for when you'd rather not hold a connection open. ## Which endpoints are async? These lookups run as async jobs: **Colombia** * [Consejo de Estado](/guides/colombia/consejo-estado), jurisprudence search and one providencia * [Policía Nacional](/guides/colombia/policia), criminal records * [ADRES](/guides/colombia/adres), health affiliation status * [RUAF](/guides/colombia/ruaf), social-security affiliations * [SICAAC](/guides/colombia/sicaac), insolvency cases * [Superfinanciera](/guides/colombia/superfinanciera), complaints * [RUNT](/guides/colombia/runt), vehicle by plate and vehicle history by plate * [SIMIT](/guides/colombia/simit), account status * [Contaduría](/guides/colombia/contaduria), state delinquent debtors * [DIAN](/guides/colombia/dian), electronic document validation **Peru** * [SUNAT](/guides/peru/sunat), all lookups (RUC, document, name, taxpayers) * [RREE](/guides/peru/rree), foreigner cards * [SAT Lima](/guides/peru/sat-lima), account status and [capturas](/guides/peru/sat-lima-capturas) * [Callao](/guides/peru/callao-papeletas), papeletas * [SUTRAN](/guides/peru/sutran-infracciones), infracciones * [APESEG](/guides/peru/apeseg-soat) and [SBS](/guides/peru/sbs-soat), SOAT **Mexico** * [SIEM](/guides/mexico/siem), business establishments **Brazil** * [TST](/guides/brazil/tst), labour-debt certificate Every other endpoint answers synchronously, with no job involved. ## The three ways to get a result | Mode | You send | You get back | | ------------------------- | ---------------------------------- | ------------------------------------------------- | | **Wait inline** (default) | nothing extra, or `Prefer: wait=N` | `200 { data }` if it finishes in time, else `202` | | **Poll** | `Prefer: wait=0` | `202` now, then `GET /jobs/:id` until done | | **Callback** | `callback_url` in the body | `202` now, then a `POST` to your URL when done | All three are backed by the **same job**, so pick per request. If Croma already has a fresh result for the same query, any mode returns `200 { data }` right away (`X-Cache: HIT` header) and no job is created; in callback mode no `POST` follows. Always handle a direct `200`. *** ## Mode 1: Wait inline (default) Just call the endpoint. The request holds open until the job finishes (up to **55 seconds**) and returns the result in the usual `{ data }` shape, identical to a synchronous endpoint. ```bash cURL theme={"dark"} curl https://api.croma.run/co/policia/criminal-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890" }' ``` ```ts TypeScript theme={"dark"} const res = await fetch( "https://api.croma.run/co/policia/criminal-records/v1", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ document_number: "1234567890" }), }, ); if (res.status === 200) { const { data } = await res.json(); // finished, use it } else if (res.status === 202) { // didn't finish in time; poll the status URL (see Mode 2) } ``` Control how long to wait with the standard [`Prefer: wait=N`](https://www.rfc-editor.org/rfc/rfc7240#section-4.3) header (seconds, clamped to **55**): ```bash theme={"dark"} curl https://api.croma.run/co/policia/criminal-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -H "Prefer: wait=30" \ -d '{ "document_number": "1234567890" }' ``` * **`200`**: finished. Body is `{ "data": … }`, same as the synchronous shape. * **`202`**: not finished within the wait. Body is a [job envelope](#the-job-envelope); follow its `status_url` to poll. The `X-Job-Id` header carries the job id. Always handle both `200` and `202`. A `202` is not an error; it just means "still working, come back for it." *** ## Mode 2: Poll Send `Prefer: wait=0` to get a `202` immediately, then `GET` the job's `status_url` until it reaches a terminal state. ```bash cURL theme={"dark"} # 1. Start the job (returns 202 immediately) curl -i https://api.croma.run/co/policia/criminal-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -H "Prefer: wait=0" \ -d '{ "document_number": "1234567890" }' # 2. Poll the status_url from the response (or Location header) curl https://api.croma.run/jobs/run_abc123 \ -H "Authorization: Bearer $CROMA_API_KEY" ``` ```ts TypeScript theme={"dark"} // 1. Start the job const start = await fetch( "https://api.croma.run/co/policia/criminal-records/v1", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}`, "Content-Type": "application/json", Prefer: "wait=0", }, body: JSON.stringify({ document_number: "1234567890" }), }, ); const { job } = await start.json(); // 2. Poll until terminal async function poll(statusUrl: string) { while (true) { const res = await fetch(statusUrl, { headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}` }, }); const body = await res.json(); if (body.job.status === "completed") return body.data; if (["failed", "canceled", "expired"].includes(body.job.status)) { throw new Error(body.error?.message ?? body.job.status); } // honor Retry-After; defaults to 2s while running const wait = Number(res.headers.get("Retry-After") ?? 2) * 1000; await new Promise((r) => setTimeout(r, wait)); } } const data = await poll(job.status_url); ``` `GET /jobs/:id` always returns `200` with the [envelope](#the-job-envelope). While the job is still running it includes a `Retry-After` header (seconds); use it to pace your polling. Jobs are scoped to your organization; a job belonging to another org reads as `404`. *** ## Mode 3: Callback (webhook) Include a `callback_url` in the request body. You get a `202` right away, and Croma `POST`s the result to your URL once the job finishes, with no polling. ```bash cURL theme={"dark"} curl -i https://api.croma.run/co/policia/criminal-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890", "callback_url": "https://your-app.com/webhooks/croma" }' ``` ```ts TypeScript theme={"dark"} await fetch("https://api.croma.run/co/policia/criminal-records/v1", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ document_number: "1234567890", callback_url: "https://your-app.com/webhooks/croma", }), }); // → 202. The result arrives as a POST to your callback_url. ``` `callback_url` must be an absolute **HTTPS** URL on a public host (localhost and private ranges are rejected). When the job finishes, Croma sends a `POST` to it: * **Body**: the same [job envelope](#the-job-envelope) as the poll endpoint. * **`x-croma-job-id`**: the job id. * **`x-croma-signature`**: `sha256=`, an HMAC-SHA256 of the raw request body, so you can verify the payload's integrity. ```http theme={"dark"} POST /webhooks/croma HTTP/1.1 content-type: application/json x-croma-job-id: run_abc123 x-croma-signature: sha256=9f86d081… { "job": { "id": "run_abc123", "status": "completed", … }, "data": { … }, "error": null } ``` Signature verification uses a shared secret issued by Croma; reach out if you want it enabled for your callbacks. Respond `2xx` quickly; non-`2xx` responses are retried. *** ## The job envelope The `202` response, `GET /jobs/:id`, and the callback body all share one shape: ```json theme={"dark"} { "job": { "id": "run_abc123", "status": "completed", "endpoint": "/co/policia/criminal-records/v1", "created_at": "2026-06-01T01:04:55.045Z", "finished_at": "2026-06-01T01:05:39.809Z", "status_url": "https://api.croma.run/jobs/run_abc123" }, "data": { }, "error": null } ``` * **`data`** is populated only when `status` is `completed` (and matches the endpoint's normal `data` payload). Otherwise it's `null`. * **`error`** is populated only when the job has `failed`, as `{ "type", "code", "message" }`. ### Statuses | `status` | Terminal? | Meaning | | ----------- | --------- | ---------------------------------- | | `queued` | no | Accepted, waiting to run. | | `running` | no | In progress. | | `completed` | yes | Done. Read `data`. | | `failed` | yes | The job errored. Read `error`. | | `canceled` | yes | The run was canceled. | | `expired` | yes | The run expired before completing. | ## Headers reference | Header | Where | Meaning | | ---------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------- | | `Prefer: wait=N` | request | Seconds to wait inline before returning `202`. Clamped to 55. `wait=0` returns `202` immediately. | | `Preference-Applied: wait=N` | `200` response | Echoes the wait that was applied. | | `Location` | `202` response | The job's `status_url`. | | `Retry-After` | `202` / running poll | Suggested seconds before polling again. | | `X-Job-Id` | `202` / `200` response | The job id. | How failures and the `error` object work. # Authentication Source: https://docs.usecroma.com/authentication Where to create Croma API keys, how the bearer scheme works, how keys belong to your organization and environments, and what to do the moment a key leaks. ## Where to get a key Create and manage your API keys at [platform.usecroma.com](https://platform.usecroma.com). Sign in, open your organization, and generate a key from the API keys section. The full key is shown only once at creation, so copy it somewhere safe before leaving the page. Open the Croma platform to mint and manage your organization's keys. ## Bearer scheme Send your key in the `Authorization` header using the `Bearer` scheme: ```bash theme={"dark"} Authorization: Bearer croma_live_xxxxxxxxxxxxxxxxxxxx ``` ## Organization-scoped keys only Croma keys are minted for an **organization**, not an individual user. The API rejects personal keys with `401`: ```json theme={"dark"} { "error": { "type": "authentication_error", "code": "personal_api_key_not_allowed", "message": "Personal API keys are not allowed. Use an organization key." } } ``` This keeps usage, rate limits, and billing attributed to the org rather than whichever teammate happened to create the key. ## Key format Keys are issued branded as `croma__…`. For example, `croma_live_…` in production and `croma_test_…` elsewhere. The environment prefix tells you at a glance which deployment a key targets; never use a `test` key against production data or vice versa. A key grants full API access for its organization. Store it as a secret (environment variable / secrets manager), never commit it, and rotate it if exposed. ## Failed authentication Every authentication failure returns a `401` with an `authentication_error` envelope. The `code` field tells you what went wrong: | Code | What it means | How to fix | | ------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | | `invalid_api_key` | The `Authorization` header is missing or malformed, or the key was revoked or has expired. | Send a valid key as `Authorization: Bearer `, or issue a new one. | | `personal_api_key_not_allowed` | A personal key was used where only organization keys are accepted. | Use an organization-scoped key from [platform.usecroma.com](https://platform.usecroma.com). | How quotas are bucketed and surfaced in every response. # Batch requests Source: https://docs.usecroma.com/batch Resolve many lookups in one request with Croma batch endpoints: array inputs, per-item results, partial-failure semantics and the size limits that apply. Some lookups are naturally done in bulk: you have a list of radicados, cédulas, or NITs and want them all at once. Batch endpoints take an array of inputs, resolve them **concurrently** on Croma's side, and return one result per item, so you make a single call instead of looping. Batch is an addition, not a replacement. The single-item endpoint stays the simplest path for one lookup. Reach for batch when you have a list. ## Which endpoints support batch? | Source | Batch endpoint | | ------------------------------------------------------------- | --------------------------------------------------- | | [Rama Judicial](/guides/colombia/rama-judicial) (by radicado) | `POST /co/rama-judicial/cases-by-radicado/v1/batch` | More batch endpoints are rolling out. Each follows the exact shape on this page, so once you integrate one you've integrated them all. ## Request shape A batch body is always `{ "items": [ … ] }`, where each item is the **same body the single endpoint takes**. Send between **1 and 50** items. ```bash theme={"dark"} curl https://api.croma.run/co/rama-judicial/cases-by-radicado/v1/batch \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [ { "registration_number": "11001600001720180327700" }, { "registration_number": "05001310300120190012300" } ] }' ``` ## Response shape A batch always returns `200` with a `results` array (in the same order as your `items`) and a `summary`: ```json theme={"dark"} { "data": { "results": [ { "index": 0, "status": "completed", "cache_hit": false, "data": { "found": true, "registration_number": "11001600001720180327700", "primary_case": { }, "actions": [ ] } }, { "index": 1, "status": "error", "error": { "type": "upstream_error", "code": "rama_judicial_upstream", "message": "The Rama Judicial lookup could not be completed." } } ], "summary": { "total": 2, "completed": 1, "errors": 1, "cache_hits": 0 } } } ``` | Field | Meaning | | --------------------- | -------------------------------------------------------------------------------------------------------------- | | `results[].index` | 0-based position in your `items` array. Results are returned in input order. | | `results[].status` | `completed` or `error` for that item. | | `results[].data` | The single endpoint's normal `data` payload. Present when `status` is `completed`. | | `results[].cache_hit` | `true` when that item was served from cache. Present when `status` is `completed`. | | `results[].error` | `{ type, code, message }`, the same error shape the single endpoint returns. Present when `status` is `error`. | | `summary` | Counts across the batch: `total`, `completed`, `errors`, `cache_hits`. | ## Partial failure A single bad item never fails the whole batch. If one radicado's upstream lookup errors, that item comes back with `status: "error"` while the rest still resolve. Always iterate `results` and check each item's `status`. There are two distinct layers to handle: **Validation errors fail the whole request; upstream errors are per-item.** * A malformed item (for example a `registration_number` that isn't 20-25 digits) is rejected up front with a `400` and a `param` like `items.0.registration_number`. Nothing runs. * A well-formed item whose upstream lookup fails comes back inside `results` as `status: "error"`, with the batch itself still `200`. ```ts TypeScript theme={"dark"} const res = await fetch( "https://api.croma.run/co/rama-judicial/cases-by-radicado/v1/batch", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ items: [ { registration_number: "11001600001720180327700" }, { registration_number: "05001310300120190012300" }, ], }), }, ); if (res.status === 400) { // a malformed item; nothing ran. Fix it and resend. throw new Error("invalid batch body"); } const { data } = await res.json(); for (const item of data.results) { if (item.status === "completed") { handle(item.data); // your normal per-lookup logic } else { console.warn(`item ${item.index} failed:`, item.error.message); } } ``` ## Limits and behavior * **Up to 50 items** per request. More than that is rejected with a `400`. * **Each item counts as one request** against your quota. A 10-item batch consumes 10 from your [rate limit](/rate-limits), the same as 10 single calls, so a batch that would exceed your remaining quota returns `429`. * **Duplicates are deduped.** The same input twice in one batch is fetched once; both positions get the result. * **Cache is shared** with the single endpoint. An item you looked up recently (single or batch) comes back with `cache_hit: true`. How per-item quota and the `X-RateLimit-*` headers work. The error envelope and every error code. # Datasets Source: https://docs.usecroma.com/datasets How Croma dataset endpoints answer: the whole source, organized and kept up to date, queried in milliseconds, with as_of on every response. Some endpoints don't query the source when you call. They answer from a complete copy of it that Croma keeps up to date and organized for querying: these are **dataset endpoints**. The rest are [live lookups](/live-lookups). A dataset endpoint: * answers in milliseconds and never becomes an [async job](/async-jobs), * keeps answering when the source is down or in maintenance, * searches everything the source has published, not one record per call, * spends **1 credit** per request instead of the live 10 (see [Rate limits](/rate-limits)). ## `as_of` Every dataset-served response carries `as_of`: the data is current up to that moment. ```json theme={"dark"} { "data": { "as_of": "2026-09-07T05:12:44Z", "results": [] } } ``` Each dataset refreshes on its own schedule. If you need the source's answer as of this second, use a live endpoint where one exists. ## Which endpoints are dataset-served? | Source | Dataset-served | | --------------------------------------------------- | -------------------------------------- | | [SECOP](/guides/colombia/secop) | The search, profile and read endpoints | | [Imprenta Nacional](/guides/colombia/imprenta) | All endpoints | | [Función Pública](/guides/colombia/funcion-publica) | All endpoints | | [Rama Judicial](/guides/colombia/rama-judicial) | The court email directory | | [Superfinanciera](/guides/colombia/superfinanciera) | The regulations search and detail | | [CNSF](/guides/mexico/cnsf) | All endpoints | | [SCJN](/guides/mexico/scjn) | The tesis search and browse | | [OECE](/guides/peru/oece) | The process search and detail | | [Sunbiz](/guides/united-states/sunbiz) | All endpoints | | [SEC EDGAR](/guides/united-states/sec) | All endpoints | | [SEC Form ADV](/guides/united-states/iapd) | All endpoints | | [SEC Form 13F](/guides/united-states/sec-13f) | All endpoints | | [OFAC Sanctions](/guides/united-states/ofac) | All endpoints | | [CGU Sanctions](/guides/brazil/cgu) | All endpoints | | [PGFN](/guides/brazil/pgfn) | All endpoints | | [MTE (Lista Suja)](/guides/brazil/mte) | All endpoints | | [IBAMA Embargoes](/guides/brazil/ibama) | All endpoints | The **Dataset** pill in each guide and `served_from` in the [`/catalog`](https://api.croma.run/catalog) are always current. The other answer mode: the source itself, queried at request time. # Errors Source: https://docs.usecroma.com/errors The Croma API error envelope: how failures are shaped, every status code the API returns, stable error codes and how to branch on them safely in a client. ## Envelope Successful responses return `{ "data": … }`. Failures return an `error` object and a non-2xx HTTP status. Branch on the status code, not a body flag: ```json theme={"dark"} { "error": { "type": "invalid_request_error", "code": "invalid_param", "message": "String must contain at least 3 character(s)", "param": "name", "details": { "issues": [{ "path": "name", "message": "String must contain at least 3 character(s)" }] } } } ``` | Field | Notes | | --------- | ---------------------------------------------------------- | | `type` | Broad category (see below). | | `code` | Specific machine-readable code. Branch on this. | | `message` | Human-readable; safe to surface in UI. | | `param` | Offending field. Present on validation errors. | | `details` | Optional structured detail (e.g. all validation `issues`). | Responses from data endpoints also carry an `X-Request-Id` header; include it when reporting an issue. ## Types and codes | Status | `type` | `code` | Meaning | | ------ | ----------------------- | ------------------------------ | -------------------------------------------------------------------------------------- | | `400` | `invalid_request_error` | `invalid_param` | Body failed validation; see `param` / `details`. | | `400` | `invalid_request_error` | `too_many_results` | Query matched too many records to return. Narrow it. | | `401` | `authentication_error` | `invalid_api_key` | Missing or invalid key. | | `401` | `authentication_error` | `personal_api_key_not_allowed` | A personal key was used; org keys only. | | `404` | `not_found_error` | `endpoint_not_found` | No API endpoint at that path. See the [API Reference](/api-reference/overview). | | `404` | `not_found_error` | `job_not_found` | No [async job](/async-jobs) with that id in your organization. | | `405` | `invalid_request_error` | `method_not_allowed` | Wrong method. Data endpoints are `POST`. | | `402` | `billing_error` | `plan_limit_reached` | The plan's credits for this period are spent; see [Rate limits](/rate-limits#credits). | | `429` | `rate_limit_error` | `rate_limited` | Hourly ceiling exceeded; see [Rate limits](/rate-limits). | | `5xx` | `upstream_error` | `_upstream` | A government source failed or was unreachable. | | `500` | `api_error` | `internal_error` | Unexpected internal error. | Not every endpoint emits every code; each endpoint's reference page lists its own. A "no match" is never a `404`; it's a successful `200`: single-record lookups return `found: false`, and searches return an empty list. A `404` means the endpoint or job id itself doesn't exist. [Async lookups](/async-jobs) can fail as a **job** rather than an HTTP error. A failed job carries the same `error` object in the envelope, with `code: "job_failed"`. # Caixa (FGTS) Source: https://docs.usecroma.com/guides/brazil/caixa Brazil's FGTS regularity certificate (CRF) for any employer, by CNPJ: whether the company is up to date with the workers' severance fund, the certificate's number and validity, and what blocks it when it is not, from Caixa Econômica Federal. Caixa Econômica Federal runs the FGTS, the severance fund every Brazilian employer pays into each month, and certifies which employers are up to date with it. Brazilian law requires the certificate (Certificado de Regularidade do FGTS, CRF) to borrow from public banks, to bid in public tenders and to receive public funds, which makes it a standard check in credit and supplier onboarding. Send a CNPJ and get the employer's status: regular, with its current certificate, or irregular, with which body reports the impediment. Optionally the certificates it was issued over the last 24 months. `POST /br/caixa/fgts-certificate/v1` Returns an employer's FGTS status and its current certificate. | Field | Type | Notes | | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `document_number` | string | **Required.** **Required.** The company's CNPJ, with or without punctuation, e.g. `33.000.167/0001-01`. Companies only: a CPF is rejected. | | `include_history` | boolean | Optional. `true` to also get `history`, the certificates issued in the last 24 months. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/br/caixa/fgts-certificate/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "33.000.167/0001-01" }' ``` Returns `document_number`, `found`, `status` (`regular` or `irregular`), `status_label` (the verdict as the source words it), `impediments[]`, `company_name`, `certificate`, `history` (with `include_history`) and `checked_at` (ISO 8601, Brasília time). When `regular`, `certificate` is `{ number, valid_from, valid_until, address }`: the certificate's number, which anyone can check with Caixa, the day it was issued, the day it expires (30 days later), and the establishment's address as `{ street, number, complement, district, city, state, postal_code, full }`. When `irregular`, `certificate` is null and each `impediments[]` entry is `{ agency, message }`: `PGFN` when FGTS debt is enrolled with the Union's attorneys, `CAIXA` when the fund's operator reports it. Each `history[]` entry is `{ issued_on, valid_from, valid_until, number }`, newest first, covering the last 24 months. Entries from the early 2000s carry no number. A company can be `regular` while in judicial recovery or bankruptcy: the certificate speaks only to the FGTS. Its status shows in `company_name` (e.g. `EM RECUPERACAO JUDICIAL`). A CNPJ that is not registered as an employer answers `found: false`. The certificate is issued per company: a branch CNPJ returns the same number and validity as the head office, with its own address. Schemas, all response fields, and an interactive playground. # CGU Sanctions Source: https://docs.usecroma.com/guides/brazil/cgu Brazil's federal integrity registers: search every sanctioned company and person on CEIS, CNEP, CEAF, CEPIM and the leniency agreements by name, CNPJ or CPF, and read one sanction's full record. The Controladoria-Geral da União keeps Brazil's federal integrity registers, which every public buyer and most compliance teams check before dealing with a company: CEIS, the companies and people barred from public contracting by any federal, state or municipal body; CNEP, the companies punished under the Anti-Corruption Law (12.846/2013); CEAF, the federal civil servants expelled; CEPIM, the non-profits barred from federal transfers; and the leniency agreements companies signed with CGU. About 33,000 sanctions in all. One search across the five registers, by name, CNPJ or CPF, register, party type and the sanctioning body's state, brought up to date every day. A sanction CGU removes stops matching the same day. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search sanctions `POST /br/cgu/sanctions-search/v1` Dataset Searches the five registers by any combination of name, CNPJ or CPF, register, party type and the sanctioning body's state. | Field | Type | Notes | | ------------------------ | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in any of the party's names. Every word must match; no stemming. | | `document_number` | string | Optional. A CNPJ or CPF, with or without punctuation, e.g. `12.345.678/0001-90`. Exact match. Expelled servants' CPFs are published masked and cannot be searched this way. | | `list` | enum | Optional. `ceis`, `cnep`, `ceaf`, `cepim` or `leniency`. | | `party_type` | enum | Optional. `individual` or `company`. | | `sanctioning_body_state` | string | Optional. Two-letter state of the body that imposed the sanction, e.g. `SP`. Not the party's state. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/br/cgu/sanctions-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "construtora", "list": "ceis", "per_page": 10 }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `sanctions[]`, by name. A party with several sanctions has several. Every sanction carries `id` (the key, e.g. `ceis-72529`), `list` (`ceis`, `cnep`, `ceaf`, `cepim` or `leniency`), `sanction_code` (CGU's own code), `party_type` (`individual` or `company`), `document_type` (`cpf`, `cnpj` or `foreign`), `document` (a CNPJ in full, a CPF masked the way CGU masks it, `***.456.789-**`), `name`, `names[]` (every name the register gives the party), `sanction_type`, `start_date`, `end_date`, `publication_date`, `final_judgment_date`, `information_date` (all `yyyy-mm-dd`), `publication`, `publication_detail`, `scope`, `sanctioning_body`, `sanctioning_body_state` (the body's state, not the party's), `sanctioning_body_sphere` (`federal`, `state` or `municipal`), `legal_basis`, `process_number`, `information_source`, `notes`, `fine_amount` (reais, CNEP fines), `reason` (why a non-profit is barred), `public_servant` (`{ position, role, unit, act_number }`, CEAF only) and `agreement` (`{ status, terms, effects[] }`, leniency agreements only). Empty fields are `null`. Values stay in Portuguese, as CGU writes them. `query` matches every name the register gives the party (as sanctioned, as the sanctioning body reported it, and the company's registered and trade names), word by word and without stemming. `document_number` is an exact match on a CNPJ or a CPF; CPFs come back masked. Brought up to date daily. A sanction on the register is in force: CGU removes one when it ends, and it stops matching here the same day. A past `end_date` does not mean it has ended; a declaration of unfitness, for one, lasts until the company is rehabilitated. ## One sanction `POST /br/cgu/sanction/v1` Dataset Resolves one sanction by its id and returns the full record. | Field | Type | Notes | | ----- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | | `id` | string | **Required.** The sanction's id, the register and CGU's code joined by a hyphen, e.g. `ceis-72529`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/br/cgu/sanction/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "id": "ceis-72529" }' ``` Returns `found`, `id`, `as_of` and `sanction` (null when not found). Every sanction carries `id` (the key, e.g. `ceis-72529`), `list` (`ceis`, `cnep`, `ceaf`, `cepim` or `leniency`), `sanction_code` (CGU's own code), `party_type` (`individual` or `company`), `document_type` (`cpf`, `cnpj` or `foreign`), `document` (a CNPJ in full, a CPF masked the way CGU masks it, `***.456.789-**`), `name`, `names[]` (every name the register gives the party), `sanction_type`, `start_date`, `end_date`, `publication_date`, `final_judgment_date`, `information_date` (all `yyyy-mm-dd`), `publication`, `publication_detail`, `scope`, `sanctioning_body`, `sanctioning_body_state` (the body's state, not the party's), `sanctioning_body_sphere` (`federal`, `state` or `municipal`), `legal_basis`, `process_number`, `information_source`, `notes`, `fine_amount` (reais, CNEP fines), `reason` (why a non-profit is barred), `public_servant` (`{ position, role, unit, act_number }`, CEAF only) and `agreement` (`{ status, terms, effects[] }`, leniency agreements only). Empty fields are `null`. Values stay in Portuguese, as CGU writes them. An id no register carries returns `found: false` with HTTP 200, not an error. That is also the answer for a sanction CGU has removed. Schemas, all response fields, and an interactive playground. # DJEN Source: https://docs.usecroma.com/guides/brazil/djen Brazil's national court publications: search every intimação, citação and edital the courts publish through the CNJ's Diário de Justiça Eletrônico Nacional by party, lawyer, OAB number, case number, court, text and date, with the full text. Every publication the Brazilian courts issue through the Conselho Nacional de Justiça's national platform: intimações, citações, editais and listas de distribuição from the state, federal, labour, electoral and military courts and from the superior courts (STJ, TST, STM, TSE), with the full text, the judicial body, the CNJ case number and the parties and lawyers each one is addressed to. Coverage starts in 2020 and grows court by court: the federal courts from late 2020, TJMG from 2023, TJRJ, TRT2 and STJ from 2024 and TJSP from April 2025. STF publishes its own diário and is not included. One search, filtered by party name, lawyer name or OAB number, case number, court, free text and availability date, newest first. At least one of party, lawyer, OAB number, case number, court or text is required. `POST /br/djen/publications-search/v1` At least one of `party_name`, `lawyer_name`, `oab_number`, `registration_number`, `court_code` or `query` is required. | Field | Type | Notes | | --------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | `party_name` | string | A party's name as printed on the publication, e.g. `BANCO DO BRASIL`. Whole words, any case or accents; send the bare name without `S.A.`. | | `lawyer_name` | string | A lawyer's name as printed on the publication. Same matching as `party_name`. | | `oab_number` | string | OAB registration number, digits only, e.g. `123456`. Works alone; add `oab_state` to narrow it. | | `oab_state` | string | Two-letter state of the OAB registration, e.g. `SP`. | | `registration_number` | string | The CNJ case number: 20 digits or the mask `NNNNNNN-DD.AAAA.J.TR.OOOO`, e.g. `0001234-56.2026.8.26.0100`. | | `court_code` | string | Court alias, e.g. `TJSP`, `TRT2`, `TRF1`, `STJ`, `TST`; electoral courts are hyphenated, `TRE-SP`. Any case. The full list is at the end of this page. | | `query` | string | Free text matched against the body of the publication. | | `from_date` | string | First availability date, `yyyy-mm-dd`. Empty means no lower bound. | | `to_date` | string | Last availability date, `yyyy-mm-dd`. Equal to `from_date` for one day, which counts and pages in full. | | `medium` | enum | `diario` (Diário de Justiça Eletrônico Nacional), `edital` (Plataforma Nacional de Editais) or `any`. Default `any`. | | `page` | integer | 1-based page. Default `1`. | | `per_page` | integer | 6-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/br/djen/publications-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "party_name": "BANCO DO BRASIL", "court_code": "TJSP", "from_date": "2026-09-09", "to_date": "2026-09-09", "per_page": 10 }' ``` Returns `total`, `total_is_lower_bound`, `count`, `page`, `per_page`, `publications[]` (newest availability date first) and `checked_at`. | Field | Notes | | -------------------------- | ---------------------------------------------------------------------------------- | | `id` | The DJEN's id for the publication. | | `available_on` | `yyyy-mm-dd` the publication became available (data de disponibilização). | | `court_code` | Court alias, e.g. `TJSP`. | | `judicial_body` | The vara, turma or câmara that issued it. | | `communication_type` | `Intimação`, `Citação`, `Edital` or `Lista de distribuição`. | | `document_type` | The court's own label, e.g. `Ato ordinatório`, `DESPACHO/DECISÃO`. | | `medium` | `diario` or `edital`. | | `registration_number` | The CNJ case number, 20 digits; `registration_number_formatted` carries the mask. | | `class_name`, `class_code` | Procedural class and its CNJ code. | | `source_url` | Link to the case in the court's own system, when the court provides one. | | `text` | The full text of the publication, as plain text. | | `parties[]` | `{ name, pole }`, `pole` `A` for the claimant side and `P` for the defendant side. | | `lawyers[]` | `{ name, oab_number, oab_state }`; empty on most editais. | `total` is exact when `from_date` and `to_date` name the same day. For a wider range, or no dates, the DJEN stops counting and paging at 10,000 publications: `total_is_lower_bound` is then `true`, and a page past that window is refused with HTTP 400. To read everything about a busy name, query one day at a time. `available_on` is the date the publication became available. Under the Brazilian Code of Civil Procedure the publication date is the next business day and procedural deadlines start on the business day after that; count them from `available_on` with a court calendar, not with plain day arithmetic. Court codes accepted by `court_code`: `CJF`, `CNJ`, `PJeCor`, `SEEU`, `STJ`, `STM`, `TJAC`, `TJAL`, `TJAM`, `TJAP`, `TJBA`, `TJCE`, `TJDFT`, `TJES`, `TJGO`, `TJMA`, `TJMG`, `TJMMG`, `TJMRS`, `TJMS`, `TJMSP`, `TJMT`, `TJPA`, `TJPB`, `TJPE`, `TJPI`, `TJPR`, `TJRJ`, `TJRN`, `TJRO`, `TJRR`, `TJRS`, `TJSC`, `TJSE`, `TJSP`, `TJTO`, `TRE-AC`, `TRE-AL`, `TRE-AM`, `TRE-AP`, `TRE-BA`, `TRE-CE`, `TRE-DF`, `TRE-ES`, `TRE-GO`, `TRE-MA`, `TRE-MG`, `TRE-MS`, `TRE-MT`, `TRE-PA`, `TRE-PE`, `TRE-PI`, `TRE-PR`, `TRE-RJ`, `TRE-RN`, `TRE-RO`, `TRE-RS`, `TRE-SC`, `TRE-SE`, `TRE-SP`, `TRE-TO`, `TRF1`, `TRF2`, `TRF3`, `TRF4`, `TRF5`, `TRF6`, `TRT1`, `TRT2`, `TRT3`, `TRT4`, `TRT5`, `TRT6`, `TRT7`, `TRT8`, `TRT9`, `TRT10`, `TRT11`, `TRT12`, `TRT13`, `TRT14`, `TRT15`, `TRT16`, `TRT17`, `TRT18`, `TRT19`, `TRT20`, `TRT21`, `TRT22`, `TRT23`, `TRT24`, `TSE`, `TST`. Schemas, all response fields, and an interactive playground. # IBAMA (embargoes) Source: https://docs.usecroma.com/guides/brazil/ibama Every environmental embargo IBAMA has imposed since 1987, by CPF, CNPJ, name, property or place: the embargoed area in hectares, the infraction, and whether it is active, lifted or cancelled, updated daily. IBAMA, Brazil's federal environmental agency, embargoes land and activities where it finds illegal deforestation, burning or other environmental infractions, and publishes every embargo with its holder. The rural-credit rules forbid lending on an embargoed area, so banks and agribusiness lenders screen borrowers and properties against it. Search by CPF or CNPJ (or a CNPJ's root, for every branch), by name or property, by state or municipality, and get each embargo with its area, place, infraction and status. The search also says how many of the matches are active. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search embargoes `POST /br/ibama/embargoes-search/v1` Dataset Finds embargoes by document, name, place, status or date. | Field | Type | Notes | | ------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in the embargoed party's name or the property's name, e.g. `fazenda`. Every word must match. | | `document_number` | string | Optional. A CPF or CNPJ, with or without punctuation, matched exactly; or a CNPJ's first 8 characters to match every branch. | | `status` | enum | Optional. `active`, `lifted` or `cancelled`; any by default. | | `state` | string | Optional. Two-letter state of the embargoed place, e.g. `PA`. | | `municipality_code` | string | Optional. The municipality's 7-digit IBGE code, e.g. `1500602`. | | `term_number` | string | Optional. The embargo term's number, exact. | | `from_date` | string | Optional. Embargoes imposed on or after this date, `yyyy-mm-dd`. | | `to_date` | string | Optional. Embargoes imposed on or before this date, `yyyy-mm-dd`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/br/ibama/embargoes-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "state": "PA", "status": "active", "per_page": 5 }' ``` Each embargo is `{ id, term_number, term_series, status, record_status, embargo_date, lift_type, lift_date, lift_reason, name, party_type, document_type, document, process_number, infraction_notice_number, description, state, municipality_code, municipality, location, property_name, latitude, longitude, area_ha, area_type, last_changed_at }`. * `status`: `active` (in force), `lifted` (with `lift_type` `administrative`, `judicial` or `pra`, and `lift_date`) or `cancelled`. This is IBAMA's own flag. * `document`: a CNPJ in full; a CPF masked (`***.456.789-**`). A CPF written inside a name or a description is masked too. * `area_ha`: the embargoed area in hectares, when IBAMA measured one; `latitude` and `longitude` when IBAMA recorded a point in Brazil. The search also returns `active`: how many of the matching embargoes are in force, so a single call by CPF or CNPJ answers whether a person or company has an active embargo. The data keeps lifted and cancelled embargoes as well as active ones, back to 1987. Filter with `status: "active"` for what is in force today. ## One embargo `POST /br/ibama/embargo/v1` Dataset Returns one embargo by its id. | Field | Type | Notes | | ----- | ------ | ------------------------------------------------------------------------- | | `id` | string | **Required.** **Required.** The embargo's `id`, as the search returns it. | ```bash theme={"dark"} curl https://api.croma.run/br/ibama/embargo/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "id": "1234567" }' ``` Each embargo is `{ id, term_number, term_series, status, record_status, embargo_date, lift_type, lift_date, lift_reason, name, party_type, document_type, document, process_number, infraction_notice_number, description, state, municipality_code, municipality, location, property_name, latitude, longitude, area_ha, area_type, last_changed_at }`. * `status`: `active` (in force), `lifted` (with `lift_type` `administrative`, `judicial` or `pra`, and `lift_date`) or `cancelled`. This is IBAMA's own flag. * `document`: a CNPJ in full; a CPF masked (`***.456.789-**`). A CPF written inside a name or a description is masked too. * `area_ha`: the embargoed area in hectares, when IBAMA measured one; `latitude` and `longitude` when IBAMA recorded a point in Brazil. The search also returns `active`: how many of the matching embargoes are in force, so a single call by CPF or CNPJ answers whether a person or company has an active embargo. The data keeps lifted and cancelled embargoes as well as active ones, back to 1987. Filter with `status: "active"` for what is in force today. Schemas, all response fields, and an interactive playground. # MTE (slave labour register) Source: https://docs.usecroma.com/guides/brazil/mte Brazil's register of employers caught keeping workers in conditions analogous to slavery (the "Lista Suja"), and the register of employers under a conduct-adjustment agreement, searchable by CNPJ, CPF, name, state and year, updated daily. Brazil's labour ministry publishes the employers its inspectors caught keeping workers in conditions analogous to slavery, once the administrative case is final, and keeps each one listed for two years. Central bank rules bar rural credit to anyone on it, and banks screen against it for ESG and KYC. A second register lists the employers who signed a conduct-adjustment agreement instead. Search both by CNPJ (or its root, for every branch), CPF, name, state or year of the inspection, and get each listing with the establishment, the workers found, the activity and every period it has been on the register. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search the register `POST /br/mte/slave-labour-search/v1` Dataset Finds employers on the registers by document, name, state or year. | Field | Type | Notes | | ----------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in the employer's name or the establishment, e.g. `fazenda`. Every word must match. | | `document_number` | string | Optional. A CNPJ or CPF, with or without punctuation, matched exactly; or a CNPJ's first 8 characters to match every branch. | | `list` | enum | Optional. `slave_labour` or `conduct_adjustment`; both by default. | | `party_type` | enum | Optional. `individual` (listed by CPF) or `company` (by CNPJ). | | `state` | string | Optional. Two-letter state of the inspection, e.g. `PA`. | | `inspection_year` | integer | Optional. Year of the inspection, e.g. `2024`. Default `0`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/br/mte/slave-labour-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "fazenda" }' ``` Each employer is `{ id, list, party_type, document_type, document, employer_name, establishment, state, inspection_year, workers_involved, cnae, final_decision_date, listed_on, listing_history[], court_order, conduct_adjustment_on, agreement_url }`. * `list`: `slave_labour` (the register of employers caught keeping workers in conditions analogous to slavery) or `conduct_adjustment` (employers who signed a conduct-adjustment agreement instead, and leave the first register). * `document`: a CNPJ in full; a CPF masked (`***.456.789-**`). A CPF written inside a name is masked too. * `listed_on`: when the current listing started; `listing_history[]` is every period on the register, `{ from, to }`, since a court can suspend a listing and it can return. * `court_order`: the court decision that put the employer on the register, when a court did. An employer stays on the register for two years. When one leaves, it leaves the data the same day: a search by its document then answers `total: 0`, and its id answers `found: false`. ## One listing `POST /br/mte/employer/v1` Dataset Returns one listing by its id. | Field | Type | Notes | | ----- | ------ | ------------------------------------------------------------------------- | | `id` | string | **Required.** **Required.** The listing's `id`, as the search returns it. | ```bash theme={"dark"} curl https://api.croma.run/br/mte/employer/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "id": "slave_labour-3f9a0c12d4e5b6a7" }' ``` Each employer is `{ id, list, party_type, document_type, document, employer_name, establishment, state, inspection_year, workers_involved, cnae, final_decision_date, listed_on, listing_history[], court_order, conduct_adjustment_on, agreement_url }`. * `list`: `slave_labour` (the register of employers caught keeping workers in conditions analogous to slavery) or `conduct_adjustment` (employers who signed a conduct-adjustment agreement instead, and leave the first register). * `document`: a CNPJ in full; a CPF masked (`***.456.789-**`). A CPF written inside a name is masked too. * `listed_on`: when the current listing started; `listing_history[]` is every period on the register, `{ from, to }`, since a court can suspend a listing and it can return. * `court_order`: the court decision that put the employer on the register, when a court did. An employer stays on the register for two years. When one leaves, it leaves the data the same day: a search by its document then answers `total: 0`, and its id answers `found: false`. Schemas, all response fields, and an interactive playground. # PGFN Source: https://docs.usecroma.com/guides/brazil/pgfn What Brazilian companies owe the Union: search every active federal tax, social security and FGTS debt in the dívida ativa by CNPJ, name, state, status and amount, and total one company's debts. The Procuradoria-Geral da Fazenda Nacional inscribes in the dívida ativa every federal debt a company has not paid: taxes such as IRPJ, COFINS, PIS and the Simples Nacional, social security contributions, and the FGTS. Each debt comes with its status (in collection, negotiated, guaranteed, suspended by a court), whether it is being enforced in court, and its consolidated amount. These inscriptions are public by law (CTN art. 198 §3 II). Companies only: about 33 million debts, refreshed each time PGFN publishes a quarterly release. Search across them, or look one company up by CNPJ, or by its 8-character root for every establishment, and get what it owes in total. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search debts `POST /br/pgfn/debts-search/v1` Dataset Searches every company debt by any combination of name, CNPJ or root, regime, state, status, role, court and amount. | Field | Type | Notes | | ----------------- | ------- | ------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in the company's name; no stemming. | | `document_number` | string | Optional. A CNPJ, with or without punctuation, or its 8-character root for every establishment. | | `regime` | enum | Optional. `nao_previdenciario`, `previdenciario` or `fgts`. | | `state` | string | Optional. The company's state, e.g. `SP`. | | `status_type` | enum | Optional. `in_collection`, `tax_benefit`, `guaranteed`, `suspended_by_court` or `in_negotiation`. | | `debtor_type` | enum | Optional. `principal`, `co_responsible` or `joint`. | | `in_court` | enum | Optional. `yes`, `no` or `any`. Default `any`. | | `amount_min` | number | Optional. Minimum amount in reais. Default `0`. | | `amount_max` | number | Optional. Maximum amount in reais; `0` for none. Default `0`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/br/pgfn/debts-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "construtora", "in_court": "yes", "per_page": 10 }' ``` Returns `as_of` (how current the data is), the applied filters, `total`, `page`, `per_page`, `total_pages`, `count` and `debts[]`, largest amount first. Every debt carries `regime` (`nao_previdenciario`, `previdenciario` or `fgts`), `inscription_number`, `document_number` (the CNPJ, 14 characters), `document` (`12.345.678/0001-90`), `cnpj_root`, `debtor_name`, `debtor_type` (`principal`, `co_responsible` or `joint`), `state`, `responsible_unit`, `registering_unit` (FGTS), `collecting_entity` (`pgfn` or `caixa`), `status_type` (`in_collection`, `tax_benefit`, `guaranteed`, `suspended_by_court` or `in_negotiation`), `status` (PGFN's detailed wording), `revenue_type`, `registered_on` (`yyyy-mm-dd`), `in_court`, `amount` (reais, consolidated with legal charges) and `reference_month` (`yyyy-mm` of the release). An inscription with several debtors has a row for each, and every row carries the whole inscription's `amount`. Add up `principal` rows only; the debtor lookup below does that for you. ## One company's debts `POST /br/pgfn/debtor/v1` Dataset Totals what one company owes the Union, by CNPJ or by root. | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------------------------------------------------------- | | `document_number` | string | **Required.** A CNPJ, e.g. `33.000.167/0001-01`, or its 8-character root, e.g. `33000167`, to add up every establishment. | ```bash theme={"dark"} curl https://api.croma.run/br/pgfn/debtor/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "33.000.167/0001-01" }' ``` Returns `found`, `document_number`, `as_of`, `reference_month`, `debtor_name`, `totals` and `debts[]` (the 50 largest). `totals` carries `debts` (every debt the company appears on), `principal_debts`, `principal_amount` (what the company owes as principal debtor, in reais), `in_court_amount`, `by_regime` (`{ debts, amount }` for each regime) and `complete` (false when the company has more than 10,000 debts and only the largest were summed). Co-responsible and joint debts count in `debts` but not in the amounts, since they repeat another debtor's amount. A company that owes the Union nothing PGFN has inscribed returns `found: false` with HTTP 200, not an error. Schemas, all response fields, and an interactive playground. # TST Source: https://docs.usecroma.com/guides/brazil/tst Brazil's labour-debt certificate (CNDT) for any company, by CNPJ: whether it owes labour debts, whether they are secured or suspended, and the cases behind them, issued live by the Tribunal Superior do Trabalho. The Tribunal Superior do Trabalho keeps the national register of labour debtors, fed by the 24 regional labour courts, and issues from it the Certidão Negativa de Débitos Trabalhistas (CNDT). Brazilian law requires it in public tenders, and it is the standard check on whether a company pays what the labour courts ordered. One certificate covers every establishment of the company. Send a CNPJ and get a new certificate: clear, with debts, or with debts that are all secured or suspended, each case with its court and whether the debt is secured, and the official PDF if you want it. `POST /br/tst/labour-certificate/v1` Issues a new certificate for a company and returns what it says. | Field | Type | Notes | | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `document_number` | string | **Required.** **Required.** The company's CNPJ, with or without punctuation, e.g. `33.000.167/0001-01`. Companies only: a CPF is rejected. | | `include_pdf` | boolean | Optional. `true` to also get `pdf_url`, a link to the official certificate PDF. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/br/tst/labour-certificate/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "33.000.167/0001-01" }' ``` Returns `document_number`, `status` (`clear`, `debts` or `debts_secured`), `has_clearance_effect`, `status_label` (the certificate's title), `certificate_number` (e.g. `75794208/2026`), `issued_at` (ISO 8601, Brasília time), `valid_until` (`yyyy-mm-dd`, 180 days after issue), `company_name` (null when the certificate is issued without one), `total_cases`, `cases[]`, `pdf_url` (with `include_pdf`) and `checked_at`. Each `cases[]` entry is `{ case_number, court, region, office, debt_condition }`: the CNJ case number, the regional labour court (`TRT 01ª Região`), its number, the labour court (vara) when the certificate names it, and `unsecured`, `secured` (by a deposit, a freeze or an attachment of enough assets) or `suspended`. `debts_secured` is the certificate the court titles *positiva com efeito de negativa*: the company has labour debts, but every one is secured or suspended, so the certificate has the legal effect of a clearance, which is what `has_clearance_effect` says. Every valid CNPJ gets a certificate: there is no not-found. Each request issues a new certificate from the court, with its own number, valid for 180 days. This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # ADRES (BDUA) Source: https://docs.usecroma.com/guides/colombia/adres Query a person's affiliation to Colombia's health system by document: EPS, regime and status from the BDUA database kept by ADRES, in a single lookup. Looks up a person's affiliation to the Colombian health system (Sistema General de Seguridad Social en Salud) in the Base de Datos Única de Afiliados (BDUA), from ADRES. `POST /co/adres/affiliation-status/v1` | Field | Type | Notes | | ----------------- | ------ | ----------------------------------------------------------------------------------------------------- | | `document_type` | enum | Colombian document type (`CC`, `TI`, `CE`, `RC`, `PA`, `PEP`, `PPT`). Defaults to `CC`. Default `CC`. | | `document_number` | string | **Required.** 3-30 chars. | ```bash theme={"dark"} curl https://api.croma.run/co/adres/affiliation-status/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_type": "CC", "document_number": "1234567890" }' ``` The response reports the registered identity and every affiliation on record: | Field | Notes | | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `found` | `false` when the document is not registered in BDUA; identity fields are then `null` and `affiliations` is empty. | | `full_name` | Registered names and surnames, or `null` when not found. | | `department` / `municipality` | Registered location. | | `affiliations[]` | One entry per reported affiliation: `entity` (the EPS), `regime` (`CONTRIBUTIVO`/`SUBSIDIADO`), `status`, `effective_date`, `termination_date`, and `affiliate_type`. | A `termination_date` of `31/12/2999` means the affiliation is still active with that entity. Affiliation data reflects what the EPS reports to ADRES. This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. The accepted `document_type` values are enumerated in the API reference. Schemas, all response fields, and an interactive playground. # ANCP-CCE Source: https://docs.usecroma.com/guides/colombia/ancp-cce Search ~3,800 doctrinal opinions (conceptos) on Colombian public procurement from the ANCP-CCE Relatoría by text or topic, and read any concepto in full. Doctrinal legal opinions (conceptos) on public procurement from the Relatoría de la ANCP-CCE (Colombia Compra Eficiente): \~3,800 conceptos, searchable by free text or by topic, with a topical index. Search first, then read one concepto in full. ## Search conceptos `POST /co/ancp-cce/conceptos-search/v1` | Field | Type | Notes | | ---------------- | ------- | --------------------------------------------------------------------- | | `query` | string | Optional free text. | | `subject` | string | Optional descriptor (topic) to filter by. | | `modified_after` | string | Optional `YYYY-MM-DD`. Only conceptos modified on or after this date. | | `page` | integer | 1-1000. Default `1`. | | `per_page` | integer | 1-100. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/ancp-cce/conceptos-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "capacidad jurídica" }' ``` Returns `query`, `subject`, `total`, `total_pages`, `page`, `per_page`, `count`, and `results`. | Field | Notes | | ------------------ | ---------------------------------------------------- | | `number` | Concepto number, e.g. `C-1094 de 2026`. | | `id` | Numeric id. Pass it (or `slug`) to the lookup below. | | `slug` | URL-friendly identifier, e.g. `c-1094-de-2026`. | | `publication_date` | Issue date. | | `modified_date` | Last modification date. | | `url` | Permalink to the concepto. | | `subjects` | Topics (temas) the concepto is indexed under. | | `subtopics` | Subtopics (subtemas) under each topic. | ## One concepto `POST /co/ancp-cce/concepto/v1` | Field | Type | Notes | | ------------ | ------ | --------------------------------------------------------------------------------------- | | `identifier` | string | **Required.** The numeric `id` or the `slug` (e.g. `c-1094-de-2026`) from a search row. | ```bash theme={"dark"} curl https://api.croma.run/co/ancp-cce/concepto/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "identifier": "c-1094-de-2026" }' ``` Returns the full doctrinal text of the concepto (`text`), plus `publication_date`, `subjects`, and `subtopics`. Schemas, all response fields, and an interactive playground. # CNDJ Source: https://docs.usecroma.com/guides/colombia/cndj Search ~18,000 disciplinary rulings against Colombian judges and lawyers from the CNDJ Relatoría by text, magistrate, topic or year, and read any in full. Disciplinary rulings against judges and lawyers from the Relatoría de la Comisión Nacional de Disciplina Judicial (CNDJ): \~18,000 rulings, searchable by text, magistrate, topic, party, matter, or year. Search first, then read one ruling in full. ## Search rulings `POST /co/cndj/rulings-search/v1` At least one search criterion is required. | Field | Type | Notes | | ----------------- | ------- | -------------------------------- | | `query` | string | Free text. | | `reporting_judge` | string | Reporting magistrate. | | `subject` | string | Topic. | | `respondent` | string | Party subject to the proceeding. | | `matter` | string | Matter. | | `subtopic` | string | Subtopic. | | `year` | string | 4-digit year. | | `limit` | integer | 1-100. Default `25`. | ```bash theme={"dark"} curl https://api.croma.run/co/cndj/rulings-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "prescripción", "limit": 25 }' ``` Returns `total`, `count`, and the matching rows. | Field | Notes | | ---------------------- | ------------------------------------------------------------------------ | | `numero_unico` | 23-digit case number. Pass it (with `numero_ficha`) to the lookup below. | | `numero_ficha` | Record key for the ruling. | | `magistrado_ponente` | Reporting magistrate. | | `contenido_radicacion` | The matter under review. | | `decision` | The ruling's decision. | | `fecha` | Ruling date. | ## One ruling `POST /co/cndj/ruling/v1` | Field | Type | Notes | | --------------------- | ------- | ----------------------------------------------------- | | `registration_number` | string | **Required.** 23-digit case number from a search row. | | `ficha_number` | integer | **Required.** Record key from a search row. | ```bash theme={"dark"} curl https://api.croma.run/co/cndj/ruling/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "registration_number": "11001010200020200012300", "ficha_number": 12345 }' ``` Returns the editorial fields for the ruling, plus a link to the document and its full text when available. | Field | Notes | | -------------------------- | ------------------------------------------------------------ | | `titulacion` | Editorial title. | | `descriptores` | Topics. | | `fuentes_normativas` | Legal sources cited. | | `salvamentos_aclaraciones` | Dissenting and concurring opinions. | | `pdf_url` | Link to the ruling document. | | `texto` | Extracted full text, when the document carries a text layer. | Schemas, all response fields, and an interactive playground. # Consejo de Estado Source: https://docs.usecroma.com/guides/colombia/consejo-estado Search the historical administrative case-law of Colombia's Consejo de Estado by text and filters, and read any providencia issued before 2022 in full. Historical administrative case-law from the Relatoría del Consejo de Estado (the traditional Relatoría, broadly covering providencias before December 2021). Search first, then read one providencia in full. For December 2021 onward, cross-reference the [SAMAI](/guides/colombia/samai) page. Both endpoints below run as [async jobs](/async-jobs), because this source can be slow to respond. By default the request waits inline and returns `{ data }`. If you'd rather not hold the connection open, send `Prefer: wait=N` to cap the inline wait, include a `callback_url` in the body, or poll `GET /jobs/{id}`. ## Search providencias `POST /co/consejo-estado/search/v1` Narrowing by section plus a date window keeps results relevant. | Field | Type | Notes | | --------------------- | ------- | -------------------------------------------- | | `section` | string | Sala/section label. `""` means all sections. | | `type` | enum | `AUTO`, `CONCEPTO`, or `SENTENCIA`. | | `registration_number` | string | Radicado. | | `reporting_judge` | string | Reporting magistrate. | | `plaintiff` | string | Claimant. | | `defendant` | string | Respondent. | | `statute` | string | Challenged rule. | | `from_date` | string | `YYYY-MM-DD`. Start of the date window. | | `to_date` | string | `YYYY-MM-DD`. End of the date window. | | `page` | integer | 1-1000. Default `1`. | | `per_page` | integer | 1-20. Default `5`. | ```bash theme={"dark"} curl https://api.croma.run/co/consejo-estado/search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "section": "SECCION TERCERA", "type": "SENTENCIA", "from_date": "2020-01-01", "to_date": "2020-12-31" }' ``` Returns `total`, `count`, and the matching rows. | Field | Notes | | ----------------- | ----------------------------------------------- | | `radicado` | Process number. | | `tipo` | `AUTO`, `CONCEPTO`, or `SENTENCIA`. | | `seccion` | Sala/section. | | `fecha` | Providencia date. | | `ponente` | Reporting magistrate. | | `demandante` | Claimant. | | `demandado` | Respondent. | | `norma_demandada` | Challenged rule. | | `descriptores` | Topics. | | `es_unificacion` | Whether it is a unification ruling. | | `es_extension` | Whether it extends jurisprudence. | | `url` | Content permalink. Pass it to the lookup below. | ## One providencia `POST /co/consejo-estado/providencia/v1` | Field | Type | Notes | | ----- | ------ | -------------------------------------------------------------- | | `url` | string | **Required.** The content permalink (`url`) from a search row. | ```bash theme={"dark"} curl https://api.croma.run/co/consejo-estado/providencia/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://servicios.consejodeestado.gov.co/WebRelatoria/FileReferenceServlet?corp=ce&ext=html&file=233679" }' ``` Returns the full text of the providencia. Schemas, all response fields, and an interactive playground. # Contaduría Source: https://docs.usecroma.com/guides/colombia/contaduria Check whether a person or company is listed as a delinquent debtor to the Colombian State in the Contaduría's Boletín de Deudores Morosos, by document. Checks whether a person or entity is a delinquent debtor to the Colombian State, from the Contaduría General de la Nación's register (Boletín de Deudores Morosos del Estado). `POST /co/contaduria/state-delinquent-debtors/v1` | Field | Type | Notes | | ----------------- | ------ | ----------------------------------------------------------------------------------- | | `document_type` | enum | Colombian document type (`CC`, `NIT`, `TI`, `CE`, `PA`, `RC`, `PPT`). Default `CC`. | | `document_number` | string | **Required.** 3-30 chars. | ```bash theme={"dark"} curl https://api.croma.run/co/contaduria/state-delinquent-debtors/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890" }' ``` The response returns two verdicts, each with the source's verbatim wording: | Field | Notes | | ------------------------- | ---------------------------------------------------------------------------------- | | `reported` | Headline verdict: `true` if reported under either law, `false` when clean. | | `deudor_moroso` | Deuda morosa con el Estado (Ley 901 de 2004), as `{ reported, message }`. | | `incumplimiento_acuerdos` | Incumplimiento de acuerdos de pago (Ley 1066 de 2006), as `{ reported, message }`. | | `checked_at` | Consultation timestamp (ISO 8601, UTC), or `null` if absent. | This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. The accepted `document_type` values are enumerated in the API reference. Schemas, all response fields, and an interactive playground. # Contraloría Source: https://docs.usecroma.com/guides/colombia/contraloria Check whether a person or entity is reported as a responsable fiscal in the Contraloría's SIBOR boletín, the record behind the antecedentes certificate. Resolves the "Certificado de Antecedentes de Responsabilidad Fiscal" from the Contraloría General de la República: a check against SIBOR (Sistema de Información del Boletín de Responsables Fiscales), the registry of people found fiscally responsible for damage to public funds. Croma returns its verdict as structured data. `POST /co/contraloria/fiscal-records/v1` | Field | Type | Notes | | ----------------- | ------ | -------------------------------------------------------------------- | | `document_type` | enum | Optional. One of `CC`, `CE`, `TI`, `PA`, `PEP`, `PPT`. Default `CC`. | | `document_number` | string | **Required.** Document number (3-30 alphanumeric characters). | ```bash theme={"dark"} curl https://api.croma.run/co/contraloria/fiscal-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890" }' ``` This lookup is slower than the others (typically tens of seconds) while the certificate is generated on demand. ## Response | Field | Notes | | -------------------------------------- | -------------------------------------------------------------------------------------------------------- | | `found` | `true` when a certificate was issued (SIBOR certifies any valid lookup). | | `document_type`, `document_type_label` | The queried type and its Spanish label. | | `document_number` | The queried document. | | `is_fiscal_responsible` | `true` when reported as a responsable fiscal; `false` for the clean "NO SE ENCUENTRA REPORTADO" verdict. | | `verification_code` | Código de Verificación (document + `yymmddhhmmss`), to re-verify the official certificate. | | `certified_at` | Certificate timestamp (ISO, local Colombia time) derived from the verification code. | | `status` | Verbatim CERTIFICA sentence from the certificate. | | `message` | Full plain-text certificate body, for audit/display. | The clean result is `is_fiscal_responsible: false`. The Boletín only lists people declared fiscally responsible, so any document not on it certifies as not reported. Use `verification_code` to confirm the certificate's authenticity with the Contraloría. Schemas, all response fields, and an interactive playground. # DIAN Source: https://docs.usecroma.com/guides/colombia/dian Validate a Colombian electronic invoice by CUFE and NIT against DIAN's registry, and search DIAN's published tax doctrine of oficios and conceptos by text. Resolves records published by DIAN (Dirección de Impuestos y Aduanas Nacionales): the electronic-invoice registry, and the compilation of tax doctrine (oficios, conceptos) with the norms and rulings compiled alongside it. ## Electronic document `POST /co/dian/electronic-document/v1` | Field | Type | Notes | | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `cufe` | string | **Required.** The document's CUFE/CUDE or UUID (30-100 chars). | | `document_number` | string | **Required.** NIT of the emisor or receptor (4-15 digits, no verification digit). | | `include_pdf` | boolean | Optional. When `true`, the response includes `pdf_url`, the URL of the official PDF representation of the document. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/co/dian/electronic-document/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "cufe": "0123456789abcdef...0123456789abcdef", "document_number": "900123456" }' ``` The response returns the document's parties, totals, current legitimate holder, validations, and events: | Field | Notes | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `found` | `true` when the CUFE resolves and the NIT matches the emisor or the receptor; `false` when the document is not registered or the NIT matches neither party. | | `document_type` | Document class label, e.g. "Factura electrónica". | | `issuer` / `recipient` | `{ nit, name }` of the emisor and receptor. | | `total` / `taxes` | Document total and tax lines, in COP. | | `legitimate_holder` | Current legitimate holder (tenedor legítimo) in the registry. | | `pdf_url` | Official PDF issued by DIAN, password-protected with the `document_number` from the lookup. `null` unless `include_pdf` was `true` and the document was found. | | `validations` / `events` | Document validations and the electronic-invoice event history. | This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. ## Doctrine search `POST /co/dian/doctrina-search/v1` Full-text search over DIAN's published doctrine and the legal compilation kept with it: oficios, conceptos, decretos, resoluciones, leyes, and high-court rulings. | Field | Type | Notes | | --------------- | ------ | ------------------------------------------------------------------ | | `query` | string | **Required.** Search terms (2-300 characters). | | `document_type` | string | Optional. Filter by type, e.g. `Oficios`, `Conceptos`, `Decretos`. | | `year` | string | Optional. Filter by year of issue (`yyyy`). | | `page` | number | Optional. 1-based page (default 1). | | `per_page` | number | Optional. Results per page, 1-100 (default 20). | ```bash theme={"dark"} curl https://api.croma.run/co/dian/doctrina-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "dividendos", "document_type": "Conceptos" }' ``` | Field | Notes | | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `query`, `document_type`, `year` | The terms and filters applied. | | `page`, `per_page` | The page returned and its size. | | `total` | Matches after filters. | | `count` | Results on this page. | | `capped` | `true` when the source returned more matches than are retrievable; narrow the query. | | `results` | Matching documents, each with `document_id`, `title`, `document_type`, `number`, `year`, `issuer`, `summary`, `excerpt`, and `url`. | Pass a result's `document_id` to the lookup below to read the full text. The id is the document's own identifier and does not always match its visible label, so always take it from a search result rather than composing it. ## Doctrine document `POST /co/dian/doctrina/v1` | Field | Type | Notes | | ------------- | ------ | ------------------------------------------------------------------------------------ | | `document_id` | string | **Required.** The `document_id` from a search result, e.g. `oficio_dian_18075_2023`. | | `offset` | number | Optional. First character to return (default 0). | | `limit` | number | Optional. Characters to return, 1000 to 1000000 (default 200000). | ```bash theme={"dark"} curl https://api.croma.run/co/dian/doctrina/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_id": "oficio_dian_18075_2023" }' ``` | Field | Notes | | ------------- | --------------------------------------------------------------------------------- | | `found` | `false` when no document carries that id; `content` is then `null`. | | `document_id` | The id queried. | | `title` | Official title, e.g. "Concepto 18075 de 2023". | | `content` | The requested range: `text`, `offset`, `total_length`, `has_more`, `next_offset`. | | `url` | Public URL of the document. | Most oficios and conceptos fit in a single response. Compiled norms run to millions of characters, so the body comes back in ranges: read `content.total_length` for the full size, and while `content.has_more` is `true` request the next range with `offset` set to `content.next_offset`. Full schema and an interactive playground. # Función Pública Source: https://docs.usecroma.com/guides/colombia/funcion-publica Search the Gestor Normativo, the Colombian state's curated register of 40,000 norms that govern public administration, and read any norm's full text. The Departamento Administrativo de la Función Pública keeps the Gestor Normativo: 40,000 norms that govern Colombian public administration, from a 1620 ordinance to this week's circular. It is not a gazette and not a court reporter. It is where a norm is published with its editorial apparatus: the subjects it is filed under, the later norms recorded as having added to, modified or repealed it, and the consolidated text. Laws, decrees, acts of Congress, rulings of the Consejo de Estado and the thousands of conceptos in which Función Pública answers how the rules apply are all in the same register, and both endpoints reach across all of them at once. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search the register `POST /co/funcion-publica/norms-search/v1` Dataset One search over the full text of every norm in the register, which the Gestor Normativo's own site does not offer: it pages ten at a time and stops at ten thousand results. | Field | Type | Notes | | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words matched against the norm's citation, the register's one-line description and the full text of the norm. | | `document_type` | string | Optional kind of instrument: `ley`, `decreto`, `concepto`, `sentencia`, `acuerdo`, `resolucion`, `circular-externa`, `decreto-ley`, `acto-legislativo`, `constitucion-politica` and others. Case and accents are ignored. | | `year` | integer | Optional year in the norm's own designation (the 2008 of `Ley 1266 de 2008`). This is how the register files a norm, and it is not always the year it was issued. 0 searches every year. Default `0`. | | `number` | string | Optional exact number. Leading zeros are optional: `7` and `007` find the same norm. | | `entity` | string | Optional issuing entity, matched from the start of the name: `congreso` finds the Congreso de la República. `nivel-nacional` is how the register labels norms of the national executive. | | `subject` | string | Optional subject heading the register files the norm under, exactly as it publishes it, e.g. `HABEAS DATA`, `CARRERA ADMINISTRATIVA`. The `subjects[]` of any result are valid values. | | `issued_from` | string | Optional: only norms issued on or after this date, `yyyy-mm-dd`. | | `issued_to` | string | Optional: only norms issued on or before this date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-50). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/funcion-publica/norms-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "habeas data", "document_type": "ley" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `results[]`, most recent first. Every result carries `id`, `title` (how the norm is cited), `document_type` and `document_type_key`, `number` and `number_key` (the same number with leading zeros dropped), `year` (the year in the norm's own designation), `entity` and `entity_key` (who issued it), `summary` (the register's one-line description of what it does), `issued_at`, `effective_at`, `published_in`, `subjects[]` and `topics[]` (what it is about, as the register classifies it), `amendments[]` (later norms it records as having added to, modified or repealed this one, each with the `norm_id` to look up in turn), `official_url` and `document_url`. Search results leave out the norm's body: a single norm can run to hundreds of thousands of characters. `query` still matches against it, so a search for a phrase buried in an article finds the norm; read the text itself with the Función Pública Norm endpoint. ## One norm, in full `POST /co/funcion-publica/norm/v1` Dataset | Field | Type | Notes | | --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `norm_id` | string | **Required.** The `id` from the search results, e.g. `34488` for Ley 1266 de 2008. The `norm_id` inside another norm's `amendments[]` is the same identifier. | | `offset` | integer | First character of the text to return. Pass the previous response's `next_offset` to read on. Default `0`. | | `limit` | integer | How many characters of the text to return. Most norms fit in one response; the longest run past a million characters. Default `200000`. | ```bash theme={"dark"} curl https://api.croma.run/co/funcion-publica/norm/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "norm_id": "34488" }' ``` Returns `as_of`, `found`, `norm_id` and `norm`, which carries everything the search returns plus `content`: a window onto the norm's text, with `text`, `offset`, `total_length`, `has_more` and `next_offset`. Every result carries `id`, `title` (how the norm is cited), `document_type` and `document_type_key`, `number` and `number_key` (the same number with leading zeros dropped), `year` (the year in the norm's own designation), `entity` and `entity_key` (who issued it), `summary` (the register's one-line description of what it does), `issued_at`, `effective_at`, `published_in`, `subjects[]` and `topics[]` (what it is about, as the register classifies it), `amendments[]` (later norms it records as having added to, modified or repealed this one, each with the `norm_id` to look up in turn), `official_url` and `document_url`. The register's longest norms run past a million characters, so the body is read a range at a time: send `offset` and `limit`, then pass the response's `next_offset` back as `offset` until `has_more` is false. `content` is null on the few norms the register publishes without a body, and on the norms whose text it does not serve, which are rare in recent years and commoner the further back the norm goes. An id the register does not carry returns `found: false` with HTTP 200, not an error. That includes an id another norm's `amendments[]` points at: the register occasionally cites a norm it no longer serves. Schemas, all response fields, and an interactive playground. # Imprenta Nacional Source: https://docs.usecroma.com/guides/colombia/imprenta Search Colombia's two official gazettes in full text: the Gaceta del Congreso document by document since 2000, and the Diario Oficial issue by issue back to 1939. Everything the Congress of Colombia has published in its own gazette since 2000, not as a list of issues but as the documents inside them: bills as filed, the committee reports written on them, the minutes of sittings in both chambers, approved and definitive texts, conciliation reports and presidential objections — each with its full text and tied to the proyecto de ley it belongs to, so a bill can be followed through every stage of its passage. A second pair of endpoints covers the Gaceta's issues themselves and the Diario Oficial, the gazette where Colombian law takes effect, indexed back to 1939. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search documents `POST /co/imprenta/gaceta-documents-search/v1` Dataset One search across everything Congress has published since 2000, which no official site offers. | Field | Type | Notes | | ---------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words to match in the document's title, its epígrafe and its full text. | | `chamber` | enum | `senado`, `camara`, or `any` for both. Default `any`. | | `kind` | enum | Optional kind: `proyecto`, `ponencia`, `acta`, `texto`, `conciliacion`, `objecion`, `concepto`, `ley`, `otro`, or `any`. Default `any`. | | `bill_number` | string | Optional: only documents about this proyecto de ley or acto legislativo, e.g. `152`. Leading zeros are ignored. Pair it with `bill_year`: bill numbers restart every legislature. | | `bill_year` | integer | Optional year the bill was filed. 0 searches every year. Default `0`. | | `published_from` | string | Optional earliest publication date, `yyyy-mm-dd`. | | `published_to` | string | Optional latest publication date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-50). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/imprenta/gaceta-documents-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "reforma pensional", "kind": "ponencia" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `results[]`, most recently published first. Every result carries `id`, `gaceta_id` and `gaceta_number` (the issue it was published in), `chamber`, `published_at`, `title` (how the document is cited), `summary` (the epígrafe the Gaceta prints under it), `kind`, `bill_number`, `bill_year` and `bill_chamber` (the proyecto de ley or acto legislativo it is about, when the title names one), and `official_url`. `kind` is `proyecto` (a bill as filed), `ponencia` (a committee report on one), `acta` (the minutes of a sitting), `texto` (an approved or definitive text), `conciliacion`, `objecion` (a presidential objection), `concepto`, `ley`, or `otro`. Search results do not carry the document's text: a single acta de plenaria can run to two hundred thousand characters. Take an `id` to the Gaceta Document endpoint to read one in full. ## One document `POST /co/imprenta/gaceta-document/v1` Dataset | Field | Type | Notes | | ------------- | ------ | ------------------------------------------------------------- | | `document_id` | string | **Required.** The `id` of a document from the search results. | ```bash theme={"dark"} curl https://api.croma.run/co/imprenta/gaceta-document/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_id": "87176" }' ``` Returns `as_of`, `found`, `document_id` and `document`, which carries `text`: the document itself, as the Gaceta published it. Every result carries `id`, `gaceta_id` and `gaceta_number` (the issue it was published in), `chamber`, `published_at`, `title` (how the document is cited), `summary` (the epígrafe the Gaceta prints under it), `kind`, `bill_number`, `bill_year` and `bill_chamber` (the proyecto de ley or acto legislativo it is about, when the title names one), and `official_url`. `kind` is `proyecto` (a bill as filed), `ponencia` (a committee report on one), `acta` (the minutes of a sitting), `texto` (an approved or definitive text), `conciliacion`, `objecion` (a presidential objection), `concepto`, `ley`, or `otro`. A few documents are published with only their cover page as text — the substance of those is in the issue's own edition, at the gaceta's `official_url`. ## Issues `POST /co/imprenta/gacetas-search/v1` Dataset The Gaceta's own numbering, by chamber and date. | Field | Type | Notes | | ---------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words to match in the issue's number and label. | | `chamber` | enum | `senado`, `camara`, or `any` for both. Default `any`. | | `number` | string | Optional issue number, e.g. `1161`. Leading zeros are ignored. Numbering restarts each year and each chamber keeps its own run, so pair it with a date range. | | `published_from` | string | Optional earliest publication date, `yyyy-mm-dd`. | | `published_to` | string | Optional latest publication date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-50). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/imprenta/gacetas-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "chamber": "senado", "published_from": "2026-08-01" }' ``` Returns `as_of`, the applied filters, `total`, `page`, `per_page`, `total_pages`, `count` and `results[]`, most recent first. Each issue carries `id`, `number` and `number_key`, `chamber`, `published_at`, `printed_date`, `legacy_label` and `official_url`. `published_at` is null on nine issues whose printed year cannot be a year (`0009`, `0200`, `0209` and the like). Those issues are real and are returned; only the date is withheld, because the correct one is not knowable. Their `printed_date` shows what the Gaceta prints. ## Diario Oficial `POST /co/imprenta/diarios-search/v1` Dataset Eighty-seven years of the gazette, by number and date. | Field | Type | Notes | | ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `number` | string | Optional issue number, e.g. `53.609` or `53609`. The thousands separator is ignored. | | `edition` | enum | Optional edition: `ordinaria` (the daily edition), `extraordinaria`, `especial`, `oficio_tributario`, `otra`, or `any`. Default `any`. | | `published_from` | string | Optional earliest publication date, `yyyy-mm-dd`. | | `published_to` | string | Optional latest publication date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-50). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/imprenta/diarios-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "published_from": "2026-08-01" }' ``` Returns `as_of`, the applied filters, `total`, `page`, `per_page`, `total_pages`, `count` and `results[]`, most recent first. Each issue carries `id`, `number` and `number_key`, `edition`, `published_at` and `official_url`. The record reaches back to issue 23,962 of 2 January 1939, but it is uneven before 2000: seven years list no issues at all (1985, 1987, 1988, 1992, 1994, 1995 and 1998) and several others only a handful. An empty result for an old year means the Imprenta lists nothing for it, not that nothing was published. Schemas, all response fields, and an interactive playground. # Legalize Source: https://docs.usecroma.com/guides/colombia/legalize Search Colombian legislation as structured data by free text and filters, and resolve any law's full record with its text as Markdown, from Legalize. Colombian legislation as structured data, sourced from Legalize. Two lookups: search laws by free text and filters, or resolve one law's full record (metadata plus the law text as Markdown) by its identifier. ## Search `POST /co/legalize/laws/v1` | Field | Type | Notes | | -------------- | ------- | ------------------------------------------------------------------------- | | `query` | string | Optional. Free-text search over law titles and content. Omit to list all. | | `law_type` | string | Optional. Filter by law type, e.g. `ley`, `decreto`. | | `year` | string | Optional. Publication year (`yyyy`). | | `status` | string | Optional. Filter by status, e.g. `in_force`. | | `jurisdiction` | string | Optional. Filter by jurisdiction. | | `page` | integer | Page number. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `50`. | ```bash theme={"dark"} curl https://api.croma.run/co/legalize/laws/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "habeas data", "per_page": 20 }' ``` Returns `query`, `total` (laws matching the filters), `page`, `per_page`, `count` (results on this page), and `results[]`. Drill into one with the by-id lookup below. ### `results[]` | Field | Notes | | ------------------ | ---------------------------------------------------------------------------------------------------- | | `id` | Law identifier. Pass to the by-id lookup. | | `title` | Full title. | | `short_title` | Short title, or `null`. | | `law_type` | Type, e.g. `ley`, `decreto`. | | `publication_date` | Publication date (`yyyy-mm-dd`). | | `status` | Status, e.g. `in_force`. | | `jurisdiction` | Jurisdiction, or `null`. | | `article_count` | Number of articles, or `null`. | | `title_snippet` | Matched-title excerpt when the query hit the title (may include `` highlight tags), or `null`. | ## By id `POST /co/legalize/law/v1` | Field | Type | Notes | | -------- | ------ | ----------------------------------------------------------------------------------------------------- | | `law_id` | string | **Required.** The law identifier returned by the search (`id`). Case-sensitive, e.g. `LEY-1266-2008`. | ```bash theme={"dark"} curl https://api.croma.run/co/legalize/law/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "law_id": "LEY-1266-2008" }' ``` Returns `found`, `law_id`, and `law`. `found` is `false` (with `law: null`) when no law matches the identifier. ### `law` | Field | Notes | | ---------------------------- | -------------------------------- | | `id`, `title`, `short_title` | Identifier and titles. | | `law_type` | Type, e.g. `ley`, `decreto`. | | `publication_date` | Publication date (`yyyy-mm-dd`). | | `status` | Status, e.g. `in_force`. | | `jurisdiction` | Jurisdiction, or `null`. | | `article_count` | Number of articles, or `null`. | | `department` | Department, or `null`. | | `source` | Source attribution, or `null`. | | `last_updated` | Last update, or `null`. | | `content_md` | The full law text as Markdown. | Dates are `yyyy-mm-dd`; unavailable values are `null`. A law id that doesn't match is **not** a `404`; it's a normal `200` with `found: false`. Schemas, all response fields, and an interactive playground. # Policía Nacional Source: https://docs.usecroma.com/guides/colombia/policia Check whether a person has pending judicial matters with Colombia's Policía Nacional by document type and number: the online criminal-record lookup. Checks the Policía Nacional online record to determine whether a person has pending judicial matters, by document type and number. `POST /co/policia/criminal-records/v1` | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------ | | `document_type` | enum | One of `CC`, `CE`, `PA`, `DPO`. Defaults to `CC`. Default `CC`. | | `document_number` | string | **Required.** Document number (alphanumeric with hyphens allowed). | ```bash theme={"dark"} curl https://api.croma.run/co/policia/criminal-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890" }' ``` | Field | Notes | | --------------------- | ------------------------------------------------------------------------------------- | | `document_type` | The queried document type, echoed back. | | `document_type_label` | Human label, e.g. `Cédula de Ciudadanía`. | | `document_number` | The queried number, echoed back. | | `full_name` | Full name as registered, or `null` when the source omits it. | | `has_records` | `false` = no pending judicial matters; `true` = records / pending matters registered. | | `status` | The verbatim verdict sentence from the source. | | `message` | Full plain-text result message. | | `checked_at` | Consultation timestamp the source prints, or `null`. | This endpoint is **asynchronous**: it answers `202` with a `status_url` to poll, or blocks up to the inline-wait budget (`Prefer: wait=N`). Pass an optional `callback_url` to have the result POSTed to you when it finishes. See the async-jobs guide. Schemas, all response fields, and an interactive playground. # Procuraduría Source: https://docs.usecroma.com/guides/colombia/procuraduria Check a person or entity's Procuraduría antecedentes by document: the disciplinary, penal, contractual, fiscal and pérdida de investidura records in SIRI. Resolves the "Consulta de antecedentes" from the Procuraduría General de la Nación: the disciplinary, penal, contractual, fiscal, and pérdida de investidura records held in the SIRI system (Sistema de Información de Registro de Sanciones e Inhabilidades). Given a document type and number, it returns the registered name and whether the person or entity has records. ## Request `POST /co/procuraduria/disciplinary-records/v1` | Field | Type | Notes | | ----------------- | ------ | --------------------------------------------------------------- | | `document_type` | enum | Optional. One of `CC`, `CE`, `NIT`, `PEP`, `PPT`. Default `CC`. | | `document_number` | string | **Required.** Document number (3-30 alphanumeric characters). | ```bash theme={"dark"} curl https://api.croma.run/co/procuraduria/disciplinary-records/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890" }' ``` `document_type` maps to these identity types: `CC` (cédula de ciudadanía), `CE` (cédula de extranjería), `NIT`, `PEP` (Permiso Especial de Permanencia), and `PPT` (Permiso por Protección Temporal). ## Response | Field | Notes | | -------------------------------------- | -------------------------------------------------------------------------------------- | | `found` | `true` when the document is registered in SIRI; `false` leaves the other fields empty. | | `document_type`, `document_type_label` | The queried type and its Spanish label. | | `document_number` | The queried document. | | `full_name` | Registered name, or `null` when not found. | | `has_records` | `false` for "El ciudadano no presenta antecedentes"; `true` otherwise. | | `status` | Verbatim verdict sentence (or the not-registered notice) from the source. | | `message` | Full plain-text result message, for audit/display. | | `checked_at` | Consultation timestamp from the source (local Colombia time), or `null`. | A clean record returns `has_records: false`. When `found` is `false`, the document is not registered in SIRI: `status` carries its notice and the other fields are empty. `has_records` reflects the headline verdict. The itemized list of sanctions for a record-bearing document is in the official certificate, not this response. Schemas, all response fields, and an interactive playground. # Rama Judicial Source: https://docs.usecroma.com/guides/colombia/rama-judicial Search Colombian court cases by party, resolve a case by its radicación number and list its actuaciones, and resolve any court's official email from a case number or a search, from the Rama Judicial's national registry. Rama Judicial is Colombia's national judicial branch registry. Croma exposes four endpoints over it: **search** processes by party, **resolve** a case by its registration number (radicación), which returns case metadata plus action history in a single call, and the **email directory**, twice over: the official mailbox of every despacho judicial and administrative area, browsable by place and specialty, or resolved directly from a court code or a radicado. ## Search processes `POST /co/rama-judicial/cases-by-entity/v1` finds processes by entity name. | Field | Type | Notes | | ------------- | ------- | ------------------------------------------------------------------------- | | `name` | string | **Required.** 3-200 chars. Entity name to search. | | `entity_type` | enum | Entity type: `natural` or `juridical`. Default `natural`. | | `active_only` | boolean | Restrict to processes with activity in the last 30 days. Default `false`. | | `court_code` | string | Narrow to a specific court. | | `page` | integer | 1-1000. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/co/rama-judicial/cases-by-entity/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "PEDRO CIFUENTES" }' ``` ## Resolve by radicación `POST /co/rama-judicial/cases-by-radicado/v1` resolves a case by its 23-digit registration number and returns metadata plus the first 40 actuaciones (actions) available. When no public case matches, `found` is `false` and `primary_case` is `null`. | Field | Type | Notes | | --------------------- | ------ | ---------------------------------------- | | `registration_number` | string | **Required.** 20-25 digits (radicación). | ```bash theme={"dark"} curl https://api.croma.run/co/rama-judicial/cases-by-radicado/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "registration_number": "11001600001720180327700" }' ``` ## Resolve many radicados (batch) `POST /co/rama-judicial/cases-by-radicado/v1/batch` resolves up to **50** radicados in one request. Items are resolved concurrently and returned in the same order, each with its own status, so one bad radicado never fails the batch. | Field | Type | Notes | | ------- | ----- | ----------------------------------------------------------------------------------------------------- | | `items` | array | **Required.** 1-50 objects, each `{ "registration_number": "…" }` (same body as the single endpoint). | ```bash theme={"dark"} curl https://api.croma.run/co/rama-judicial/cases-by-radicado/v1/batch \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [ { "registration_number": "11001600001720180327700" }, { "registration_number": "05001310300120190012300" } ] }' ``` Each item counts as one request against your quota. See [Batch requests](/batch) for the response envelope and partial-failure handling. ## Find a court's email `POST /co/rama-judicial/email-directory/v1` Dataset Searches the judicial branch's official mailbox directory: every despacho judicial and administrative area, filterable by place, kind of office, specialty, seccional, or the court code that prefixes every radicado. | Field | Type | Notes | | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words matched against the office name, the email address, and the office's corporation, specialty, department, city and seccional. | | `department` | string | Optional department, matched from the start of the name: `santander`, `bogota`. Case and accents are ignored. | | `city` | string | Optional city, matched from the start of the name: `bogota` finds Bogotá D.C. | | `corporation` | string | Optional kind of office, matched from the start of the name: `juzgado` matches every kind of juzgado, `tribunal-superior`, `centro-de-servicios`, `corte-suprema`. | | `specialty` | string | Optional specialty, matched from the start of the name: `civil`, `laboral`, `familia`, `penal` (which also matches the penal sub-specialties). | | `account_type` | enum | Optional kind of mailbox: `despacho` for a court's own account, `area` for an administrative or service area. Empty returns both. | | `court_code` | string | Optional 12-digit court code (código de despacho). A full 20-25-digit radicado is also accepted: its first 12 digits identify the office where the case is filed, so this resolves "which court holds this case, and what is its email" in one call. | | `district` | string | Optional administrative district (seccional), matched from the start of the name: `bucaramanga`, `nivel-central`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/rama-judicial/email-directory/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "city": "bucaramanga", "specialty": "penal" }' ``` Returns `as_of` (how current the data is), the applied filters, `total`, `page`, `per_page`, `total_pages`, `count` and `results[]`, ordered by office name. Every result carries `email`, `name`, `account_type` ("Despacho Judicial" or "Área"), `corporation`, `specialty`, `department`, `city`, `district` (the seccional), `court_code`, and the canonical `*_key` twins the filters match by prefix. The directory is served from Croma's own copy, refreshed weekly from the Rama Judicial's official directory, so searches answer fast and do not depend on the upstream being reachable. `as_of` says when the copy was last brought up to date. ## Resolve a court's email from a case `POST /co/rama-judicial/emails-by-court/v1` Dataset Resolves the official mailbox of one court from its 12-digit code, or directly from a full radicado. No paging: every account the directory holds for the code comes back at once, the despacho's own mailbox first. | Field | Type | Notes | | ------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `court_code` | string | **Required.** The 12-digit court code (código de despacho), or a full 20-25-digit radicado: its first 12 digits identify the court where the case is filed. The `court_code` of any email-directory result and the first 12 digits of any `registration_number` are both valid values. | ```bash theme={"dark"} curl https://api.croma.run/co/rama-judicial/emails-by-court/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "court_code": "110013103021" }' ``` Returns `as_of`, `found`, the (sliced) `court_code`, `count` and `mailboxes[]`, each with the same fields as an email-directory result. A code the directory does not hold returns `found: false` with HTTP 200, not an error. Some courts publish no dedicated mailbox and are served by a centro de servicios; searching the email directory by place and specialty is the fallback. The case endpoints reach a live upstream that can be slow or briefly unavailable, and may return `502 upstream_error`; retry with backoff. The email directory is served from Croma's own copy and does not depend on it. Schemas, all response fields, and an interactive playground. # Registraduría Source: https://docs.usecroma.com/guides/colombia/registraduria Check whether a Colombian cédula is active or cancelled due to the holder's death, straight from the Registraduría Nacional's official vital-status record. Queries the Registraduría Nacional to determine whether a Colombian cédula is active or has been cancelled due to the holder's death. `POST /co/registraduria/vital-status/v1` | Field | Type | Notes | | ----------------- | ------ | --------------------------------------------------------------- | | `document_number` | string | **Required.** 5-12 digits, no leading zero (`^[1-9]\d{4,11}$`). | ```bash theme={"dark"} curl https://api.croma.run/co/registraduria/vital-status/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "5786287" }' ``` | Field | Notes | | ----------------- | ------------------------------------------------------------------------------------------- | | `found` | `true` when the cédula is in the registry; `false` when it isn't (then `status` is `null`). | | `document_number` | The queried cédula, echoed back. | | `status` | The vital status when found, `null` otherwise. | When `found` is `true`, `status` is one of: | `status` | Meaning | | ---------- | ---------------------------------------------------------------------- | | `ALIVE` | Cédula active. | | `DECEASED` | Cancelled due to the holder's death. | | `UNKNOWN` | Upstream returned a value Croma doesn't recognize (logged for review). | A cédula that isn't in the registry is **not** a `404`; it's a normal `200` with `found: false`. Schemas, all response fields, and an interactive playground. # Registro Civil Source: https://docs.usecroma.com/guides/colombia/registro-civil Find where a Colombian birth civil registry was inscribed — the office, serial and inscription date — by first surname, first name, sex and date of birth, from the Registraduría Nacional del Estado Civil. Looks up a Colombian birth civil registry and returns the office it was inscribed at, its serial and inscription date, matched by first surname, first name, sex and date of birth. `POST /co/registro-civil/birth-record/v1` | Field | Type | Notes | | ---------------- | ------ | ------------------------------------------------------------- | | `first_surname` | string | **Required.** First surname (primer apellido). | | `first_name` | string | **Required.** First given name (primer nombre). | | `sex` | enum | **Required.** `M` (masculino) or `F` (femenino). | | `birth_date` | string | **Required.** Date of birth, yyyy-mm-dd (year 1900 or later). | | `second_surname` | string | Optional. Second surname (segundo apellido). | | `second_name` | string | Optional. Second given name (segundo nombre). | ```bash theme={"dark"} curl https://api.croma.run/co/registro-civil/birth-record/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "first_surname": "PEREZ", "first_name": "JUAN", "sex": "M", "birth_date": "1990-01-01" }' ``` | Field | Notes | | ------------------------------- | ---------------------------------------------------------------------------------------------------------- | | `found` | `true` when a birth registry matches; `false` when none does (then `records` is empty). | | `records` | The matching civil registries. One exact match returns a single, fully populated record. | | `records[].serial` | Serial printed on the civil registry. | | `records[].document_number` | NUIP / NIP / Tarjeta de Identidad on the record, when listed. | | `records[].full_name` | The record's names and surnames joined. | | `records[].sex` | Sex as the register reports it. | | `records[].record_type` | Kind of civil registry (`REGISTRO CIVIL DE NACIMIENTO`). | | `records[].registration_office` | Office the registry was inscribed at. Present on an exact match; `null` on a row from a multi-record list. | | `records[].registered_at` | Inscription date (yyyy-mm-dd), or `null`. | A person with no digitized birth registry is **not** a `404`; it's a normal `200` with `found: false` and an empty `records` list. Birth serials were digitized progressively from around 1970. Schemas, all response fields, and an interactive playground. # RUAF Source: https://docs.usecroma.com/guides/colombia/ruaf Look up a person's affiliations across Colombia's social-security system by document: health, pensions, occupational risk, severance and family funds. Looks up what a person is affiliated to across Colombia's social-security system — health, pensions, occupational risk, severance and family-compensation funds — in the Ministerio de Salud's Registro Único de Afiliados (RUAF). `POST /co/ruaf/affiliations/v1` | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `document_type` | enum | Colombian document type (`CC`, `CE`, `TI`, `RC`, `PA`, `PEP`, `PPT`). Default `CC`. | | `document_number` | string | **Required.** Colombian cédula. 5-12 digits. | | `issue_date` | string | **Required.** Date the document was issued (`YYYY-MM-DD`). The register requires it and refuses the lookup when it does not match. For `TI` and `RC` it asks for the date of birth instead. | ```bash theme={"dark"} curl https://api.croma.run/co/ruaf/affiliations/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890", "issue_date": "2008-02-15" }' ``` The response echoes the document that was looked up and lists every affiliation the register holds for it, across subsystems: | Field | Notes | | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `found` | `false` when the register has no record for this document. | | `issue_date_matches` | `false` when the register does not accept the document and `issue_date` together. It answers the same way whether the date is wrong or the document is not on file, so this alone does not tell those apart. Nothing else is returned in that case. | | `document_type` | Document type the lookup used. | | `document_type_label` | Readable label for `document_type`, e.g. "Cédula de Ciudadanía". | | `document_number` | Document number the lookup used. | | `full_name` | Names and surnames on the register, or `null` when not found. | | `sex` | Sex as the register reports it (`M` / `F`), or `null`. | | `as_of` | The register's own cut-off date for the report, as `YYYY-MM-DD`. | | `affiliations` | Affiliations found. Empty array when the person has none. | | `affiliations[].system` | Subsystem the affiliation belongs to: `Salud`, `Pensiones`, `Riesgos Laborales`, `Cesantías`, `Compensación Familiar`, `Pensionados` or `Programas de Asistencia Social`. | | `affiliations[].entity_name` | Administrator the person is affiliated to. | | `affiliations[].regime` | Regime or scheme, e.g. `Contributivo`, or `null`. | | `affiliations[].status` | Affiliation status as the source words it, e.g. `Activo`, `Retirado`, or `null`. | | `affiliations[].affiliate_type` | How the person is attached, e.g. `COTIZANTE`. Health only; `null` elsewhere. | | `affiliations[].start_date` | Affiliation start date as `YYYY-MM-DD`, or `null`. | | `affiliations[].economic_activity` | Employer's economic activity. Occupational risk only; `null` elsewhere. | | `affiliations[].location` | Department and municipality the affiliation is registered in, or `null`. | | `checked_at` | ISO timestamp of when the answer was read. | This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # RUES Source: https://docs.usecroma.com/guides/colombia/rues Search Colombian companies by name or resolve one by NIT in RUES, the unified commercial registry, each result enriched with its full registry record. RUES is Colombia's unified commercial registry. Croma exposes two endpoints over it: **search** entities by name (each result enriched with its full registry record), and **resolve** an entity by NIT (with financials, renewals, related parties and registry notices). ## Search by name `POST /co/rues/entities-by-name/v1` searches RUES by entity name and returns a page of results, each with its full registry record. | Field | Type | Notes | | ------ | ------- | ----------------------------------------- | | `name` | string | **Required.** Entity name to search. | | `page` | integer | 1-1000. Default `1`. 10 results per page. | ```bash theme={"dark"} curl https://api.croma.run/co/rues/entities-by-name/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "exito" }' ``` ## Resolve by NIT `POST /co/rues/entity-by-nit/v1` resolves an entity by its NIT. When no exact-NIT entity matches, `found` is `false` and the record fields are empty. | Field | Type | Notes | | ----------------- | ------ | --------------------------------------------- | | `document_number` | string | **Required.** The entity's NIT (4-15 digits). | ```bash theme={"dark"} curl https://api.croma.run/co/rues/entity-by-nit/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "900654922" }' ``` RUES is a live upstream and can be slow or briefly unavailable. These endpoints may return `502 upstream_error`; retry with backoff. Schemas, all response fields, and an interactive playground. # RUNT Source: https://docs.usecroma.com/guides/colombia/runt Resolve a Colombian vehicle in RUNT by plate and the registered owner's document: the registry record, technical data, SOAT and technical inspection status. Resolves a vehicle from RUNT (Registro Único Nacional de Tránsito), Colombia's national traffic and vehicle registry. Given a plate and the registered owner's document, it returns the vehicle's registry record: make and model, technical specifications, identifiers, registering authority, dates, and lien/pledge flags. The owner's document is required: RUNT only returns a vehicle when the plate and the document match an active owner. ## Request `POST /co/runt/vehicle-by-plate/v1` | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------------------ | | `plate` | string | **Required.** Vehicle plate, e.g. `ABC123` (cars) or `ABC12D` (motorcycles). | | `document_type` | string | Optional. One of `CC`, `CE`, `TI`, `RC`, `PA`, `NIT`, `PPT`. Defaults to `CC`. | | `document_number` | string | **Required.** The registered owner's document number (3-30 alphanumeric characters). | ```bash theme={"dark"} curl https://api.croma.run/co/runt/vehicle-by-plate/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123", "document_type": "CC", "document_number": "1234567890" }' ``` `document_type` maps to these identity types: `CC` (cédula de ciudadanía), `CE` (cédula de extranjería), `TI` (tarjeta de identidad), `RC` (registro civil), `PA` (pasaporte), `NIT`, and `PPT` (Permiso por Protección Temporal). ## Response | Field | Notes | | ----------------------- | ----------------------------------------------------------------------------------------------------------------- | | `found` | `true` when the plate and owner document have an active match; `false` leaves `vehicle` null and the lists empty. | | `plate` | The queried plate (uppercased). | | `vehicle` | The vehicle registry record (see below), or `null` when not found. | | `soat_policies` | SOAT insurance policy history (newest first). | | `inspections` | Técnico-mecánica (RTM) inspection history. | | `specifications` | Extended specifications (dimensions, weights, capacities), or `null`. | | `pledges` | Registered guarantees/liens (garantías), including the creditor (e.g. a financing bank). | | `ownership_limitations` | Ownership limitations (limitaciones a la propiedad). | | `armoring` | Armoring (blindaje) status and level, or `null` when unarmored. | | `civil_liability` | Civil-liability (responsabilidad civil) policies. | | `dijin_certificate` | DIJIN certificate, or `null` when none on record. | | `scrapping_certificate` | Scrapping certificate (certificado de desintegración), or `null`. | | `normalization` | Normalization (normalización) records. | | `scrapping` | Scrapping (desintegración) status, or `null`. | All sections beyond `vehicle` are best-effort: if a section is unavailable for a given vehicle it comes back empty (`[]` or `null`) rather than failing the call. ### `vehicle` | Field | Notes | | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `plate` | The vehicle's plate. | | `registration_status` | Registration status, e.g. `ACTIVO`. | | `service_type` | Service type, e.g. `Particular` / `Público`. | | `vehicle_class`, `classification`, `body_type` | Class (e.g. `AUTOMOVIL`), classification, and body type. | | `brand`, `line`, `model_year`, `color` | Make, line, model year, and color. | | `fuel_type`, `engine_displacement` | Fuel type and engine displacement (cc). | | `doors`, `seated_passengers`, `total_passengers` | Doors and passenger capacity. | | `axle_count`, `gross_weight`, `load_capacity` | Axles, gross weight, and load capacity. | | `vin`, `engine_number`, `chassis_number`, `serial_number` | Vehicle identifiers. | | `traffic_license_number` | Traffic-license number (licencia de tránsito). | | `traffic_authority` | Registering traffic authority (organismo de tránsito). | | `country_name` | Origin country, when applicable. | | `registration_date`, `enrollment_date`, `days_registered` | Registration dates and days registered. | | `has_liens`, `has_pledges` | Whether the vehicle carries registered liens (gravámenes) or pledges (prendas). | | `is_repowered`, `is_classic`, `is_teaching_vehicle`, `is_state_security` | Status flags. | | `engine_restamped`, `chassis_restamped`, `serial_restamped`, `vin_restamped` | Whether each identifier was re-stamped (regrabado). | `SI`/`NO` indicators are returned as booleans, numeric fields as numbers, and dates as `yyyy-mm-dd`. Missing values are `null`. ### `soat_policies[]` Each SOAT policy carries `policy_number`, `insurer`, `is_current` (the currently-valid policy), `issue_date`, `start_date`, `expiry_date`, `origin`, and `tariff_type`. ### `inspections[]` Each técnico-mecánica (RTM) record carries `certificate_number`, `center_name` (the CDA), `inspection_type`, `status`, `is_current`, `issue_date`, `expiry_date`, and `plate`. ### `specifications` `load_capacity`, `gross_weight`, `axle_count`, `tire_count`, `height`, `width`, `length`, `total_passengers`, `seated_passengers`. ### `pledges[]` and `ownership_limitations[]` `pledges` lists registered guarantees/liens (garantías): `creditor`, `creditor_document_type`, `creditor_document_number`, `registered_date`, `trust_estate`. A financed vehicle shows its creditor here (e.g. the bank that holds the prenda). `ownership_limitations` lists limitaciones a la propiedad (`limitation_type`, `document_number`, `legal_entity`, `department`, `municipality`, `issue_date`, `filing_date`). Both are empty for unencumbered vehicles. ### `armoring`, `civil_liability[]`, certificates, `normalization[]`, `scrapping` `armoring` reports blindaje status: `is_armored`, `level` (e.g. `TRES`), `level_number`, `armored_date`, `dearmored_date`, `resolution_number`, `armoring_type`, `certificate_issue_date`, `authorization`. `civil_liability[]` lists responsabilidad-civil policies (`policy_number`, `insurer`, `start_date`, `expiry_date`, `is_current`). `dijin_certificate` and `scrapping_certificate` carry a `certificate_number`, dates, issuing entity, and `status`. `normalization[]` reports normalización records, and `scrapping` reports desintegración status. Each is `null`/empty when not applicable to the vehicle. This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can set `Prefer: wait=N`, poll `GET /jobs/{id}`, or supply a `callback_url`. ## Vehicle history by plate `POST /co/runt/vehicle-history-by-plate/v1` Looks up a vehicle's RUNT history by plate alone, without the owner's document. It returns the registered owner(s) with their identification numbers, the vehicle characteristics, the traffic-license and import records, SOAT and técnico-mecánica history, any accident on record, recent and pending procedures (trámites), and guarantee/lien and ownership-limitation summaries. | Field | Type | Notes | | ------- | ------ | ---------------------------------------------------------------------------- | | `plate` | string | **Required.** Vehicle plate, e.g. `ABC123` (cars) or `ABC12D` (motorcycles). | ```bash theme={"dark"} curl https://api.croma.run/co/runt/vehicle-history-by-plate/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123" }' ``` The response carries `found`, `plate`, `vehicle`, `owners[]` (each with `document_type`, `name`, `document_number`, ownership dates, and `owner_type`), `traffic_license`, `import_record`, `soat_policies[]`, `inspections[]`, `accident`, `pending_procedures[]`, `guarantee`, and `limitation`. Sections are best-effort: anything unavailable comes back empty (`[]` or `null`) rather than failing the call. Like the lookup above, this is an async job. Schemas, response fields, and an interactive playground. # SAMAI (Consejo de Estado) Source: https://docs.usecroma.com/guides/colombia/samai Search live contentious-administrative litigation by party, radicado or class across the Consejo de Estado and every Tribunal and Juzgado Administrativo. Live contentious-administrative litigation from SAMAI / Consejo de Estado, spanning the Consejo de Estado and every Tribunal and Juzgado Administrativo. Search processes by party, radicado, or class, scoped to a corporación (the deciding despacho). ## Search processes `POST /co/samai/processes/v1` | Field | Type | Notes | | ------------- | ------- | ---------------------------------------------------------------------------------------------------------- | | `search_type` | enum | `radicado`, `clase`, or `parte`. Default `parte`. | | `query` | string | **Required.** 2-200 chars. The search term (party, radicado, or class, per `search_type`). | | `corporacion` | string | 5-9 digit corporación code. Required; on a `radicado` search it is derived from the radicado when omitted. | | `section` | string | Section/sala within the corporación. | | `from_date` | string | `YYYY-MM-DD`. | | `to_date` | string | `YYYY-MM-DD`. | | `page` | integer | 1-1000. Default `1`. | | `per_page` | integer | 1-50. Default `10`. | ```bash theme={"dark"} curl https://api.croma.run/co/samai/processes/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "search_type": "parte", "query": "BANCOLOMBIA", "corporacion": "1100103" }' ``` Returns `total`, `total_pages`, `count`, and the matching rows. | Field | Notes | | ----------------- | ------------------------------------ | | `radicado` | Process number. | | `corporacion` | Corporación (despacho) code. | | `ponente` | Reporting magistrate. | | `clase` | Process class. | | `filing_date` | Filing date. | | `is_current` | Whether this is the current process. | | `internal_number` | Internal number. | | `subject` | Matter. | | `plaintiff` | Claimant. | | `defendant` | Respondent. | | `is_private` | Whether the process is reserved. | | `guid` | Stable identifier for the process. | | `official_url` | Link to the process. | ## List corporaciones `POST /co/samai/corporaciones/v1` takes no fields and returns every corporación (despacho) with its code and name. Use a code to scope a process search. ```bash theme={"dark"} curl https://api.croma.run/co/samai/corporaciones/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' ``` ## List secciones `POST /co/samai/secciones/v1` returns the sections/salas of a corporación. | Field | Type | Notes | | ------------- | ------ | --------------------------------------------------- | | `corporacion` | string | **Required.** Corporación code from the list above. | ```bash theme={"dark"} curl https://api.croma.run/co/samai/secciones/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "corporacion": "1100103" }' ``` Schemas, all response fields, and an interactive playground. # SECOP Source: https://docs.usecroma.com/guides/colombia/secop Colombian public procurement across SECOP I and SECOP II: every process, contract, modification, bidder, supplier, sanction and annual purchasing plan, complete and ready to query, plus live drill-down into one process or contract. Colombia has run public procurement on two systems. SECOP I (2004 onward) is a publication register: an entity uploads what it did. SECOP II (2015 onward) is a transactional platform: the process happens inside it. Both are run by Colombia Compra Eficiente, both are still being written to, and they publish different columns in different words at different grains. Croma serves both as one corpus. Seven datasets (processes, contracts, contract modifications, bidders, suppliers, sanctions and annual purchasing plans) are complete, kept up to date and answered in a single vocabulary, so a question like "everything this company has contracted with the state" is one call rather than two searches in two shapes. Every dataset-served response carries `as_of`: how current the data is. Two endpoints still read the source live, because they answer about one record rather than about the corpus: `secop-process` returns a SECOP II process with its per-provider awards and awarded contracts attached, and `secop-contract` returns one contract with its additions, guarantees and delivery plan. ## Process by notice `POST /co/secop/process/v1` | Field | Type | Notes | | ------------ | ------ | ------------------------------------------------------ | | `notice_uid` | string | **Required.** SECOP noticeUID, e.g. `CO1.NTC.9458505`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/process/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "notice_uid": "CO1.NTC.9458505" }' ``` The `noticeUID` is the process's notice identifier, formatted like `CO1.NTC.` (e.g. `CO1.NTC.9458505`). ## Contract by id `POST /co/secop/contract/v1` Resolves one electronic contract by its id and attaches its satellite history: registered additions/modifications, insurance policies (garantías), and the delivery plan with planned vs actual progress. | Field | Type | Notes | | ------------- | ------ | ----------------------------------------------------------- | | `contract_id` | string | **Required.** SECOP contract id, e.g. `CO1.PCCNTR.6794799`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/contract/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "contract_id": "CO1.PCCNTR.6794799" }' ``` Returns `found`, `contract_id`, `contract` (same shape as `contracts[]` below), and three lists, each capped at 200 with a matching `*_capped` flag: | List | Fields | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `additions[]` | `addition_id`, `type`, `description`, `registered_date`. | | `guarantees[]` | `insurer`, `policy_number`, `insured`, `beneficiary`, `policy_created_date`, `policy_sent_date`, `policy_end_date`, `policy_side`, `status`, `policy_type`, `policy_subtype`, `value`, `created_date`. | | `execution_items[]` | `execution_type`, `plan_name`, `expected_delivery_date`, `expected_progress_percent`, `actual_delivery_date`, `actual_progress_percent`, `contract_status`, `item_reference`, `description`, `unit`, `awarded_quantity`, `planned_quantity`, `received_quantity`, `pending_quantity`, `created_date`. | ## Search processes `POST /co/secop/processes-search/v1` Dataset Searches every procurement process published on SECOP II and SECOP I as one corpus. Filters combine freely; `query` matches the name, the description, the entity and the process reference. | Field | Type | Notes | | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `query` | string | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching. | | `platform` | enum | `secop_ii`, `secop_i`, or `any` for both. Default `any`. | | `entity_nit` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `department` | string | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country. | | `modality` | string | Optional modalidad de contratación, exactly as SECOP writes it (`Contratación directa`, `Licitación pública`, `Mínima cuantía`, ...). Empty for every modality. | | `contract_type` | string | Optional tipo de contrato, exactly as SECOP writes it (`Prestación de servicios`, `Obra`, `Suministros`, ...). Empty for every type. | | `status` | string | Optional estado, exactly as SECOP writes it (`Adjudicado`, `Celebrado`, `En ejecución`, `Terminado`, ...). Empty for every status. | | `unspsc_code` | string | Optional main UNSPSC category code of the purchase (`V1.80101500`). Empty for every category. | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `from_date` | string | Optional date filter in yyyy-mm-dd format. | | `to_date` | string | Optional date filter in yyyy-mm-dd format. | | `min_value` | number | Bounds apply to `base_price` (the estimated value of the process), in COP. Default `0`. | | `max_value` | number | Bounds apply to `base_price` (the estimated value of the process), in COP. Default `0`. | | `sort` | enum | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | | `awarded` | enum | Restrict to processes that reached an award (`yes`), that did not (`no`), or `any`. Processes whose outcome the source does not state are excluded by `yes` and `no` alike. Default `any`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/processes-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "recolección de residuos", "year": 2025, "per_page": 20 }' ``` Returns `as_of` (how current the data is), `total`, `page`, `per_page`, `total_pages`, `count`, the filters as they were applied, and `results[]`. Each result is a process record: its platform-prefixed `id`, the buying entity, what is being bought, the modality and contract type, the estimated and awarded amounts, the dates, the competition counts SECOP II publishes (`invited_providers`, `unique_responding_providers`, ...) and the process URL. Pass a result's `id` to `secop-process-record` to read it back on its own, or its `notice_uid` to `secop-process` for the live view with awards and contracts attached. ## Search contracts `POST /co/secop/contracts-search/v1` Dataset Searches every contract signed through SECOP II and SECOP I as one corpus. `provider_document` accepts a NIT or cédula with or without dots and verification digit: `900195855`, `900.195.855-1` and `900195855-1` all match the same contractor. | Field | Type | Notes | | ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching. | | `platform` | enum | Restrict to one system: `secop_ii` (the transactional platform, 2015 onward), `secop_i` (the publication register, 2004 onward), or `any` for both. Default `any`. | | `entity_nit` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `department` | string | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country. | | `modality` | string | Optional modalidad de contratación, exactly as SECOP writes it (`Contratación directa`, `Licitación pública`, `Mínima cuantía`, ...). Empty for every modality. | | `contract_type` | string | Optional tipo de contrato, exactly as SECOP writes it (`Prestación de servicios`, `Obra`, `Suministros`, ...). Empty for every type. | | `status` | string | Optional estado, exactly as SECOP writes it (`Adjudicado`, `Celebrado`, `En ejecución`, `Terminado`, ...). Empty for every status. | | `unspsc_code` | string | Optional main UNSPSC category code of the purchase (`V1.80101500`). Empty for every category. | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `from_date` | string | Optional date filter in yyyy-mm-dd format. | | `to_date` | string | Optional date filter in yyyy-mm-dd format. | | `min_value` | number | Bounds apply to `value_with_additions` (what was actually committed), in COP. Default `0`. | | `max_value` | number | Bounds apply to `value_with_additions` (what was actually committed), in COP. Default `0`. | | `sort` | enum | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | | `provider_document` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `sector` | string | Published on SECOP II contracts only; setting it excludes SECOP I. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/contracts-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "provider_document": "900195855", "sort": "value_desc", "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]`. Each result is a contract record with the entity, the contractor and its legal representative, the object, the amounts (signed, with additions, invoiced, paid, pending), the funding breakdown by source, the dates, the peace-agreement and post-conflict markers, and who supervises it. `value` is the amount at signature; `value_with_additions` is the amount to rank spending by. Pass a result's `id` to `secop-contract-record`, or its `contract_id` to `secop-contract` for the live view with additions, guarantees and the delivery plan. ## Search contract modifications `POST /co/secop/modifications-search/v1` Dataset Lists what happened to contracts after they were signed. Sorting by `value_desc` with a `min_value` floor is the plainest way to find the contracts that grew most after award. | Field | Type | Notes | | ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `query` | string | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching. | | `contract_id` | string | A contract `id` from `secop-contracts-search`, e.g. `secop_ii:CO1.PCCNTR.4168447`. | | `platform` | enum | Restrict to one system: `secop_ii` (the transactional platform, 2015 onward), `secop_i` (the publication register, 2004 onward), or `any` for both. Default `any`. | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `from_date` | string | Optional date filter in yyyy-mm-dd format. | | `to_date` | string | Optional date filter in yyyy-mm-dd format. | | `min_value` | number | Optional lower bound on the amount, in COP. 0 means no lower bound. Default `0`. | | `sort` | enum | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/modifications-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "min_value": 1000000000, "sort": "value_desc", "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]` with `contract_id`, `kind`, `description`, `added_value`, `added_days` and `registered_date`. SECOP I records its additions against the adjudication rather than the contract row, so those carry `contract_reference` (the adjudication id, which a contract reports as `award_id`) instead of `contract_id`. ## Search suppliers `POST /co/secop/suppliers-search/v1` Dataset The SECOP II supplier register. `query` matches the name, the document and the registered category description. | Field | Type | Notes | | ------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching. | | `document` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `department` | string | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country. | | `unspsc_code` | string | Optional main UNSPSC category code of the purchase (`V1.80101500`). Empty for every category. | | `active` | enum | Restrict to active supplier accounts (`yes`), inactive ones (`no`), or `any`. Default `any`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/suppliers-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "constructora", "department": "Antioquia", "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]` with the supplier's `document`, `name`, category, location, contact details, legal representative and `is_active`. SECOP I has no supplier register of its own; a SECOP I contractor appears in `secop-contracts-search` but not here. ## Search bidders `POST /co/secop/bidders-search/v1` Dataset Who presented an offer on which process. SECOP I also publishes the score and whether the bidder won; SECOP II publishes only the participation, so `score` and `awarded` are null there rather than guessed. | Field | Type | Notes | | ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `process_id` | string | For SECOP II, a process `id` from `secop-processes-search`. SECOP I identifies a process here by its own internal id, which is not that key. | | `bidder_document` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `platform` | enum | Restrict to one system: `secop_ii` (the transactional platform, 2015 onward), `secop_i` (the publication register, 2004 onward), or `any` for both. Default `any`. | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/bidders-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "bidder_document": "900195855", "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]` with `process_id`, `bidder`, `bidder_document`, `score`, `awarded` and `published_date`. ## Search sanctions `POST /co/secop/sanctions-search/v1` Dataset The whole register of multas y sanciones, searchable across contractors and entities rather than one contractor at a time. | Field | Type | Notes | | ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching. | | `provider_document` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `entity_nit` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `from_date` | string | Optional date filter in yyyy-mm-dd format. | | `to_date` | string | Optional date filter in yyyy-mm-dd format. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/sanctions-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "incumplimiento", "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]` with the sanctioning entity, the contractor, the resolution number, the contract, the amount in COP, the publication date and the date the sanction became final. ## Search annual procurement plans `POST /co/secop/plans-search/v1` Dataset The forward-looking half of Colombian procurement: what entities say they will buy, before the processes exist. | Field | Type | Notes | | ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Matches the entity name and the mission and strategy it states in the plan. The plan header names its entity by SECOP code rather than NIT, so an entity is reached by name here, not by document. | | `department` | string | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country. | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/plans-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "year": 2026, "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]` with the entity, the year, the announced total budget, the menor and mínima cuantía thresholds, the entity's stated mission and strategy, and the contact it named. ## Profile by document `POST /co/secop/profile/v1` Dataset One document, both sides of the market. A NIT can be a contractor, a buying entity, or both, and this answers for all of it at once. | Field | Type | Notes | | ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `document` | string | **Required.** Provider cédula or NIT. Dots and a trailing verification digit are optional: `900195855`, `900195855-1` and `900.195.855-1` all match the same contractor. | | `per_section` | integer | Only the length of each list. The counts beside them are exact totals either way. Default `5`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/profile/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document": "900195855" }' ``` **The counts are exact; the lists are the largest few.** `as_contractor.contracts` is the real number of contracts even when `largest_contracts` holds five of them. To page the rest, take the `document` and call `secop-contracts-search` with it. `contracts_value` is the sum of the contracts actually returned and nothing more. It is not a lifetime total: a total across every contract is not something this endpoint can compute, and a number inferred from one page would be wrong in the direction nobody would think to check. `found: false` means the corpus holds nothing at all for the document. That is an answer, not an error: most cédulas have never contracted with the state. ## Search awards `POST /co/secop/awards-search/v1` Dataset Every awarded provider on every SECOP II process, at the grain the source publishes them. A SECOP I row is itself an adjudication, contractor and amount included, so SECOP I awards live in `secop-contracts-search`. | Field | Type | Notes | | ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching. | | `provider_document` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `entity_nit` | string | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). | | `process_id` | string | Optional process id from a search result (`id` on a process, or `process_id` on a bidder). Empty searches every process. | | `year` | integer | Optional calendar year. 0 searches every year. Default `0`. | | `from_date` | string | Optional date filter in yyyy-mm-dd format. | | `to_date` | string | Optional date filter in yyyy-mm-dd format. | | `min_value` | number | Bounds apply to `value`, this provider's own slice of the award, not the process total. Default `0`. | | `max_value` | number | Bounds apply to `value`, this provider's own slice of the award, not the process total. Default `0`. | | `sort` | enum | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`. | | `page` | integer | 1-based page number for paginated results. Default `1`. | | `per_page` | integer | Results per page (1-100). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/awards-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "provider_document": "900195855", "sort": "value_desc", "per_page": 20 }' ``` Returns `as_of`, the page metadata, the filters as applied, and `results[]` with `process_id`, `notice_uid`, the entity, the provider and its document, `value` and `awarded_at`. Pass a result's `process_id` to `secop-process-record`, or its `notice_uid` to `secop-process` for the process with every award and contract attached. ## Read one process `POST /co/secop/process-record/v1` Dataset Reads back a single process record by the `id` a search returned. | Field | Type | Notes | | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- | | `record_id` | string | **Required.** Record id from a SECOP search result (`id`), platform-prefixed: e.g. `secop_ii:CO1.PCCNTR.4168447`, `secop_i:20-11-10442331`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/process-record/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "record_id": "secop_ii:CO1.REQ.1234567" }' ``` Returns `as_of`, `found`, the queried `record_id` and `process`. A `record_id` that matches nothing answers `found: false` with `process` null; that is an answer, not an error. ## Read one contract `POST /co/secop/contract-record/v1` Dataset Reads back a single contract record by the `id` a search returned. | Field | Type | Notes | | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- | | `record_id` | string | **Required.** Record id from a SECOP search result (`id`), platform-prefixed: e.g. `secop_ii:CO1.PCCNTR.4168447`, `secop_i:20-11-10442331`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/contract-record/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "record_id": "secop_ii:CO1.PCCNTR.4168447" }' ``` Returns `as_of`, `found`, the queried `record_id` and `contract`. A `record_id` that matches nothing answers `found: false` with `contract` null. ## Contracts by provider This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/secop), `POST /co/secop/contracts-search/v1`, instead. `POST /co/secop/contracts-by-provider/v1` Lists the contracts awarded to one provider (cédula or NIT) across every contracting entity: the contractor profile. | Field | Type | Notes | | ----------------- | ------- | -------------------------------------------------------------------------------------- | | `document_number` | string | **Required.** Provider cédula or NIT (4-20 alphanumeric). | | `entity_nit` | string | Optional. Only contracts with this contracting entity (digits, no verification digit). | | `from_date` | string | Optional. Sign date lower bound (`yyyy-mm-dd`, inclusive). | | `to_date` | string | Optional. Sign date upper bound (`yyyy-mm-dd`, inclusive). | | `page` | integer | Optional. 1-based page of 500. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/contracts-by-provider/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "79372917" }' ``` Returns `document_number`, the echoed filters (`entity_nit`, `from_date`, `to_date`), `count`, `capped`, `contracts[]` (same contract shape as below), and a `pagination` object (`total`, `page_size`, `total_pages`, `page`). Pages of 500, newest first; when `capped` is `true` the page is full, so request the next `page` or narrow the search. ## Processes by entity This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/secop), `POST /co/secop/processes-search/v1`, instead. `POST /co/secop/processes-by-entity/v1` Lists the procurement processes published by one contracting entity (by NIT), optionally within a publication-date window: the audit population for an entity. Returns lean summaries; drill into one with the by-notice lookup above. | Field | Type | Notes | | ----------------- | ------- | --------------------------------------------------------------------- | | `document_number` | string | **Required.** Contracting entity NIT (digits, no verification digit). | | `from_date` | string | Optional. Publication date lower bound (`yyyy-mm-dd`, inclusive). | | `to_date` | string | Optional. Publication date upper bound (`yyyy-mm-dd`, inclusive). | | `page` | integer | Optional. 1-based page of 500. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/co/secop/processes-by-entity/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "899999061", "from_date": "2026-01-01" }' ``` Returns `document_number`, `from_date`, `to_date`, `count`, `capped`, `processes[]` (each with `notice_uid`, `process_id`, `name`, `entity`, `entity_nit`, `modality`, `contract_type`, `base_price`, `phase`, `procedure_status`, `published_date`, and `url`), and a `pagination` object (`total`, `page_size`, `total_pages`, `page`). Pages of 500, newest first; when `capped` is `true` the page is full, so request the next `page`. ## Sanctions by provider This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/secop), `POST /co/secop/sanctions-search/v1`, instead. `POST /co/secop/sanctions-by-provider/v1` Lists the fines and sanctions (multas y sanciones) recorded against one state contractor. Records span 2010 to the present. | Field | Type | Notes | | ----------------- | ------ | ----------------------------------------------------------- | | `document_number` | string | **Required.** Contractor cédula or NIT (4-20 alphanumeric). | ```bash theme={"dark"} curl https://api.croma.run/co/secop/sanctions-by-provider/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1067811412" }' ``` Returns `document_number`, `count`, `capped`, and `sanctions[]`, each with `entity`, `entity_nit`, `entity_level`, `entity_order`, `municipality`, `resolution_number`, `provider`, `contract_number`, `sanction_value`, `published_date`, `final_date` (fecha de firmeza), and `url`. ## Response | Field | Notes | | ------------------ | -------------------------------------------------------------------------------------------------- | | `found` | `true` when a process matches the noticeUID; `false` leaves `process` null and `contracts` empty. | | `notice_uid` | The queried noticeUID. | | `process` | The process header (see below). | | `awards` | Per-provider award rows (see below), capped at 500. | | `awards_capped` | `true` when the awards list hit its cap; `process.awarded_value`/`award_count` stay authoritative. | | `contract_count` | Number of awarded contracts attached. | | `contracts_capped` | `true` when the contracts list hit its cap and may be incomplete. | | `contracts` | The awarded contracts (see below). | ### `process` | Field | Notes | | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `process_id`, `portfolio_id` | SECOP ids (`CO1.REQ.*`, `CO1.BDOS.*`). | | `reference` | Número del proceso (entity's internal reference). | | `name`, `description` | Nombre y descripción del procedimiento. | | `entity`, `entity_nit`, `entity_department`, `entity_city`, `entity_order` | Contracting entity. | | `procurement_unit`, `procurement_unit_city` | Unidad de contratación. | | `modality`, `modality_justification` | Modalidad de contratación. | | `contract_type`, `contract_subtype` | Tipo / subtipo de contrato. | | `unspsc_code`, `additional_categories` | UNSPSC category codes. | | `duration`, `duration_unit`, `lots` | Duración y número de lotes. | | `base_price` | Precio base estimado (COP). | | `phase`, `status_summary`, `procedure_status`, `opening_status` | Fase y estados. | | `published_date`, `last_published_date` | Fechas de publicación (`yyyy-mm-dd`). | | `bid_deadline` | Deadline for providers to submit offers. | | `awarded`, `awarded_value`, `award_count`, `award_date` | Award flag, total adjudicated across every award, how many awards it spans, and the award date (can lag; `contracts` is authoritative). | | `invited_providers`, `directly_invited_providers`, `interested_providers` | Provider-funnel metrics. | | `responses`, `external_responses`, `offer_responses`, `unique_responding_providers`, `views` | Participation metrics. | | `url` | The OpportunityDetail page. | ### `awards[]` One row per awarded provider (framework agreements award many): | Field | Notes | | ------------------------------------------- | ------------------------------------------------- | | `provider`, `provider_nit`, `provider_code` | The awarded provider. | | `provider_department`, `provider_city` | Provider location. | | `awarded_value` | This provider's slice of the process award (COP). | | `award_date` | Fecha de adjudicación. | ### `contracts[]` | Field | Notes | | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | `contract_id`, `reference` | SECOP contract id (`CO1.PCCNTR.*`) and reference. | | `entity`, `entity_nit`, `centralized_entity` | Contracting entity (`Centralizada`/`Descentralizada`). | | `provider`, `provider_document`, `provider_document_type`, `provider_code` | The awarded provider. | | `is_sme`, `is_group` | Es PyME / plural structure (unión temporal, consorcio). | | `legal_rep_name`, `legal_rep_document_type`, `legal_rep_document` | Representante legal and their identity document. | | `status`, `contract_type`, `object` | Estado, tipo y objeto del contrato. | | `modality`, `modality_justification` | How the contract was procured (direct contracting vs tender). | | `unspsc_code` | UNSPSC category code. | | `delivery_conditions` | Condiciones de entrega. | | `value` | Valor del contrato (COP). | | `invoiced_value`, `paid_value`, `pending_execution_value`, `pending_payment_value` | Execution amounts. | | `advance_payment_enabled`, `advance_payment_value`, `amortized_value`, `pending_amortization_value` | Advance-payment exposure and amortization. | | `sign_date`, `start_date`, `end_date`, `added_days`, `duration` | Cronograma del contrato. | | `can_be_extended`, `extension_notice_date` | Prórroga and its notice date. | | `requires_liquidation`, `liquidation_start_date`, `liquidation_end_date` | Liquidación stage and window. | | `has_environmental_obligation`, `has_post_consumption_obligations`, `has_reversion` | Contractual obligation flags. | | `location` | Localización. | | `supervisor`, `expense_orderer`, `funding_origin`, `expense_destination` | Supervisión, origen de los recursos, destino del gasto (`Inversión`/`Funcionamiento`). | | `sector`, `branch`, `updated_date` | Sector, rama, última actualización. | Empty and placeholder values are normalized to `null`. Monetary and count fields are numbers; dates are `yyyy-mm-dd`. A process also has sections available only on SECOP's own site (Documentos Tipo, Cuestionario, Observaciones, document downloads) or in other SECOP records (plan anual de adquisiciones, presupuesto detail). Those are not part of these responses. Schemas, all response fields, and an interactive playground. # SIATA Source: https://docs.usecroma.com/guides/colombia/siata Live weather, rainfall and air-quality readings from SIATA stations across the Aburrá Valley (Medellín). Deprecated: replaced by the SIATA Geoportal. This endpoint is deprecated since 2026-08-27 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/siata-geoportal), `POST /co/siata-geoportal/weather/v1`, instead. Queries SIATA (Sistema de Alerta Temprana de Medellín y el Valle de Aburrá) for the current readings of every monitoring station in the Aburrá Valley: weather (temperature, humidity, wind, pressure), rainfall (accumulated and intensity), and air quality (24-hour PM2.5 and ICA index). `POST /co/siata/v1` | Field | Type | Notes | | ----------- | ------ | ------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }' ``` All fields are optional. An empty body returns every station in the valley; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated on each station. The response groups stations by kind: `meteorology`, `rain` and `air_quality`. Individual readings are `null` when a station hasn't reported them. Air-quality values are 24-hour averages; `updated_at` marks the end of the averaging window. Without a location filter, `distance_km` is `null` on every station. Coverage is the Medellín metropolitan area (Valle de Aburrá) only. Points outside the valley return empty arrays rather than an error. Schemas, all response fields, and an interactive playground. # SIATA Geoportal Source: https://docs.usecroma.com/guides/colombia/siata-geoportal Weather, river levels with flood thresholds, rainfall, air quality, forecasts, alerts, seismic events and live cameras for the Aburrá Valley (Medellín). Queries the SIATA geoportal (Sistema de Alerta Temprana de Medellín y el Valle de Aburrá) for everything its station networks publish: weather with a 12-hour series and the UV index, river, stream and storm-sewer levels with flood thresholds and the source's alert colours, rainfall accumulated over seven windows plus monthly totals, air quality per pollutant with the numeric ICA index, the citizen PM2.5 sensor network, the two-day forecast per municipality, official notices, the last seismic events and the camera network's latest snapshots. This source supersedes [SIATA](/guides/colombia/siata), which is deprecated. ## Weather `POST /co/siata-geoportal/weather/v1` | Field | Type | Notes | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. | | `station_code` | string | Optional. Returns only the station with that code, e.g. `520`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/weather/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }' ``` All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. | Field | Notes | | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `stations[].temperature_c`, `humidity_pct`, `wind_speed_ms`, `wind_direction_deg`, `wind_direction_cardinal`, `pressure_hpa` | The station's latest readings. `null` when the station has not reported. | | `stations[].series_12h` | Hourly temperature and humidity over the last 12 hours, oldest first, each with its ISO timestamp `at`. | | `stations[].updated_at` | ISO timestamp of the station's last update at the source. | | `uv` | The valley's UV reading: `index`, the source's `category` (`Bajo`, `Moderado`, `Alto`, ...), `temperature_c`, `measured_at`, and today's hourly `series`. `null` when the sensor has not reported. | Readings refresh at the source every five minutes. The response is cached for one minute. ## Weather station series `POST /co/siata-geoportal/weather-series/v1` | Field | Type | Notes | | -------------- | ------ | --------------------------------------------------------------------------------------------------------------------- | | `station_code` | string | **Required.** Station code, e.g. `202`. Codes come from the `weather` endpoint. | | `window` | enum | `1h` for the last hour at one-minute resolution, `6h` for the last six hours at five-minute resolution. Default `1h`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/weather-series/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "station_code": "202", "window": "1h" }' ``` | Field | Notes | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `found` | `false` when the source has no station with that code. Nothing else is returned in that case. | | `points[]` | Readings over the window, oldest first: `at` (ISO timestamp), `temperature_c`, `humidity_pct`, `wind_speed_ms`, `pressure_hpa`. One point per minute for `1h`, one per five minutes for `6h` (`resolution_minutes`). A variable the station does not measure is `null`. | | `mean`, `mean_3h` | The source's mean of each variable over the whole window, and over the last three hours (only with `6h`). | | `temperature_percentiles` | The station's temperature percentiles (`p10` to `p90`) as the source reports them, for context. | Station codes come from the `weather` endpoint. The response is cached for one minute. ## River levels `POST /co/siata-geoportal/river-levels/v1` | Field | Type | Notes | | ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. | | `station_code` | string | Optional. Returns only the station with that code, e.g. `520`. | | `include_series` | boolean | Optional. When `true`, each station carries `series_3h`, one reading per minute for the last three hours. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/river-levels/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }' ``` All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. `include_series` adds `series_3h` to each station. | Field | Notes | | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `stations[].kind` | `river` for a river or stream gauge, `sewer` for a storm-sewer sensor. | | `stations[].level_m`, `measured_at` | Latest water level in metres and its ISO timestamp. `null` when the station has not reported. | | `stations[].thresholds` | The station's flood thresholds in metres: `safe_m`, `caution_m`, `minor_flood_m`, `major_flood_m`. `null` for sewer sensors. | | `stations[].status` | Where the latest level sits against those thresholds: `normal`, `elevated`, `caution`, `minor_flood` or `major_flood`. `null` when either is missing. | | `stations[].max_level_3h_m`, `mean_level_3h_m` | Highest and mean level over the last three hours. | | `stations[].series_3h` | One reading per minute over the last three hours, oldest first. Only with `include_series`; `null` otherwise. | | `stations[].alert_color`, `alert_level` | The source's own traffic light (`green`, `yellow`, `orange`, `red`) and alert level, `0` (normal) to `3`. `null` when not assessed. | | `stations[].windows` | The representative level over each trailing window (`last_30m`, `last_1h`, `last_3h`, `last_24h`, `last_72h`, `last_30d`), each with its own `level_m`, `measured_at` and `alert_color`. | | `stations[].basin`, `land_cover_pct` | Morphology of the basin the gauge drains (area, perimeter, channel length, elevations, slopes, drainage density, time of concentration, urbanised share) and its land cover in percent. `null` when the source has none for the station. | | `advisories` | Operational notices the source is currently showing for these layers, as plain text. Empty when there are none. | Levels and thresholds refresh at the source every five minutes; alert colours, windows and sewer readings every 15 minutes to an hour. The response is cached for one minute. ## Rainfall `POST /co/siata-geoportal/rainfall/v1` | Field | Type | Notes | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. | | `station_code` | string | Optional. Returns only the station with that code, e.g. `520`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/rainfall/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }' ``` All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. | Field | Notes | | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `stations[].is_raining` | Whether the gauge is registering rain right now. `extreme_rain` and `extreme_category` carry the source's extreme-rain flag and category when it raises one. | | `stations[].accumulated_mm` | Rain accumulated over each trailing window: `last_5m`, `last_30m`, `last_1h`, `last_3h`, `last_24h`, `last_72h`, `last_30d`. `null` when the gauge has not reported. | | `stations[].monthly` | One entry per month of the current year the gauge has data for, as `month` (`YYYY-MM`), `total_mm` and `data_availability_pct` (the share of the month the gauge reported). | | `stations[].sub_basin` | The stream or river basin the gauge sits in. `village` and `district` are the rural vereda and corregimiento when the gauge is outside the urban area. | | `advisories` | Operational notices the source is currently showing for this layer, as plain text. | Rain flags refresh at the source every five minutes, accumulations every 15. The response is cached for one minute. ## Air quality `POST /co/siata-geoportal/air-quality/v1` | Field | Type | Notes | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. | | `station_code` | string | Optional. Returns only the station with that code, e.g. `520`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/air-quality/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "municipality": "Medellín" }' ``` All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. | Field | Notes | | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `stations[].pm25`, `pm10` | 24-hour particulate readings as `{ concentration, unit, index, category, window_start, window_end }`, `unit` = `ug/m3`. | | `stations[].o3_8h`, `no2_1h`, `so2_1h`, `co_8h` | Gas readings over the window in the field name, `unit` = `ppb`. | | `...index`, `...category` | Colombia's air-quality index (ICA) for the reading and its category: `Buena` (0-50), `Moderada` (51-100), `Dañina a la salud de grupos sensibles` (101-150), `Dañina a la salud` (151-200), `Muy dañina a la salud` (201-300), `Peligrosa` (301+). | | `stations[].dominant_pollutant`, `dominant_index` | The pollutant with the highest index at the station (`PM2.5`, `PM10`, `O3`, `NO2`, `SO2` or `CO`) and that index. | | `stations[].station_short` | The source's short station id, e.g. `BAR-TORR`. | A pollutant the station does not measure is `null`. Readings refresh at the source hourly. The response is cached for one minute. ## Citizen air sensors `POST /co/siata-geoportal/citizen-sensors/v1` | Field | Type | Notes | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. | | `station_code` | string | Optional. Returns only the station with that code, e.g. `520`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/citizen-sensors/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 3 }' ``` All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. | Field | Notes | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | `sensors[].pm25_1h` | PM2.5 over the last hour, in ug/m3. | | `sensors[].index_daily`, `category` | The daily PM2.5 air-quality index (ICA) and its category. | | `sensors[].available` | Whether the sensor is currently reporting. `data_recovery_24h_pct` and `data_recovery_15d_pct` say how complete its recent record is. | These are low-cost sensors run by volunteers; treat them as indicative and use `air-quality` for the reference network. Readings refresh at the source hourly. The response is cached for one minute. ## Forecast `POST /co/siata-geoportal/forecast/v1` | Field | Type | Notes | | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `municipality` | string | Optional. One of the valley's municipalities, e.g. `Medellín`, `Bello`, `Itagüí`, or one of Medellín's zones (`Centro`, `Occidente`, `Oriente`, `Palmitas`). Accents and case are ignored. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/forecast/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "municipality": "Medellín" }' ``` Without `municipality` the response carries every zone the source forecasts: the ten municipalities of the valley, with Medellín split into `Centro`, `Occidente`, `Oriente` and `Palmitas` (`zone`). | Field | Notes | | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `zones[].issued_at` | ISO timestamp of the forecast run. | | `zones[].days[]` | Today and tomorrow: `date`, `temperature_max_c`, `temperature_min_c` and `rain`, the likelihood of rain per part of the day (`early_morning`, `morning`, `afternoon`, `night`) as the source words it: `BAJA`, `MEDIA` or `ALTA`. | The source issues the forecast once a day, around 09:30 local time. The response is cached for one minute. ## Alerts `POST /co/siata-geoportal/alerts/v1` | Field | Type | Notes | | -------------- | ------- | ---------------------------------------------------------------------------------------- | | `include_past` | boolean | Optional. When `true`, returns past notices as well as the active ones. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/alerts/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "include_past": true }' ``` | Field | Notes | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `alerts[]` | Official notices from the early-warning system, most recent first: `id`, `title`, `description` (plain text), `start_date`, `end_date`, `is_active` and `audience` (who the source addresses it to, e.g. `citizen`). Empty when nothing is active. | The response is cached for one minute. ## Seismic events `POST /co/siata-geoportal/seismic-events/v1` | Field | Type | Notes | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. | | `station_code` | string | Optional. Returns only the station with that code, e.g. `520`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/seismic-events/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' ``` All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. | Field | Notes | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `stations[].kind` | `accelerograph` or `seismograph`, with the station's `sensor` and `technology`. | | `stations[].events[]` | The last events the station recorded, most recent first: `occurred_at`, `magnitude`, `epicenter`, `depth_km`, the epicentre's `latitude` and `longitude`, and what the station measured: `peak_acceleration_cm_s2` and `intensity_mmi` (Modified Mercalli, e.g. `IV`) on accelerographs, `peak_velocity_cm_s` on seismographs. | The source updates this when an event is recorded. The response is cached for one minute. ## Cameras `POST /co/siata-geoportal/cameras/v1` | Field | Type | Notes | | ----------- | ------ | ------------------------------------------------------------- | | `latitude` | number | Optional. -90 to 90. Must be sent together with `longitude`. | | `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. | | `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. | | `type` | string | Optional. `nivel`, `cielo`, `deprimido` or `capa_limite`. | ```bash theme={"dark"} curl https://api.croma.run/co/siata-geoportal/cameras/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "type": "nivel", "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }' ``` All fields are optional. `latitude` + `longitude` (with `radius_km`) return the nearby cameras nearest first with `distance_km`; `type` keeps one kind. | Field | Notes | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | `cameras[].type` | `nivel` (pointed at a river gauge), `cielo` (sky), `deprimido` (underpass) or `capa_limite` (boundary layer), with the source's label in `type_label`. | | `cameras[].snapshot_url` | The latest still from the camera. The source refreshes it about every minute; fetch it when you need it rather than storing the URL's content. | The response is cached for one minute. Coverage is the Medellín metropolitan area (Valle de Aburrá) only. Points outside the valley return empty arrays rather than an error. Schemas, all response fields, and an interactive playground. # SICAAC Source: https://docs.usecroma.com/guides/colombia/sicaac Look up natural-person insolvency proceedings registered in Colombia's SICAAC system by document, with status, parties and assigned operator for each case. Looks up natural-person insolvency proceedings (insolvencia de persona natural) registered in the Ministerio de Justicia's SICAAC system. `POST /co/sicaac/insolvency-cases/v1` | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------------------------------ | | `document_type` | enum | Colombian document type (`CC`, `CE`, `TI`, `RC`, `PA`, `NIT`, `NA`, `NIE`, `DEC`). Default `CC`. | | `document_number` | string | **Required.** 3-30 chars. | ```bash theme={"dark"} curl https://api.croma.run/co/sicaac/insolvency-cases/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1020745812" }' ``` The response echoes the document that was looked up and lists every insolvency case registered against it: | Field | Notes | | ---------------------- | ------------------------------------------------------------------------- | | `document_type` | Document type the lookup used. | | `document_type_label` | Readable label for `document_type`, e.g. "CÉDULA DE CIUDADANÍA". | | `document_number` | Document number the lookup used. | | `cases` | Insolvency cases found. Empty array when the person has none. | | `cases[].entity_name` | Entity that registered the case, such as a conciliation centre or notary. | | `cases[].party_type` | Role the person holds in the case, e.g. `DEUDOR`. | | `cases[].request_date` | Filing date as `YYYY-MM-DD`, or `null` when the source omits it. | This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. The accepted `document_type` values are enumerated in the API reference. Schemas, all response fields, and an interactive playground. # SIMIT Source: https://docs.usecroma.com/guides/colombia/simit Look up a SIMIT account status by vehicle plate or identification number: traffic fines, sanctions, pending balances and payment agreements in one call. Looks up a SIMIT (Sistema Integrado de Información sobre Multas y Sanciones por Infracciones de Tránsito) account status. Given a single search term, either a vehicle plate or a person's identification number, it returns the outstanding comparendos and multas, the account totals, any payment agreements, and driving courses. The same term covers both cases: pass a plate to see a vehicle's fines, or an identification number to see a person's. The response reports which one matched. `POST /co/simit/account-status/v1` | Field | Type | Notes | | ----------------- | ------ | -------------------------------------------------------------------------------------------------------- | | `document_number` | string | **Required.** A vehicle plate (e.g. `ABC123`) or an identification number. 4-20 alphanumeric characters. | ```bash theme={"dark"} curl https://api.croma.run/co/simit/account-status/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "ABC123" }' ``` ## Response | Field | Notes | | -------------------- | ---------------------------------------------------------------------------------- | | `found` | `true` when an account was returned for the term. | | `document_number` | The normalized request value (spaces removed, uppercased). | | `is_plate` | `true` when the value matched a vehicle plate, `false` when it matched a document. | | `clear` | `true` when there is nothing outstanding (paz y salvo). | | `summary` | Account totals (see below). | | `fines` | The outstanding comparendos and multas (see below). | | `payment_agreements` | Payment agreements (acuerdos de pago). | | `driving_courses` | Driving courses (cursos viales). | ### `summary` `total` (total owed), `total_fines`, `total_agreements`, `payable_total`, and `payable_fines_count`. Amounts are numbers in Colombian pesos; missing values are `null`. ### `fines[]` | Field | Notes | | -------------------------- | ---------------------------------------------------------------------------------- | | `ticket_number` | The comparendo number. | | `status` | Fine status, e.g. `Pendiente`. | | `is_comparendo` | `true` for a comparendo. | | `plate` | The vehicle plate. | | `traffic_authority` | The issuing traffic authority (organismo de tránsito). | | `department` | The department. | | `amount`, `amount_payable` | Original amount and amount currently payable. | | `infraction_date` | Infraction date as `yyyy-mm-dd`, or `null`. | | `offender` | The party tied to the fine: `document_type`, `document_number`, `name`. | | `infractions[]` | Each infraction's `code` (e.g. `C40`), `description`, and `amount`. | | `payment_projections[]` | Discount/payment options: `description`, `amount`, `date`, `days`, `instructions`. | Amounts are numbers, dates are `yyyy-mm-dd`, and missing values are `null`. This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can set `Prefer: wait=N`, poll `GET /jobs/{id}`, or supply a `callback_url`. Schemas, all response fields, and an interactive playground. # Superfinanciera Source: https://docs.usecroma.com/guides/colombia/superfinanciera Search every Circular Externa, Carta Circular and Resolución the Superintendencia Financiera de Colombia has issued since 2005, and track a jurisdictional complaint. Two things the Superintendencia Financiera de Colombia publishes. The first is its normative register: every Circular Externa, Carta Circular and Resolución issued since 2005, searchable across kinds and years in one query, with the official description of what each act does and a link to the act itself. The second is the action history of a jurisdictional complaint (demanda) filed against a supervised entity. ## Search the normative register `POST /co/superfinanciera/regulations-search/v1` Dataset One search across circulares externas, cartas circulares and resoluciones from 2005 to today, which the Superintendencia's own site does not offer. | Field | Type | Notes | | ------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words to match in the official description of the act, its citation and its number. | | `kind` | enum | `circular_externa` (instructions binding on supervised entities), `carta_circular` (informative, creates no obligation), `resolucion` (an administrative act), or `any`. Default `any`. | | `year` | integer | Optional year the act was issued, 2005 or later. Omit or pass 0 to search every year. Default `0`. | | `number` | string | Optional exact number. Leading zeros are optional: `7` and `007` find the same act. | | `bulletin` | string | Optional issue of the Boletín del Ministerio de Hacienda y Crédito Público, Capítulo Superintendencia Financiera. | | `issued_from` | string | Optional: only acts issued on or after this date, `yyyy-mm-dd`. | | `issued_to` | string | Optional: only acts issued on or before this date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-50). Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/co/superfinanciera/regulations-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "riesgo de crédito", "kind": "circular_externa" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `results[]`, most recent first. Every result carries `id`, `kind`, `number` as the register prints it, `number_key` (the same number with leading zeros dropped), `year`, `issued_at`, `title` (how the act is cited), `description` (what the act does, in the Superintendencia's own words), `bulletin` (the issue of the Boletín del Ministerio de Hacienda y Crédito Público it was published in), `document_url`, `attachments[]` and `official_url`. The whole register, from 2005 to this week's acts, ready to query. The acts themselves stay where the Superintendencia publishes them: `document_url` is the address to read one, and the file format follows the era it was issued in. ## One act `POST /co/superfinanciera/regulation/v1` Dataset | Field | Type | Notes | | --------------- | ------ | ----------------------------------------------------------------------------------------------------------------------- | | `regulation_id` | string | **Required.** The `id` from the search results: kind, year and number, e.g. `ce:2026:7`, `cc:2026:56`, `res:2026:1195`. | ```bash theme={"dark"} curl https://api.croma.run/co/superfinanciera/regulation/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "regulation_id": "ce:2026:7" }' ``` Returns `as_of`, `found`, `regulation_id` and `regulation`. Every result carries `id`, `kind`, `number` as the register prints it, `number_key` (the same number with leading zeros dropped), `year`, `issued_at`, `title` (how the act is cited), `description` (what the act does, in the Superintendencia's own words), `bulletin` (the issue of the Boletín del Ministerio de Hacienda y Crédito Público it was published in), `document_url`, `attachments[]` and `official_url`. An id the register does not carry returns `found: false` with HTTP 200, not an error. ## Request `POST /co/superfinanciera/complaints/v1` | Field | Type | Notes | | ----------------- | ------ | --------------------------------------------------------------------- | | `document_number` | string | **Required.** 5-20 digits. | | `filing_number` | string | **Required.** Exactly 10 digits (the complaint's `numeroRadicación`). | ```bash theme={"dark"} curl https://api.croma.run/co/superfinanciera/complaints/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "1234567890", "filing_number": "2024051440" }' ``` ## Response `actions` is the complaint's action history (actuaciones), one entry per step, oldest first. A filing with nothing against it returns an empty array. | Field | Notes | | ------------- | ----------------------------------------------------------------- | | `action_date` | Date of the action (`yyyy-mm-dd`), or `null`. | | `record_id` | The action's record id, e.g. `2024051440-001-000`. | | `party` | Party or office involved (petitioner, court unit, or the entity). | | `action` | The action performed, e.g. `AUTO ADMISORIO VERBAL SUMARIO`. | | `attachments` | Documents filed with the action, or `null`. | | `annexes` | Annexes to the action, or `null`. | This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. No matches returns an empty `actions` array, not an error. Schemas, all response fields, and an interactive playground. # Supersociedades Source: https://docs.usecroma.com/guides/colombia/supersociedades Annual financial statements filed by Colombian companies with Supersociedades, by NIT: income statement, balance sheet and cash flow per fiscal year. Returns the annual financial statements a Colombian company has filed with the Superintendencia de Sociedades: income statement, balance sheet and cash flow per fiscal year, plus the company identity from the filing cover. `POST /co/supersociedades/financial-statements/v1` | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------- | | `document_number` | string | **Required.** Colombian NIT, numeric, no verification digit. 4-15 digits. | ```bash theme={"dark"} curl https://api.croma.run/co/supersociedades/financial-statements/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "900249127" }' ``` The response returns one entry per fiscal year (latest filing per year, newest first, up to 10 years): | Field | Notes | | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `found` | `false` when the NIT has no filings on record. | | `document_number` | Echoes the requested NIT. | | `company` | Identity from the newest filing: `name`, `status`, `society_type`, `primary_activity` (CIIU `code` + `description`), `incorporation_date`, `city`, `department`, `registration_number`. | | `count` | Fiscal years returned. | | `capped` | `true` when the result cap was hit; results are then incomplete. | | `statements[].year` | Fiscal year; `cutoff_date` is always December 31. | | `statements[].filing_id` | Filing number; re-submissions replace earlier ones. | | `statements[].statement_type` | What the filing covers: `individual`, `separado`, `consolidado` or `combinado`. Standalone (`individual`) filings are preferred when a year has several. | | `statements[].niif_group` | Reporting framework: `plenas` (group 1) or `pymes` (group 2). | | `statements[].reporting_unit` | Unit the filer declared for every figure. Filings for fiscal 2025 onward declare `MILES DE PESOS` (thousands of COP); earlier filings did not declare a unit, so it is `null`. | | `statements[].income_statement` | `revenue`, `cost_of_sales`, `gross_profit`, `operating_profit`, `profit_before_tax`, `income_tax`, `net_income`, expense and finance lines. | | `statements[].balance_sheet` | `total_assets`, `total_liabilities`, `total_equity`, current/non-current splits, cash, inventories, receivables, payables, capital. | | `statements[].cash_flow` | `net_cash_from_operating`, `net_cash_from_investing`, `net_cash_from_financing`, plus `cash_at_start` and `cash_at_end`. | Figures come exactly as filed, in the filing's `reporting_unit`. A concept the company did not report is `null`, and `cash_flow` can be `null` for filings without one. Not every Colombian company reports to Supersociedades: entities supervised elsewhere (banks and insurers, for example) will typically return `found: false`. Schemas, all response fields, and an interactive playground. # Extract Source: https://docs.usecroma.com/guides/global/extract Turn any public web page into clean Markdown with boilerplate stripped, or into a typed object whose shape you define with a JSON Schema, in one call. Read a public web page and get back something a program can use: Markdown with the navigation and boilerplate stripped, or a typed object whose shape you define. Pages that build themselves in the browser are handled at `effort: max`. Both endpoints share the same page option. | Field | Type | Notes | | -------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `effort` | enum | `min`, `standard`, or `max`. Default `standard`. `min` is fastest and may serve a recent copy of the page; `max` always reads the page live and handles pages that render themselves in the browser. | ## Page as Markdown `POST /global/extract/markdown/v1` | Field | Type | Notes | | ------------------ | ------- | ------------------------------------------------------------------------------------------------ | | `url` | string | **Required.** Public http or https URL. Loopback and private addresses are rejected. | | `scope` | enum | `main` keeps the article body and drops navigation; `full` keeps the whole page. Default `main`. | | `include_metadata` | boolean | Include the page's title, author, published date and image. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/global/extract/markdown/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304", "include_metadata": true }' ``` | Field | Notes | | ---------- | -------------------------------------------------------------------------------------------------------------------------------- | | `url` | The page that was read, after any redirects. | | `markdown` | The page as Markdown. | | `metadata` | Title, author, published date and image; a field the page does not declare is `null`. `null` unless `include_metadata` was true. | ## Page as JSON `POST /global/extract/json/v1` Describe the object you want with a JSON Schema and the fields are located on the page and returned under `result`, already typed. Describe each field: the description is what the field is matched on. | Field | Type | Notes | | ------------- | ------ | ------------------------------------------------------------------------------------ | | `url` | string | **Required.** Public http or https URL. Loopback and private addresses are rejected. | | `json_schema` | object | **Required.** JSON Schema for the object to return. | ```bash theme={"dark"} curl https://api.croma.run/global/extract/json/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304", "json_schema": { "type": "object", "required": ["title"], "properties": { "title": { "type": "string", "description": "Nombre de la norma." }, "issued_on": { "type": "string", "description": "Fecha de expedición." } } } }' ``` | Field | Notes | | -------- | --------------------------------------------------- | | `url` | The page that was read, after any redirects. | | `result` | The object described by the `json_schema` you sent. | A page with no readable body returns `404` telling you which option to change. A `json_schema` that is not valid JSON Schema returns `400` naming the field. Fields the page does not carry come back absent or empty rather than invented. To produce values that are not on the page — a summary, a classification, a translation — use [Generate](/guides/global/generate) instead. Extract has a tighter quota than most endpoints: **60 requests per hour** per organization, and each call also counts against your **100 requests per day**. See [Rate limits](/rate-limits). Schemas, all response fields, and an interactive playground. # Generate Source: https://docs.usecroma.com/guides/global/generate Read a public web page and generate a new object from it, a summary, classification or translation, following your instructions and your JSON Schema. Read a public web page and return an object built from it: a summary, a classification, a translation, a reshaped record. Unlike [Extract](/guides/global/extract), the fields need not appear on the page. ## Page into an object `POST /global/generate/json/v1` | Field | Type | Notes | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | string | **Required.** Public http or https URL. Loopback and private addresses are rejected. | | `instructions` | string | **Required.** 3-20,000 chars. What to do with the page. Write it as you would brief an analyst. | | `json_schema` | object | **Required.** JSON Schema for the object to return. | | `effort` | enum | `min`, `standard`, or `max`. Default `standard`. `min` is fastest and may serve a recent copy of the page; `max` always reads the page live and handles pages that render themselves in the browser. | ```bash theme={"dark"} curl https://api.croma.run/global/generate/json/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304", "instructions": "Resume la norma en dos frases y clasifica su materia principal.", "json_schema": { "type": "object", "required": ["summary", "subject"], "properties": { "summary": { "type": "string" }, "subject": { "type": "string" } } } }' ``` | Field | Notes | | -------- | --------------------------------------------------- | | `url` | The page that was read, after any redirects. | | `result` | The object described by the `json_schema` you sent. | The output is written from the page, so treat it as a draft: check anything you act on against the page itself, which [Extract](/guides/global/extract) returns verbatim. Generate has a tighter quota than most endpoints: **60 requests per hour** per organization, shared with Extract, and each call also counts against your **100 requests per day**. See [Rate limits](/rate-limits). Schemas, all response fields, and an interactive playground. # Research Source: https://docs.usecroma.com/guides/global/research Ask an open question and get a cited Markdown report researched from live web sources, with numbered citations and the full list of sources behind it. Ask an open question and get back a written report in Markdown with numbered citations, plus the list of sources behind it. This is a research pass over live sources, not a lookup against a registry: a call typically takes a few seconds. ## Research a question `POST /global/research/v1` | Field | Type | Notes | | ------- | ------ | -------------------------------------------------------------- | | `query` | string | **Required.** 10-2,000 chars. The question, in plain language. | ```bash theme={"dark"} curl https://api.croma.run/global/research/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "¿Qué cambios trajo la Ley 2195 de 2022 en materia de responsabilidad de personas jurídicas en Colombia?" }' ``` | Field | Notes | | ---------------- | ----------------------------------------------------------------------------- | | `query` | Echoes the question asked. | | `report` | The report in Markdown. Bracketed numbers such as `[1]` index into `sources`. | | `sources` | The pages the report drew on, each with `title` and `url`. | | `pages_analyzed` | How many sources the report drew on. | A report is a starting point, not a citation. Verify anything you act on against the primary source — for Colombian case law and public records, the country guides return the record itself. Research has the tightest quota on the API: **10 requests per hour** per organization, and each call also counts against your **100 requests per day**. See [Rate limits](/rate-limits). Schemas, all response fields, and an interactive playground. # Web Search Source: https://docs.usecroma.com/guides/global/web-search Run an AI-powered web search from the Croma API and get structured results: URLs, titles, authors, dates, highlighted excerpts and relevance scores. Runs an AI-powered web search and returns structured results: URLs, titles, authors, dates, highlights, and relevance scores. `POST /global/web-search/v1` | Field | Type | Notes | | ------- | ------- | --------------------------- | | `query` | string | **Required.** 3-300 chars. | | `limit` | integer | 1-25 results. Default `10`. | ```bash theme={"dark"} curl https://api.croma.run/global/web-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "croma api colombia", "limit": 10 }' ``` Web Search has a tighter quota than other endpoints: **10 requests per hour** per organization, and each call also counts against your **100 requests per day**. See [Rate limits](/rate-limits). Schemas, response fields, and an interactive playground. # Banxico Source: https://docs.usecroma.com/guides/mexico/banxico Browse every circular and disposición issued by Banco de México since 1969, with abrogation status, subject index and consolidated text for each entry. The chronological index of Banco de México circulares and disposiciones: 1,200+ entries back to 1969, each with its subject, whether it is still in effect, and which base circular it modifies. List by year, then open one for its consolidated text and modification chain. ## Circulars `POST /mx/banxico/circulars/v1` | Field | Type | Notes | | ------ | ------- | ----------------------------------------------- | | `year` | string | Optional 4-digit year. Omit to list every year. | | `page` | integer | 1-based page number. 100 per page. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/mx/banxico/circulars/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "year": "2026" }' ``` Returns `year` (echo of the filter, null when listing every year), `circulars`, and `pagination`. | Field | Notes | | ------------ | ------------------------------------------------------------------ | | `number` | Circular number as printed, e.g. `11/2026`, `E-126/2013`, `S/N`. | | `year` | Year of issue. | | `subject` | What the circular covers. | | `modifies` | Base circular number when this one amends another; otherwise null. | | `abrogated` | `true` when no longer in effect. | | `has_detail` | Whether this entry links to a full record. | One row per index entry, so a circular that amends several base circulars appears once per base. ## One circular `POST /mx/banxico/circular/v1` | Field | Type | Notes | | -------- | ------ | -------------------------------------------------------------------------------------- | | `number` | string | **Required.** Circular number as listed (e.g. `3/2012`). Matching is case-insensitive. | ```bash theme={"dark"} curl https://api.croma.run/mx/banxico/circular/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "number": "3/2012" }' ``` Returns `found`, `number`, and `circular`, which carries `title`, `subject`, `abrogated`, `obligated_subjects` (who it binds), `compiled_pdf_url` (current consolidated text, all modifications applied), `original_pdf_url` and `original_dof_date` (as first published), `comparison_pdf_url` (a consolidated comparison of every modification, when offered), `abrogated_by` (the abrogating instrument, or null while in force), `official_url`, and `modifications`: each amending circular with its `circular_number`, `dof_date`, `pdf_url`, and `description`. Amendment circulars have no record of their own. Looking one up returns the **amended base circular**: the top-level `number` echoes what you asked for, `circular.number` is the base circular's own number, and the requested número appears in its `modifications` list. When no entry with that number has a record at all, the lookup returns `found: false`. Schemas, all response fields, and an interactive playground. # CNBV Source: https://docs.usecroma.com/guides/mexico/cnbv Browse the CNBV's banking and securities regulations, including the Circular Única de Bancos, with each norm's sectors, text and modification history. The Comisión Nacional Bancaria y de Valores regulatory catalog: \~113 normas (leyes, disposiciones de carácter general, circulares, acuerdos, reglas), each with the sectors it applies to and the official text. The Circular Única de Bancos alone carries 180+ modifications, available through the history endpoint. ## Regulations `POST /mx/cnbv/regulations/v1` | Field | Type | Notes | | ------- | ------- | ------------------------------------------------------------- | | `query` | string | Optional name filter. Case- and accent-insensitive substring. | | `page` | integer | 1-based page number. 50 per page. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/mx/cnbv/regulations/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "instituciones de crédito" }' ``` Returns `regulations` and `pagination` (`total`, `page`, `page_size`, `total_pages`). | Field | Notes | | --------------- | ------------------------------------------------------------------------------------ | | `regulation_id` | Identifier for the history endpoint; null when the norm has no modification history. | | `name` | Full name of the norma. | | `type` | E.g. `Ley`, `Acuerdo`, `Circular`, `Disposiciones de carácter general`. | | `dof_date` | DOF publication date (`yyyy-mm-dd`); null when not applicable. | | `sectors` | Financial sectors the norm applies to (e.g. `Sector Bancario`). | | `pdf_url` | Official text. | ## Modification history `POST /mx/cnbv/regulation-history/v1` | Field | Type | Notes | | --------------- | ------ | --------------------------------------------------------- | | `regulation_id` | string | **Required.** The `regulation_id` from the catalog above. | ```bash theme={"dark"} curl https://api.croma.run/mx/cnbv/regulation-history/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "regulation_id": "1024" }' ``` Returns `found`, `regulation_id`, `modifications`, and `annexes`. Each modification has `description`, `dof_date`, `pdf_url`, and `order`; annexes carry `description`, `pdf_url`, and `order`. Only norms with a non-null `regulation_id` have a history. Norms published once and never amended return `found: false`. Schemas, all response fields, and an interactive playground. # CNSF Source: https://docs.usecroma.com/guides/mexico/cnsf Search Mexico's insurance and surety rulebook: the LISF and the Circular Única de Seguros y Fianzas provision by provision, with their amendment history. The rules Mexican insurers and sureties actually have to comply with, in force and in full: the Ley de Instituciones de Seguros y de Fianzas (the law) and the Circular Única de Seguros y de Fianzas (the circular that implements it, with its annexes). Search across both at once, or pull one artículo, disposición or anexo by its number. A second endpoint tracks every Circular Modificatoria since 2014: what changed, and the Diario Oficial publication behind it. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search provisions `POST /mx/cnsf/provisions-search/v1` Dataset One search across the law and the circular at once, which the commission's own site does not offer. | Field | Type | Notes | | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `query` | string | Optional words to match in the text of the provision and in its chapter and título names. | | `instrument` | enum | `LISF` for the law, `CUSF` for the circular, or `any` for both. Default `any`. | | `kind` | enum | `articulo` (LISF), `disposicion` or `anexo` (CUSF), or `any`. Default `any`. | | `number` | string | Optional exact number as the instrument writes it: `41`, `3.1.2`, `14.2.1-a`. | | `chapter_number` | string | Optional chapter, e.g. `6.3`. Annexes hang off a chapter rather than sitting in one and carry no chapter number. | | `source_circular` | string | Optional, for transitional provisions: the Circular Modificatoria that introduced them (e.g. `3/2026`), or `original` for those issued with the instrument itself. | | `amended_from` | string | Optional: only provisions whose chapter was amended on or after this date, `yyyy-mm-dd`. | | `amended_to` | string | Optional: only provisions whose chapter was amended on or before this date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-25). Every result carries the full text. Default `10`. | ```bash theme={"dark"} curl https://api.croma.run/mx/cnsf/provisions-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "requerimiento de capital", "instrument": "CUSF" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `results[]` in reading order. Every result carries `id`, `instrument` (`LISF` or `CUSF`), `kind`, `number` as the instrument writes it, `title_number` and `title_name`, `chapter_number` and `chapter_name`, `heading` (the official title, on annexes and referenced documents), `text` (the full provision, fracciones and incisos included), `source_circular` (on transitional provisions, the Circular Modificatoria that introduced them), `external_url` (on referenced documents), `amendment_note` and `last_amended_at`, `position` (reading order within the instrument) and `official_url`. `kind` is one of `articulo` (LISF), `disposicion`, `anexo`, `anexo_transitorio` or `documento` (CUSF), `transitoria` (either), or `capitulo` for a chapter repealed in full, which carries the repeal notice and no numbered provisions. Both instruments in full, up to date and ready to query. `last_amended_at` is null on a provision whose chapter the source flags as never amended, which means it has stood unchanged since the instrument was issued. ## One provision `POST /mx/cnsf/provision/v1` Dataset | Field | Type | Notes | | -------------- | ------ | -------------------------------------------------------------- | | `provision_id` | string | **Required.** The `id` of a provision from the search results. | ```bash theme={"dark"} curl https://api.croma.run/mx/cnsf/provision/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "provision_id": "cusf:disp:3.1.2" }' ``` Returns `as_of`, `found`, `provision_id` and `provision`. Every result carries `id`, `instrument` (`LISF` or `CUSF`), `kind`, `number` as the instrument writes it, `title_number` and `title_name`, `chapter_number` and `chapter_name`, `heading` (the official title, on annexes and referenced documents), `text` (the full provision, fracciones and incisos included), `source_circular` (on transitional provisions, the Circular Modificatoria that introduced them), `external_url` (on referenced documents), `amendment_note` and `last_amended_at`, `position` (reading order within the instrument) and `official_url`. `kind` is one of `articulo` (LISF), `disposicion`, `anexo`, `anexo_transitorio` or `documento` (CUSF), `transitoria` (either), or `capitulo` for a chapter repealed in full, which carries the repeal notice and no numbered provisions. ## Amendments `POST /mx/cnsf/amendments/v1` Dataset What changed in the circular, when, and where to read the official publication. | Field | Type | Notes | | ---------------- | ------- | ------------------------------------------------------------------------------------------------------ | | `query` | string | Optional words to match in the amendment's title and in what it describes changing. | | `chapter_number` | string | Optional: only amendments that touched this chapter, e.g. `6.3`. | | `published_from` | string | Optional earliest publication date, `yyyy-mm-dd`. Amendments with no stated date never match a window. | | `published_to` | string | Optional latest publication date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-25). Default `10`. | ```bash theme={"dark"} curl https://api.croma.run/mx/cnsf/amendments/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "chapter_number": "6.3" }' ``` Returns `as_of`, the applied filters, `total`, `page`, `per_page`, `total_pages`, `count` and `results[]`, most recent first. Each amendment carries `title` (`CIRCULAR Modificatoria 3/26`), `circular_number`, `published_at`, `dof_document_id` and `dof_url` (the gazette publication behind it), `changes[]` (what it did, as the commission describes it), `affected_chapters[]`, `affected_annexes[]` and `affected_urls[]`. `published_at` is null on amendments where the commission does not state the exact date. It is never guessed from the year in the circular's number, which disagrees with the gazette on roughly one amendment in ten. Schemas, all response fields, and an interactive playground. # Cámara de Diputados Source: https://docs.usecroma.com/guides/mexico/diputados Mexican federal laws, codes and reglamentos from the Cámara de Diputados compilation, with the full reform history and current text behind each one. The official compilation of Mexican federal legislation: 315+ laws and codes (including the Constitution, and recently abrogated laws flagged `abrogated`), 135+ reglamentos, and the chronological log of every reform decree. Four endpoints: two catalogs, one detail lookup, and the reform log. ## Federal laws `POST /mx/diputados/federal-laws/v1` | Field | Type | Notes | | ------- | ------- | -------------------------------------------------------------------------------------------- | | `query` | string | Optional name filter. Case- and accent-insensitive substring; also matches the abbreviation. | | `page` | integer | 1-based page number. 100 laws per page. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/mx/diputados/federal-laws/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "instituciones de crédito" }' ``` Returns `laws` and `pagination` (`total`, `page`, `page_size`, `total_pages`). | Field | Notes | | ---------------------- | ---------------------------------------------------------------------------------------- | | `id` | Law identifier (e.g. `lic`, `cpeum`). Pass it to the lookup below. | | `name`, `abbreviation` | Full name and official short code, when the compilation uses one. | | `publication_date` | Original DOF publication date. | | `last_reform_date` | Date of the most recent reform; null when unreformed. | | `last_reform_note` | Set when the latest listed event is judicial rather than a reform. | | `status_note` | Legal-status annotations: invalidity declarations, pending abrogation, entry into force. | | `abrogated` | `true` when the law is listed as abrogated (no longer in force). | | `reformed` | Whether the law has ever been reformed. | | `pdf_url`, `doc_url` | Current consolidated text. | ## One law `POST /mx/diputados/federal-law/v1` | Field | Type | Notes | | -------- | ------ | ---------------------------------------------- | | `law_id` | string | **Required.** The `id` from the catalog above. | ```bash theme={"dark"} curl https://api.croma.run/mx/diputados/federal-law/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "law_id": "lic" }' ``` Returns `found`, `law_id`, and `law`. The law carries every catalog field plus `original_publication` (`dof_date` and a scan of the original) and `reforms`: every decree that amended it, newest first, each with `number`, `dof_date`, `description` (the decree headline), `pdf_url`, `doc_url`, and any `errata`. ## Federal regulations `POST /mx/diputados/federal-regulations/v1` | Field | Type | Notes | | ------- | ------- | ------------------------------------------------------------- | | `query` | string | Optional name filter. Case- and accent-insensitive substring. | | `page` | integer | 1-based page number. 50 per page. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/mx/diputados/federal-regulations/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "ley aduanera" }' ``` Returns `regulations` and `pagination`. Each reglamento has `name`, `abrogated`, `publication_date`, `pdf_url`, `doc_url`, and an inline `history` of entries typed `original`, `reform`, `amounts` (the annual amount and fee updates), `erratum`, `clarification`, or `validity` (Fe de erratas, Aclaración, and Disposición de vigencia notices), each with its `dof_date` and `doc_url`. ## Reforms by year `POST /mx/diputados/law-reforms/v1` | Field | Type | Notes | | ------ | ------- | --------------------------------------------------------------------------------- | | `year` | string | Optional 4-digit year. Defaults to the current year. Archives verified from 2022. | | `page` | integer | 1-based page number. 50 decrees per page. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/mx/diputados/law-reforms/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "year": "2026" }' ``` Returns `year`, `found` (`false` when no reform log exists for that year), `pagination`, and `decrees`, newest first. There is one entry per DOF publication day, and a single day can bundle several instruments. Each entry has `dof_date`, `summary` (full decree prose, which can be long), `actions`, and `affected_laws`, since one decree can touch many laws. Canonical actions are `reforman`, `adicionan`, `derogan`, `abrogan`, `expiden`, `modifican`, `actualizan`, `fe de erratas`, and `aclaración`, plus `sentencia` for court entries that carry no decree verb. Schemas, all response fields, and an interactive playground. # DOF Source: https://docs.usecroma.com/guides/mexico/dof Read Mexico's Diario Oficial de la Federación by date across its morning, evening and extraordinary editions, and pull any single publication's full text. Everything published in the Diario Oficial de la Federación: decrees, law reforms, and regulator disposiciones across the morning, evening, and extraordinary editions. List a day first, then fetch the full text of any entry you care about. The index reaches back to 1917, and machine-readable text starts with the 1973 volume. The gazette is organised by day and publishes the decree that created or amended a law, never the consolidated current text of one. For what a Mexican federal law says today, use [Cámara de Diputados](/guides/mexico/diputados). ## Publications by date `POST /mx/dof/publications-by-date/v1` | Field | Type | Notes | | ------ | ------ | ------------------------------------------------------------------------- | | `date` | string | **Required.** Gazette date, `yyyy-mm-dd`. The index reaches back to 1917. | ```bash theme={"dark"} curl https://api.croma.run/mx/dof/publications-by-date/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "date": "2026-07-16" }' ``` | Field | Notes | | -------------- | -------------------------------------------------------------------------------------- | | `date` | Echo of the requested date. | | `published` | `false` on days with no gazette (weekends and holidays); `publications` is then empty. | | `total` | Number of publications that day. | | `publications` | List of entries (see below). | Each publication carries `id`, `title`, `edition`, `section`, `page`, `page_end`, `branch` (e.g. `PODER EJECUTIVO`), `agency`, `has_pdf`, `has_text`, and `scan_url`. `has_text: true` means the full text is machine-readable and worth fetching with the lookup below. `has_text: false` is either a scanned publication, which is everything before the 1973 volume, or one of the untitled agency section headers that carry no text by design. Scans are still readable: `scan_url` opens the official scanned page. ## One publication `POST /mx/dof/publication/v1` | Field | Type | Notes | | ---------------- | ------- | ------------------------------------------------------------------ | | `publication_id` | string | **Required.** The `id` of an entry from the day listing. | | `offset` | integer | Optional. First character of the text to return. Default `0`. | | `limit` | integer | Optional. Characters to return, 1000 to 1000000. Default `200000`. | ```bash theme={"dark"} curl https://api.croma.run/mx/dof/publication/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "publication_id": "5778302" }' ``` Returns `found`, `publication_id`, and `publication`. The publication carries the day-listing metadata (except the `has_*` flags), plus `sub_agency`, `content`, `is_image_only`, `content_capped`, `scan_url`, and `official_url`. Publications range from a few hundred characters to entire decrees, so the text comes back in ranges under `content`: `text`, `offset`, `total_length`, `has_more`, and `next_offset`. Read `content.total_length` for the full size, and while `content.has_more` is `true` request the next range with `offset` set to `content.next_offset`. Scanned publications return `is_image_only: true` with `content` null. The metadata, `official_url` and `scan_url` are still populated, and `scan_url` opens the official scanned page, which is how you read anything published before 1973. `content_capped: true` is the rarer case where the text exists but the gazette declined to serve it because it is too large. Schemas, all response fields, and an interactive playground. # Fiscalías (México) Source: https://docs.usecroma.com/guides/mexico/fiscalias Search press bulletins from Mexican prosecutors by keyword and date: arrests, charges, convictions and sentences, with one endpoint per jurisdiction. Public press bulletins (comunicados) published by Mexican prosecutors. Each bulletin announces one procedural event: an arrest, a charge, a conviction, or a sentence. There is one endpoint per jurisdiction, each returning that office's bulletins with its own native fields. These are public press releases, not a criminal-record database. A name in a bulletin is an indicio for review, never proof, and the procedural stage (an `orden de aprehensión` is an accusation, not a conviction) must not be read as a verdict. Accused names are published abbreviated, so identity matching is inherently weak, and victims are never indexed. ## Endpoints | Jurisdiction | Endpoint | Keyword search | Date filter | | ---------------- | ------------------------------------------- | -------------- | ----------- | | Chihuahua | `POST /mx/fiscalias/chihuahua/bulletins/v1` | yes | yes | | Veracruz | `POST /mx/fiscalias/veracruz/bulletins/v1` | yes | yes | | Jalisco | `POST /mx/fiscalias/jalisco/bulletins/v1` | yes | — | | Nuevo León | `POST /mx/fiscalias/nuevoleon/bulletins/v1` | yes | — | | Puebla | `POST /mx/fiscalias/puebla/bulletins/v1` | yes | — | | Ciudad de México | `POST /mx/fiscalias/cdmx/bulletins/v1` | — | — | | Estado de México | `POST /mx/fiscalias/edomex/bulletins/v1` | — | — | | Zacatecas | `POST /mx/fiscalias/zacatecas/bulletins/v1` | — | — | | FGR (federal) | `POST /mx/fiscalias/fgr/bulletins/v1` | — | — | | Chiapas | `POST /mx/fiscalias/chiapas/bulletins/v1` | — | — | ## Request | Field | Type | Notes | | ---------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Free-text search over the bulletins. Omit for the most recent. Chihuahua, Veracruz, Jalisco, Nuevo León, and Puebla only. | | `from_date`, `to_date` | string | `yyyy-mm-dd` range bounds. Chihuahua and Veracruz only. | | `page` | integer | 1-based page number. | ```bash theme={"dark"} curl https://api.croma.run/mx/fiscalias/chihuahua/bulletins/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "homicidio", "from_date": "2026-01-01" }' ``` ## Response Returns `bulletins` and `pagination` (the searchable endpoints also echo `query`). Pagination comes in two shapes: the searchable offices report a total (`total`, `page`, `page_size`, `total_pages`); the browse-only offices page forward with `has_more` until it is `false`. Every bulletin carries `published_at`, a headline (`title`), a `url` to the full comunicado, and an `id` or `code`. The remaining fields are whatever that office publishes: | Office | Notable fields | | ------------------- | ------------------------------------------------------------------ | | Chihuahua, Veracruz | `body`, `excerpt`, `categories`, `slug`, `updated_at`, `image_url` | | Jalisco | `excerpt`, `body`, `author`, `tags`, `image_url` | | Nuevo León | `id`, `excerpt`, `image_url` | | Puebla | `bulletin_number`, `excerpt` | | Ciudad de México | `code` (e.g. `CS2026-240`), `excerpt` | | Estado de México | `code` (e.g. `696/2026`); `url` links to the full document | | Zacatecas | `excerpt`, `body`, `categories`, `author` | | FGR | `code` (e.g. `FGR 477/26`), `scope` (national or state) | | Chiapas | `bulletin_number`, `classification`, `excerpt` | Schemas, response fields, and an interactive playground. # SCJN Source: https://docs.usecroma.com/guides/mexico/scjn Search Mexican Supreme Court case law from the Semanario Judicial: 300k+ tesis and jurisprudencia in full, filtered by subject, época, court, binding force or publication date. Mexican Supreme Court case law from the Semanario Judicial de la Federación: every tesis and jurisprudencia published since 1911, over 300k, each in full. Search by words in the title and text and filter by binding force, subject, época, year, deciding level, court or chamber, how the criterion was formed, publication window, or what the court changed since a date. Then read one tesis by its registro digital. ## Search tesis `POST /mx/scjn/tesis-search/v1` Dataset Answered over the whole corpus: filters the court's own search does not offer, the full text in every result, and no dependence on the source at request time. | Field | Type | Notes | | ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words to match in the title and text of the tesis; every word must appear. Leave it empty to filter only. | | `tesis_type` | enum | Binding force: `jurisprudencia` (binding), `aislada` (non-binding), or `any`. Default `any`. | | `subject` | string | Optional materia filter (e.g. `Civil`, `Constitucional`); a tesis matches when any of its subjects does. | | `epoch` | string | Optional época number (`5` through `12`). | | `year` | string | Optional 4-digit year of the Semanario issue. | | `instance` | string | Optional deciding level, exactly as `instance` reads in results (e.g. `Suprema Corte de Justicia de la Nación`, `Tribunales Colegiados de Circuito`, `Plenos Regionales`). | | `court` | string | Optional court or chamber, exactly as `court` reads in results (e.g. `Primera Sala`, `Pleno`). | | `formation` | string | Optional way the criterion was formed, exactly as `formation` reads in results (e.g. `Reiteración`). | | `published_from` | string | Optional earliest publication date, `yyyy-mm-dd`. Pre-Gaceta tesis carry no publication date and never match a window. | | `published_to` | string | Optional latest publication date, `yyyy-mm-dd`. | | `updated_after` | string | Optional: only tesis the court modified on or after this date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-50). Every result carries the full text. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/mx/scjn/tesis-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "interés usurario", "tesis_type": "jurisprudencia" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `results[]`: full tesis records, the same shape the lookup below answers with, newest first (dated tesis by `publication_date`, then the pre-Gaceta ones by the year of their Semanario issue). With `query`, every word must appear in the title or the text. | Field | Notes | | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `registration_number` | Registro digital: the court's stable id for the tesis, and the key of the lookup. | | `title`, `subtitle` | Rubro (the heading that states the criterion) and subtítulo. | | `type` | `jurisprudencia` or `aislada`; null when the source reports neither. | | `citation` | Official citation key, e.g. `1a./J. 132/2012 (10a.)`. | | `epoch`, `epoch_number` | Judicial epoch, by name and number (5 through 12). | | `instance`, `circuit`, `court` | Deciding level, judicial circuit (null for SCJN chambers), and the specific chamber or court. | | `source`, `subjects` | Publication and materias. | | `location` | Citation coordinates in the Semanario: `book`, `volume`, `page`, `month`, `year`. | | `text` | The full text of the tesis. | | `facts`, `legal_criteria`, `justification` | The sections of tesis published in the structured format (Undécima Época onward); null before it. | | `formation` | How the criterion was formed, e.g. `Reiteración`, `Contradicción de criterios (antes contradicción de tesis)`. | | `issue`, `publication_date`, `binding_date` | The Semanario issue (e.g. `Libro 28, Agosto de 2023`), the date it was published and the date it became binding; null on pre-Gaceta tesis. | | `updated_at` | When the court last modified the record; null on tesis it has not touched since it began recording changes. | | `notes`, `precedent_notes` | Publication notes and the precedent history, as plain text. | | `linked_case_registrations`, `linked_vote_registrations` | Registro digital ids of the rulings the tesis derives from and of the votes linked to it. | | `fingerprint`, `official_url` | The integrity hash the court publishes for the document, and its public page. | Answered over the whole corpus, which follows the Semanario's weekly publication. `updated_after` matches the court's own modification stamp, which only tesis it has touched since 2025 carry. ## One tesis `POST /mx/scjn/tesis/v1` | Field | Type | Notes | | --------------------- | ------ | ------------------------------------------------------- | | `registration_number` | string | **Required.** Registro digital from the search results. | ```bash theme={"dark"} curl https://api.croma.run/mx/scjn/tesis/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "registration_number": "2001360" }' ``` Returns `found`, `registration_number` and `tesis`: the full record, the same shape as one entry of the search's `results[]`. | Field | Notes | | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `registration_number` | Registro digital: the court's stable id for the tesis, and the key of the lookup. | | `title`, `subtitle` | Rubro (the heading that states the criterion) and subtítulo. | | `type` | `jurisprudencia` or `aislada`; null when the source reports neither. | | `citation` | Official citation key, e.g. `1a./J. 132/2012 (10a.)`. | | `epoch`, `epoch_number` | Judicial epoch, by name and number (5 through 12). | | `instance`, `circuit`, `court` | Deciding level, judicial circuit (null for SCJN chambers), and the specific chamber or court. | | `source`, `subjects` | Publication and materias. | | `location` | Citation coordinates in the Semanario: `book`, `volume`, `page`, `month`, `year`. | | `text` | The full text of the tesis. | | `facts`, `legal_criteria`, `justification` | The sections of tesis published in the structured format (Undécima Época onward); null before it. | | `formation` | How the criterion was formed, e.g. `Reiteración`, `Contradicción de criterios (antes contradicción de tesis)`. | | `issue`, `publication_date`, `binding_date` | The Semanario issue (e.g. `Libro 28, Agosto de 2023`), the date it was published and the date it became binding; null on pre-Gaceta tesis. | | `updated_at` | When the court last modified the record; null on tesis it has not touched since it began recording changes. | | `notes`, `precedent_notes` | Publication notes and the precedent history, as plain text. | | `linked_case_registrations`, `linked_vote_registrations` | Registro digital ids of the rulings the tesis derives from and of the votes linked to it. | | `fingerprint`, `official_url` | The integrity hash the court publishes for the document, and its public page. | ## Browse tesis This endpoint is deprecated since 2026-09-07 and stops answering on 2026-12-15. Use [its successor](/guides/mexico/scjn), `POST /mx/scjn/tesis-search/v1`, instead. `POST /mx/scjn/tesis-browse/v1` Dataset | Field | Type | Notes | | ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional words to match in the title and text of the tesis; every word must appear. Leave it empty to filter only. | | `tesis_type` | enum | Binding force: `jurisprudencia` (binding), `aislada` (non-binding), or `any`. Default `any`. | | `subject` | string | Optional materia filter (e.g. `Civil`, `Constitucional`); a tesis matches when any of its subjects does. | | `epoch` | string | Optional época number (`5` through `12`). | | `year` | string | Optional 4-digit year of the Semanario issue. | | `instance` | string | Optional deciding level, exactly as `instance` reads in results (e.g. `Suprema Corte de Justicia de la Nación`, `Tribunales Colegiados de Circuito`, `Plenos Regionales`). | | `court` | string | Optional court or chamber, exactly as `court` reads in results (e.g. `Primera Sala`, `Pleno`). | | `formation` | string | Optional way the criterion was formed, exactly as `formation` reads in results (e.g. `Reiteración`). | | `published_from` | string | Optional earliest publication date, `yyyy-mm-dd`. Pre-Gaceta tesis carry no publication date and never match a window. | | `published_to` | string | Optional latest publication date, `yyyy-mm-dd`. | | `updated_after` | string | Optional: only tesis the court modified on or after this date, `yyyy-mm-dd`. | | `page` | integer | 1-based page number. Default `1`. | | `per_page` | integer | Results per page (1-20). Every result carries the full text. Default `10`. | ```bash theme={"dark"} curl https://api.croma.run/mx/scjn/tesis-browse/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "subject": "Civil", "tesis_type": "jurisprudencia", "published_from": "2026-01-01" }' ``` Same response as the search above: `as_of`, the applied filters, the totals and `results[]` of full tesis records, newest first. Change the path to migrate; the request is the same, and the search accepts up to 50 results per page. Schemas, all response fields, and an interactive playground. # SIEM Source: https://docs.usecroma.com/guides/mexico/siem Search Mexico's SIEM business directory by commercial name or razón social, filter by state and activity, and pull each establishment's declared profile. The Sistema de Información Empresarial Mexicano: Mexico's national business directory, operated through the business chambers. Search establishments by commercial name or razón social, narrow by state and SCIAN activity, then pull the declared profile: RFC, activity, address and contact, headcount, foreign trade, and declared products and services. ## Search establishments `POST /mx/siem/establishments/v1` | Field | Type | Notes | | --------------- | ------- | -------------------------------------------------------------------------------------------- | | `name` | string | **Required.** Commercial name or razón social, 2-200 characters. Case-insensitive substring. | | `state_code` | integer | INEGI state code (1-32). Omit or `0` to search all states. Default `0`. | | `activity_code` | integer | SCIAN activity code (exact match). Omit or `0` to search all activities. Default `0`. | | `page` | integer | 1-based page number. 10 per page. Default `1`. | ```bash theme={"dark"} curl https://api.croma.run/mx/siem/establishments/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "OXXO", "state_code": 21 }' ``` Returns `query` (the upper-cased name that was searched), `establishments`, and `pagination` (`total`, `page`, `page_size`, `total_pages`). | Field | Notes | | --------------------- | ------------------------------------------------------ | | `establishment_id` | Opaque id; pass it to the detail endpoint below. | | `commercial_name` | Declared commercial name. | | `chamber` | Business chamber the establishment registered through. | | `state`, `state_code` | State name and INEGI code (1-32). | ## Establishment detail `POST /mx/siem/establishment/v1` | Field | Type | Notes | | ------------------ | ------ | ----------------------------------------------------------- | | `establishment_id` | string | **Required.** The `establishment_id` from the search above. | ```bash theme={"dark"} curl https://api.croma.run/mx/siem/establishment/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "establishment_id": "3417757" }' ``` Returns `found`, `establishment_id`, and `establishment` (null when the id is unknown). | Field | Notes | | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | | `rfc` | Tax id, when declared. | | `legal_name`, `person_name` | Razón social (personas morales) or full name (personas físicas). | | `commercial_name` | Declared commercial name. | | `main_activity`, `activity_code` | Free-text primary activity and SCIAN code. | | `state`, `state_code`, `municipality_code` | State name plus INEGI state and municipality codes. | | `status` | Registration status (e.g. `Actualizado`, `Vencido`). | | `public_listing` | Whether the establishment opted into public listing. | | `registration_date`, `updated_date`, `expiration_date` | Registration dates (`yyyy-mm-dd`). | | `location` | Street address, neighborhood, postal code, municipality, cross streets, phone, email, website. | | `profile` | Start date, headcount (total and women), export/import flags, government-supplier flag, activities, chamber, business group. | | `products`, `services` | Declared products and services. | | `export_countries`, `import_countries` | Declared export destinations and import origins. | SIEM is a self-declared, voluntary directory: each establishment decides whether to register and which fields to publish. Treat results as a declared commercial profile, not proof of existence or legitimacy, and treat absence as no signal at all. These lookups can take longer than a typical request. They are [async jobs](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # APESEG SOAT Certificate History Source: https://docs.usecroma.com/guides/peru/apeseg-soat Look up a Peruvian vehicle plate's SOAT certificate history from APESEG: current and past mandatory-insurance certificates, insurers and validity dates. Reports the SOAT (mandatory traffic-accident insurance) certificate history on record for a vehicle plate from APESEG (Asociación Peruana de Empresas de Seguros). Tells you whether the plate has a currently valid (VIGENTE) SOAT, which company issued it, and the full history of past certificates. One lookup, by plate. `POST /pe/apeseg/soat/v1` | Field | Type | Notes | | ------- | ------ | --------------------------------------------------------------------------------------- | | `plate` | string | **Required.** The vehicle plate to look up, 4-10 characters (letters, digits, hyphens). | ```bash theme={"dark"} curl https://api.croma.run/pe/apeseg/soat/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123" }' ``` ## Response | Field | Notes | | ----------------- | ---------------------------------------------------------------------- | | `found` | `false` when the plate has no SOAT record. | | `plate` | The searched plate (trimmed, uppercased). | | `has_active_soat` | `true` when the plate has a currently valid (VIGENTE) certificate. | | `active` | The current (VIGENTE) certificate, or `null` when none is active. | | `count` | Number of certificates on record. | | `certificates[]` | Certificate history, newest first. Empty when the plate has no record. | Each certificate (`active` and every `certificates[]` entry) has `company`, `status` (`VIGENTE` / `VENCIDO` / `ANULADO`), `start_date` and `end_date` (`yyyy-mm-dd` when parseable), `policy_number`, `vehicle_use`, `vehicle_class`, `certificate_type` (`DIGITAL` / `FISICO`), `brand`, `model`, `created_date`, and `annulled_date`. ```json theme={"dark"} { "data": { "found": true, "plate": "ABC123", "has_active_soat": true, "active": { "company": "Interseguro", "status": "VIGENTE", "start_date": "2026-02-19", "end_date": "2027-02-19", "policy_number": "000000000000000594770702", "vehicle_use": "PARTICULAR", "vehicle_class": "AUTOMOVIL", "certificate_type": "DIGITAL", "brand": "JEEP", "model": "COMPASS", "created_date": "2026-02-19", "annulled_date": null }, "count": 10, "certificates": [ { "company": "Interseguro", "status": "VIGENTE", "start_date": "2026-02-19", "end_date": "2027-02-19", "policy_number": "000000000000000594770702", "vehicle_use": "PARTICULAR", "vehicle_class": "AUTOMOVIL", "certificate_type": "DIGITAL", "brand": "JEEP", "model": "COMPASS", "created_date": "2026-02-19", "annulled_date": null } ] } } ``` SOAT is Peru's mandatory traffic-accident insurance. `has_active_soat: false` means no currently valid certificate is on record for the plate, even if past certificates appear in the history. This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # Callao Traffic Tickets Source: https://docs.usecroma.com/guides/peru/callao-papeletas List the outstanding traffic tickets (papeletas) registered against a vehicle plate in the province of Callao, with amounts, dates and infraction codes. Lists the outstanding traffic tickets (papeletas) registered against a vehicle plate in the province of Callao, issued by the Municipalidad Provincial del Callao. One lookup, by plate. `POST /pe/callao/papeletas/v1` | Field | Type | Notes | | ------- | ------ | --------------------------------------------------------------------------------------- | | `plate` | string | **Required.** The vehicle plate to look up, 4-10 characters (letters, digits, hyphens). | ```bash theme={"dark"} curl https://api.croma.run/pe/callao/papeletas/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123" }' ``` ## Response | Field | Notes | | --------------- | ---------------------------------------------------------- | | `found` | `true` when the source returned a verdict for the plate. | | `plate` | The searched plate (trimmed, uppercased). | | `has_papeletas` | `true` when the plate has at least one outstanding ticket. | | `count` | Number of outstanding tickets. | | `currency` | Currency of the amounts (`PEN`). | | `total` | Sum of the outstanding amounts. | | `papeletas[]` | The outstanding tickets. Empty when the plate is clear. | Each `papeletas[]` entry has `plate`, `code` (infraction code), `ticket_number`, `infraction_date` (`yyyy-mm-dd` when parseable), `amount`, `installment`, and `ticket_id`. ```json theme={"dark"} { "data": { "found": true, "plate": "ABC123", "has_papeletas": true, "count": 1, "currency": "PEN", "total": 660, "papeletas": [ { "plate": "ABC123", "code": "M20", "ticket_number": "01483516P", "infraction_date": "2013-09-18", "amount": 660, "installment": 0, "ticket_id": "4008095" } ] } } ``` Coverage is limited to the province of Callao: an empty result rules out outstanding tickets in Callao only, not elsewhere in Peru. This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # OECE Contrataciones Abiertas Source: https://docs.usecroma.com/guides/peru/oece Peru's public procurement (SEACE, published by OECE): search procedures by text, buyer, supplier RUC, department, category and dates, and look one up by OCDS id. Peru's public-procurement procedures as published by OECE (Organismo Especializado para las Contrataciones Públicas Eficientes, formerly OSCE) under the Open Contracting Data Standard: the convocatoria, the contracting entity, the estimated value, the items, the bidding documents, the awards and the contracts that followed. Every procedure published from 2020 onward, organized and ready to query. That is what makes a full-text search across every procedure, or every award to one supplier RUC across the years, a single fast call. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search processes `POST /pe/oece/processes-search/v1` Dataset Searches the procedures by any combination of text, buyer, awarded supplier, department, category, procedure type and dates. Newest first. | Field | Type | Notes | | --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words to match in the title and description (Spanish full-text search). | | `buyer_ruc` | string | Optional. Only procedures of the contracting entity with this RUC. | | `supplier_ruc` | string | Optional. Only procedures with an award to the supplier with this RUC. | | `department` | string | Optional. The buyer's department as the source spells it, e.g. `LIMA`, `CUSCO`. | | `category` | enum | Optional. `goods`, `services` or `works`. | | `method` | string | Optional. Procedure type exactly as the source names it, e.g. `Licitación Pública`, `Adjudicación Simplificada`, `Subasta Inversa Electrónica`. | | `from_date` | string | Optional. Publication date lower bound (`yyyy-mm-dd`, inclusive). | | `to_date` | string | Optional. Publication date upper bound (`yyyy-mm-dd`, inclusive). | | `updated_after` | string | Optional. Only procedures the source modified on or after this date: what moved since you last looked. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/pe/oece/processes-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "laptops", "department": "LIMA", "from_date": "2025-01-01" }' ``` Returns `as_of`, the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `processes[]` (see below). ## Process by OCID `POST /pe/oece/process/v1` Dataset Resolves one procedure by its OCDS id and returns the full record. | Field | Type | Notes | | ------ | ------ | -------------------------------------------------------------------------------------------- | | `ocid` | string | **Required.** OCDS process id, e.g. `ocds-dgv273-seacev3-873200`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/pe/oece/process/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ocid": "ocds-dgv273-seacev3-873200" }' ``` Returns `found`, `ocid`, `as_of` and `process` (null when not found). ## Response Every response carries `as_of`: how current the data is. ### `processes[]` (search) | Field | Notes | | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | `ocid` | OCDS process id, e.g. `ocds-dgv273-seacev3-873200`. Use it with the process lookup. | | `source` | Which SEACE generation published it (`seace_v2`, `seace_v3`). | | `tender_id` | The source's own procedure number. | | `title`, `description` | The procedure's nomenclature and the object of the procurement. | | `buyer` | `{ id, name, ruc }` of the contracting entity. | | `department` | The buyer's department (región), e.g. `LIMA`. | | `procurement_method_details` | The procedure type as the source names it (`Licitación Pública`, `Adjudicación Simplificada`, ...). | | `category` | `goods`, `services` or `works`. | | `value` | `{ amount, currency, amount_pen }`: the estimated value. | | `published_date` | `yyyy-mm-dd` the procedure was published. | | `status_details` | The distinct stages across the items, as the source names them (`CONVOCADO`, `ADJUDICADO`, `CONTRATADO`, `DESIERTO`, `NULO`, ...). | | `award_count`, `contract_count`, `awarded_amount_pen` | How far the procedure got, and for how much. | | `suppliers[]` | Distinct awarded suppliers, `{ id, name, ruc }`. | | `updated_at` | When the source last modified the record. | ### `process` (lookup) The full record: everything above plus `procurement_method`, `additional_categories`, `tender_start_date`, `tender_end_date`, `number_of_tenderers`, `items[]` (description, quantity, unit, CUBSO/UNSPSC classification, status, capped at 100 with `items_capped`), `documents[]` (title, type, format, url, dates, capped at 50 with `documents_capped`), `awards[]` (id, date, value, suppliers, item\_count), `contracts[]` (id, award\_id, title, dates, status, value), `supplier_rucs[]` and `segment` (the source's publication month). Empty and placeholder values are normalized to `null`. Amounts are numbers; dates are `yyyy-mm-dd`; timestamps keep the source's offset. These responses cover procedures published from January 2020 onward. Older procedures exist at the source but are not part of them. Schemas, all response fields, and an interactive playground. # RREE Source: https://docs.usecroma.com/guides/peru/rree Verify a Peruvian foreigner identity card (carné de extranjería) from the RREE: the holder's name, nationality, immigration status and expiration date. Verifies Peruvian foreigner identity card (carné de extranjería) data from the Ministerio de Relaciones Exteriores, including name, nationality, immigration status, and expiration date. `POST /pe/rree/foreigner-cards/v1` | Field | Type | Notes | | ----------------- | ------ | ---------------------------------------------------------------- | | `document_number` | string | **Required.** The carné de extranjería number. Exactly 8 digits. | ```bash theme={"dark"} curl https://api.croma.run/pe/rree/foreigner-cards/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "00112233" }' ``` | Field | Notes | | ------------------------------- | ------------------------------------------------------------------------------------ | | `found` | `true` when a card matches; `false` when none does (the other fields are then null). | | `card_number` | The carné de extranjería number. | | `first_name`, `last_name` | Given and family names. | | `nationality` | Nationality. | | `immigration_status` | Immigration status (calidad migratoria). | | `birth_date`, `expiration_date` | Birth and card-expiration dates (`yyyy-mm-dd`). | This lookup can take longer than a typical request. It's an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # SAT Lima Source: https://docs.usecroma.com/guides/peru/sat-lima Look up outstanding debt owed to the SAT de Lima by DNI, RUC, plate, ticket or taxpayer code: vehicle and property taxes, papeletas and other fines. Resolves outstanding debt owed to the SAT de Lima (Servicio de Administración Tributaria de Lima) for a person, company, or vehicle: taxes (impuesto vehicular, predial, arbitrios, alcabala), traffic tickets (papeletas), administrative fines, and payment commitments. One lookup, selected by `document_type`. `POST /pe/sat-lima/account-status/v1` | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `document_type` | enum | One of `dni`, `ruc`, `placa` (vehicle plate), `papeleta` (ticket / administrative-fine document), `cod_administrado` (administered-party code), `compromiso` (payment-commitment code). Defaults to `dni`. Default `dni`. | | `document_number` | string | **Required.** The value to look up, 1-20 alphanumeric characters. | ```bash theme={"dark"} curl https://api.croma.run/pe/sat-lima/account-status/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_type": "placa", "document_number": "ABC123" }' ``` ## Response | Field | Notes | | --------------------- | ------------------------------------------------------------------------------------------------ | | `found` | `true` when an account resolved (even with zero debt); `false` only on a genuinely empty result. | | `query` | The searched value (trimmed, uppercased). | | `document_type` | The search dimension used. | | `clear` | `true` when there is nothing outstanding. | | `summary.total` | Sum of the outstanding amounts, in PEN (null when there is no debt). | | `summary.items_count` | Number of outstanding items. | | `debts[]` | The outstanding items (see below). | Each item in `debts[]`: | Field | Notes | | ------------------------------------------- | ------------------------------------------------------------------------------------------------- | | `group` | Human label for the debt group (e.g. `Papeletas`, `Impuesto vehicular`, `Arbitrios municipales`). | | `group_code`, `concept_code` | Source group / concept codes. | | `reference` | Reference or document identifier for the item. | | `document` | Source document field. | | `plate` | Plate, for vehicle-bound items. | | `amount` | Outstanding amount, in PEN. | | `amount_with_discount` | Discounted amount when offered. | | `status` | Item status. | | `year`, `installment` | Tax year and installment, for tax items. | | `due_date` | Due date (`yyyy-mm-dd` when parseable). | | `infraction_date` | Infraction date (`yyyy-mm-dd` when parseable), for tickets and fines. | | `violation_code`, `violation`, `regulation` | Violation code, description, and regulation, for tickets and fines. | ```json theme={"dark"} { "data": { "found": true, "query": "ABC123", "document_type": "placa", "clear": true, "summary": { "total": null, "items_count": 0 }, "debts": [] } } ``` `dni` and `ruc` resolve the registered party before listing debt, so they can take a little longer than a plate or code lookup. This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # SAT Lima Capture Orders Source: https://docs.usecroma.com/guides/peru/sat-lima-capturas Check whether a vehicle plate has an outstanding capture order in the province of Lima, issued by the SAT de Lima over tax debt or unpaid traffic fines. Reports whether a vehicle plate has an outstanding capture order (orden de captura) in the province of Lima, issued by the SAT de Lima (Servicio de Administración Tributaria de Lima) for unpaid tax debt or traffic tickets. One lookup, by plate. `POST /pe/sat-lima/capturas/v1` | Field | Type | Notes | | ------- | ------ | --------------------------------------------------------------------------------------- | | `plate` | string | **Required.** The vehicle plate to look up, 4-10 characters (letters, digits, hyphens). | ```bash theme={"dark"} curl https://api.croma.run/pe/sat-lima/capturas/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123" }' ``` ## Response | Field | Notes | | ------------------- | --------------------------------------------------------------------------------------------------------- | | `found` | `true` when the source returned a verdict for the plate. | | `plate` | The searched plate (trimmed, uppercased). | | `has_capture_order` | `true` when the plate has at least one outstanding capture order. | | `message` | The source's verdict line (present when the plate is clear). | | `report_date` | Report date (`yyyy-mm-dd` when parseable). | | `orders[]` | Capture-order rows when present, each keyed by the source's column labels. Empty when the plate is clear. | ```json theme={"dark"} { "data": { "found": true, "plate": "ABC123", "has_capture_order": false, "message": "El vehículo de placa ABC123 no tiene orden de captura en la provincia de Lima.", "report_date": "2026-06-22", "orders": [] } } ``` A capture order means the vehicle can be seized over the underlying debt or tickets. Coverage is limited to the province of Lima: a `false` result rules out a capture order in Lima only, not elsewhere in Peru. This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # SBS SOAT Report Source: https://docs.usecroma.com/guides/peru/sbs-soat Look up a Peruvian vehicle plate's SOAT record from the SBS: the accident history (siniestralidad) and the policy list with insurers and validity dates. Reports a vehicle plate's SOAT (mandatory traffic-accident insurance) record from SBS (Superintendencia de Banca, Seguros y AFP), Peru's banking and insurance regulator. Returns the siniestralidad (number of accidents covered by SOAT in the last 5 years) and the list of SOAT policies on record: issuing company, vehicle class and use, accidents per policy, coverage window, and status. One lookup, by plate. `POST /pe/sbs/soat/v1` | Field | Type | Notes | | ------- | ------ | --------------------------------------------------------------------------------------- | | `plate` | string | **Required.** The vehicle plate to look up, 4-10 characters (letters, digits, hyphens). | ```bash theme={"dark"} curl https://api.croma.run/pe/sbs/soat/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123" }' ``` ## Response | Field | Notes | | ----------------- | ----------------------------------------------------------------- | | `found` | `true` when SOAT information is reported for the plate. | | `plate` | The searched plate (trimmed, uppercased). | | `report_date` | When the source generated the report (ISO, when parseable). | | `data_through` | The source's data-currency label (for example `ABRIL 2026`). | | `accident_count` | Accidents covered by SOAT in the last 5 years (siniestralidad). | | `has_active_soat` | `true` when a policy is currently in force (VIGENTE). | | `active` | The current (VIGENTE) policy, or `null` when none is active. | | `count` | Number of policies on record. | | `policies[]` | Policy history, newest first. Empty when the plate has no record. | Each policy (`active` and every `policies[]` entry) has `company`, `vehicle_class`, `vehicle_use`, `accident_count`, `policy_number`, `certificate_number`, `start_date` and `end_date` (`yyyy-mm-dd` when parseable), `status` (`VIGENTE` / `VENCIDA` / `ANULADA`), `annulled_date`, and `comment`. ```json theme={"dark"} { "data": { "found": true, "plate": "ABC123", "report_date": "2026-06-23T20:03:23", "data_through": "ABRIL 2026", "accident_count": 0, "has_active_soat": true, "active": { "company": "Interseguro", "vehicle_class": "Automóvil", "vehicle_use": "Particular", "accident_count": 0, "policy_number": "0594770702", "certificate_number": "0594770702", "start_date": "2026-02-19", "end_date": "2027-02-19", "status": "VIGENTE", "annulled_date": null, "comment": null }, "count": 5, "policies": [ { "company": "Interseguro", "vehicle_class": "Automóvil", "vehicle_use": "Particular", "accident_count": 0, "policy_number": "0594770702", "certificate_number": "0594770702", "start_date": "2026-02-19", "end_date": "2027-02-19", "status": "VIGENTE", "annulled_date": null, "comment": null } ] } } ``` SOAT is Peru's mandatory traffic-accident insurance. `accident_count` is the siniestralidad: the number of accidents covered by SOAT policies in the last five years. `has_active_soat: false` means no policy is currently in force, even if past policies appear in the history. This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # SUNAT Source: https://docs.usecroma.com/guides/peru/sunat Look up Peruvian taxpayer information from SUNAT by RUC, identity document or name: registration data, status, address and tax condition for each match. Resolves Peruvian taxpayer information from SUNAT. Three lookups mirror SUNAT's own search tabs: by RUC, by identity document, and by name (razón social). The first two return one taxpayer's full record; the name search returns a list of matches. ## By RUC `POST /pe/sunat/ruc/v1` | Field | Type | Notes | | ----- | ------ | --------------------------- | | `ruc` | string | **Required.** 11-digit RUC. | ```bash theme={"dark"} curl https://api.croma.run/pe/sunat/ruc/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ruc": "20100070970" }' ``` ## By document `POST /pe/sunat/document/v1` | Field | Type | Notes | | ----------------- | ------ | --------------------------------------------------------------------------------------- | | `document_type` | string | One of `dni`, `ce` (carné de extranjería), `passport`, `diplomatic`. Defaults to `dni`. | | `document_number` | string | **Required.** 6-16 alphanumeric characters. | ```bash theme={"dark"} curl https://api.croma.run/pe/sunat/document/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_type": "dni", "document_number": "12345678" }' ``` ## By name `POST /pe/sunat/name/v1` | Field | Type | Notes | | ------ | ------ | ----------------------------------------------------- | | `name` | string | **Required.** Name or razón social, 3-100 characters. | ```bash theme={"dark"} curl https://api.croma.run/pe/sunat/name/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "INVERSIONES GENERALES" }' ``` The name search returns up to 30 matches (SUNAT's cap). When `capped` is `true` the results are incomplete: narrow the query or look the chosen RUC up directly. ## Response The RUC and document lookups return one taxpayer record. | Field | Notes | | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | `found` | `true` when a taxpayer matches; `false` when SUNAT has none (the other fields are then null/empty). | | `ruc` | The 11-digit RUC. | | `name` | Razón social or full name. | | `type` | E.g. `SOCIEDAD ANONIMA`, `PERSONA NATURAL SIN NEGOCIO`. | | `document_type`, `document_number` | Underlying identity document (natural persons). | | `trade_name` | Nombre comercial, if any. | | `registration_date`, `activities_start_date` | Fecha de inscripción / inicio de actividades (`yyyy-mm-dd`). | | `status` | Estado (e.g. `ACTIVO`, `BAJA DE OFICIO`). | | `condition` | Condición (e.g. `HABIDO`). | | `fiscal_address` | Domicilio fiscal. | | `emission_system`, `accounting_system` | Sistema de emisión / contabilidad. | | `foreign_trade_activity` | Actividad de comercio exterior. | | `economic_activities` | List of CIIU activities (principal and secundarias). | | `payment_vouchers` | Comprobantes de pago autorizados. | | `electronic_emission_systems`, `electronic_vouchers`, `electronic_emitter_since` | Electronic-invoicing details. | | `ple_affiliated_since` | Afiliado al PLE desde. | | `registries` | Padrones the taxpayer belongs to. | The name lookup returns `query`, `count`, `capped`, and `contributors[]`, each with `ruc`, `name`, `location`, and `status`. These lookups can take longer than a typical request. They are [async jobs](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, response fields, and an interactive playground. # SUTRAN Infraction Record Source: https://docs.usecroma.com/guides/peru/sutran-infracciones Look up a Peruvian vehicle plate's infraction record from SUTRAN: papeletas and other enforcement documents with status, dates and resolution details. Reports the infraction documents (papeletas and other actos) on record for a vehicle plate from SUTRAN (Superintendencia de Transporte Terrestre de Personas, Carga y Mercancías), Peru's national road-transport authority. One lookup, by plate. `POST /pe/sutran/infracciones/v1` | Field | Type | Notes | | ------- | ------ | --------------------------------------------------------------------------------------- | | `plate` | string | **Required.** The vehicle plate to look up, 4-10 characters (letters, digits, hyphens). | ```bash theme={"dark"} curl https://api.croma.run/pe/sutran/infracciones/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "plate": "ABC123" }' ``` ## Response | Field | Notes | | ----------------- | ------------------------------------------------------------ | | `found` | `true` when the source returned a verdict for the plate. | | `plate` | The searched plate (trimmed, uppercased). | | `has_infractions` | `true` when the plate has at least one infraction on record. | | `count` | Number of infraction rows. | | `message` | The source's verdict line (present when the plate is clear). | | `report_date` | Report date (`yyyy-mm-dd` when parseable). | | `currency` | ISO 4217 currency of `total` (`PEN`). | | `total` | Total amount payable across the infractions. | | `infractions[]` | Infraction rows when present. Empty when the plate is clear. | Each `infractions[]` row has `document_number`, `document_type`, `document_date` (`yyyy-mm-dd` when parseable), `infraction_code`, and `classification`. ```json theme={"dark"} { "data": { "found": true, "plate": "ABC123", "has_infractions": true, "count": 1, "message": null, "report_date": "2026-06-23", "currency": "PEN", "total": 0, "infractions": [ { "document_number": "2450540005", "document_type": "Papeletas Transito", "document_date": "2024-09-01", "infraction_code": "M20", "classification": "Muy Grave" } ] } } ``` Coverage is national (SUTRAN), distinct from the province-level SAT Lima lookups. The record does not include faults already in coercive collection (cobranza coactiva). This lookup can take longer than a typical request. It is an [async job](/async-jobs). By default the request waits inline and returns `{ data }`, or you can poll / use a `callback_url`. Schemas, all response fields, and an interactive playground. # Delaware Source: https://docs.usecroma.com/guides/united-states/delaware Delaware's registry of business entities: search corporations, LLCs, partnerships and trusts by name, and read one entity's record, registered agent included, by file number. Every business entity on file with the Delaware Division of Corporations: corporations, limited liability companies, limited partnerships, statutory trusts and partnerships, domestic and foreign, active and inactive. Delaware is where most US startups, venture funds and public companies are formed, so this is the registry a diligence, KYC or counterparty check starts from. Two steps: search a name to get file numbers, then look one up for the Division's free record, with the formation date, the kind and type of entity, the state of formation and the registered agent. ## Search entities `POST /us/delaware/entities-search/v1` Searches the registry by entity name and returns up to 50 matches with their file numbers. | Field | Type | Notes | | ------- | ------- | ------------------------------------------------------------------------------------------------------------------- | | `query` | string | **Required.** The entity name, or its words, e.g. `GOOGLE LLC`. Case does not matter; `AND` and `&` are equivalent. | | `exact` | boolean | Optional. `true` to return only entities whose name is exactly `query`. Default `false`. | ```bash theme={"dark"} curl https://api.croma.run/us/delaware/entities-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "GOOGLE LLC", "exact": true }' ``` Returns `query` and `exact` (echoed), `count`, `truncated` and `entities[]`, each `{ file_number, name }`, alphabetical by name. Pass a `file_number` to the lookup below for the full record. The Division lists at most 50 matches per search and does not page further. When more entities match, `truncated` is `true` and the first 50 are returned: refine the query, or pass `exact: true` with the full name. ## Entity by file number `POST /us/delaware/entity/v1` Resolves one entity by its file number and returns the Division's record. | Field | Type | Notes | | ------------- | ------ | ------------------------------------------------------------------------------------------------- | | `file_number` | string | **Required.** The Division's file number, digits only, e.g. `3582691`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/us/delaware/entity/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "file_number": "3582691" }' ``` Returns `found`, `file_number`, `entity` (null when not found) and `checked_at`. The record carries `file_number` (the Division's key), `name`, `filed_on` (`yyyy-mm-dd`, the incorporation or formation date the Division prints), `entity_kind` (`Corporation`, `Limited Liability Company`, `Limited Partnership`, `Statutory Trust`, `Partnership`, `Registered Series`, ...), `entity_type` (`General`, `Bank`, `Benefit Corporation`, `Closed Corp`, `Exempt`, `Series`, ...), `residency` (`domestic` or `foreign`), `state` (the state of formation as the Division prints it, e.g. `DELAWARE`) and `registered_agent` (`{ name, address, city, county, state, postal_code, phone }`, or null). Empty fields are `null`. This is the Division's free record. It is not a statement of good standing: status, franchise tax and filing history are not part of it. A file number the Division does not carry returns `found: false` with HTTP 200, not an error. Schemas, all response fields, and an interactive playground. # SEC Form ADV Source: https://docs.usecroma.com/guides/united-states/iapd Form ADV, the registry of every investment adviser the SEC oversees and the private funds each one manages: search advisers and funds by name, type, state, size and date, and read one in full. Every firm that manages money for others in the United States files a Form ADV with the Securities and Exchange Commission, either to register or, for venture capital and private fund advisers, to report as an exempt reporting adviser: who the firm is, where it sits, what it manages, how many people it employs, and, on Schedule D, every private fund it advises with its size, type, investors and auditor. a16z, Sequoia, Founders Fund and Y Combinator are all here, fund by fund, signed by the firm. The SEC's whole adviser roster, brought up to date every day, and every private fund reported since 2011, brought up to date every month, organized and ready to query. That is what makes a list of every venture fund over a billion dollars, or every fund one firm manages with its Form D notices, a single fast call. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search advisers `POST /us/iapd/advisers-search/v1` Dataset Searches the SEC's adviser roster by any combination of text, firm type, state, country, private funds and assets under management. By legal name. | Field | Type | Notes | | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `query` | string | Optional. Words to match in the names. Every word must match; no stemming. | | `firm_type` | enum | Optional. `registered` for advisers registered with the SEC, `exempt_reporting` for exempt reporting advisers (the venture capital and private fund adviser exemptions). | | `state` | string | Optional. Two-letter US state, e.g. `CA`. | | `country` | string | Optional. Country as the form spells it, e.g. `United States`, `Cayman Islands`, `United Kingdom`. | | `private_funds` | enum | Optional. `any` (default), `only` for advisers that manage private funds, `none` for those that do not. Default `any`. | | `min_aum` | number | Optional. Only advisers with at least this many US dollars under management. Exempt reporting advisers report no AUM and never match. Default `0`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/iapd/advisers-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "andreessen" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `advisers[]`, by legal name. Every adviser carries `crd` (the key), `sec_number` (`801-…` registered, `802-…` exempt reporting), `legal_name`, `business_name`, `firm_type` (`registered` or `exempt_reporting`), `status` (as the SEC spells it: `APPROVED`, `ACTIVE`, ...), `status_since`, `latest_filing_on`, `form_version`, `main_office` and `mailing_office` (`{ street_1, street_2, city, state, country, postal_code }`), `phone`, `fax`, `websites[]`, `organization_form`, `organized_in_state`, `organized_in_country`, `fiscal_year_end`, `employees`, `aum` (`{ total, discretionary, non_discretionary, accounts, accounts_discretionary, accounts_non_discretionary }`, US dollars; null for exempt reporting advisers, which do not report it), `has_private_funds`, `umbrella_registration`, `notice_filed_states[]`, `has_disclosures` and `sec_region`. Dates are `yyyy-mm-dd`. Empty fields are `null`. Most venture capital firms file as exempt reporting advisers: pass `firm_type: "exempt_reporting"` with `private_funds: "only"` to list them. Brought up to date daily from the SEC's roster. ## One adviser `POST /us/iapd/adviser/v1` Dataset Resolves one adviser by CRD and returns its record with the private funds it currently reports. | Field | Type | Notes | | ----- | ------ | --------------------------------------------------------------------------------- | | `crd` | string | **Required.** The adviser's CRD number, e.g. `160489`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/us/iapd/adviser/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "crd": "160489" }' ``` Returns `found`, `crd`, `as_of`, `adviser` (null when not found) and `private_funds` (`{ total, gross_asset_value, by_type, funds[] }`: the funds the adviser currently reports, largest first, up to 200; null when not found). Every adviser carries `crd` (the key), `sec_number` (`801-…` registered, `802-…` exempt reporting), `legal_name`, `business_name`, `firm_type` (`registered` or `exempt_reporting`), `status` (as the SEC spells it: `APPROVED`, `ACTIVE`, ...), `status_since`, `latest_filing_on`, `form_version`, `main_office` and `mailing_office` (`{ street_1, street_2, city, state, country, postal_code }`), `phone`, `fax`, `websites[]`, `organization_form`, `organized_in_state`, `organized_in_country`, `fiscal_year_end`, `employees`, `aum` (`{ total, discretionary, non_discretionary, accounts, accounts_discretionary, accounts_non_discretionary }`, US dollars; null for exempt reporting advisers, which do not report it), `has_private_funds`, `umbrella_registration`, `notice_filed_states[]`, `has_disclosures` and `sec_region`. Dates are `yyyy-mm-dd`. Empty fields are `null`. A CRD the SEC's roster does not carry returns `found: false` with HTTP 200, not an error. ## Search private funds `POST /us/iapd/private-funds-search/v1` Dataset Searches the funds by any combination of text, adviser, type, state, country, size and filing dates. Largest gross asset value first. | Field | Type | Notes | | ----------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words to match in the fund's name, its adviser's name and its general partners. Every word must match; no stemming. | | `adviser_crd` | string | Optional. The CRD of the adviser that reports the fund: every fund of one firm. | | `fund_type` | enum | Optional. `venture_capital`, `private_equity`, `hedge`, `real_estate`, `securitized_asset`, `liquidity` or `other`. | | `state` | string | Optional. Two-letter US state the fund is organized in, e.g. `DE`. | | `country` | string | Optional. Country the fund is organized in, as the form spells it, e.g. `United States`, `Cayman Islands`. | | `min_gross_asset_value` | number | Optional. Only funds with at least this gross asset value, US dollars. Default `0`. | | `include_former` | boolean | Optional. `false` (default) returns only funds the adviser still reports; `true` also returns funds a later filing omitted. Default `false`. | | `reported_from` | string | Optional. Lower bound on the date of the filing that reported the fund (`yyyy-mm-dd`, inclusive). | | `reported_to` | string | Optional. Upper bound on that date (`yyyy-mm-dd`, inclusive). | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/iapd/private-funds-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "fund_type": "venture_capital", "min_gross_asset_value": 1000000000 }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `funds[]`, largest gross asset value first. Every fund carries `fund_id` (the key, `805-` and ten digits), `fund_name`, `adviser_crd`, `adviser_name`, `adviser_type`, `fund_type` (`venture_capital`, `private_equity`, `hedge`, `real_estate`, `securitized_asset`, `liquidity` or `other`), `fund_type_other`, `state`, `country`, `gross_asset_value` (US dollars), `minimum_investment`, `owners_count`, `ownership` (`{ adviser_pct, funds_pct, non_us_pct }`), `is_master`, `is_feeder`, `master_fund_name`, `master_fund_id`, `is_fund_of_funds`, `invests_in_adviser_funds`, `exclusion_3c1`, `exclusion_3c7`, `has_other_advisers`, `has_annual_audit`, `unqualified_opinion`, `auditor` (`{ name, city, state, country, pcaob_registered }`), `uses_prime_broker`, `uses_custodian`, `uses_administrator`, `general_partners[]`, `form_d_file_numbers[]` (the join to the Form D dataset), `filing_id`, `filing_type`, `reported_at`, `reported_on`, `is_current` and `reported_until`. A fund's row is its adviser's latest filing that lists it. `is_current` is true while the adviser's newest filing still lists the fund; once a newer filing omits it, `is_current` turns false and `reported_until` is that filing's date. Dates are `yyyy-mm-dd`. Empty fields are `null`. Every private fund reported to the SEC since 2011, brought up to date monthly as the SEC publishes each month's filings. Pass `fund_type: "venture_capital"` to follow venture funds, or `adviser_crd` to list one firm's funds. ## One private fund `POST /us/iapd/private-fund/v1` Dataset Resolves one fund by its id and returns the full record. | Field | Type | Notes | | --------- | ------ | ----------------------------------------------------------------------------------------------------- | | `fund_id` | string | **Required.** The fund's id as Form ADV assigns it, e.g. `805-8573539182`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/us/iapd/private-fund/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "fund_id": "805-8573539182" }' ``` Returns `found`, `fund_id`, `as_of` and `fund` (null when not found). Every fund carries `fund_id` (the key, `805-` and ten digits), `fund_name`, `adviser_crd`, `adviser_name`, `adviser_type`, `fund_type` (`venture_capital`, `private_equity`, `hedge`, `real_estate`, `securitized_asset`, `liquidity` or `other`), `fund_type_other`, `state`, `country`, `gross_asset_value` (US dollars), `minimum_investment`, `owners_count`, `ownership` (`{ adviser_pct, funds_pct, non_us_pct }`), `is_master`, `is_feeder`, `master_fund_name`, `master_fund_id`, `is_fund_of_funds`, `invests_in_adviser_funds`, `exclusion_3c1`, `exclusion_3c7`, `has_other_advisers`, `has_annual_audit`, `unqualified_opinion`, `auditor` (`{ name, city, state, country, pcaob_registered }`), `uses_prime_broker`, `uses_custodian`, `uses_administrator`, `general_partners[]`, `form_d_file_numbers[]` (the join to the Form D dataset), `filing_id`, `filing_type`, `reported_at`, `reported_on`, `is_current` and `reported_until`. A fund's row is its adviser's latest filing that lists it. `is_current` is true while the adviser's newest filing still lists the fund; once a newer filing omits it, `is_current` turns false and `reported_until` is that filing's date. Dates are `yyyy-mm-dd`. Empty fields are `null`. A fund id no Form ADV filing carries returns `found: false` with HTTP 200, not an error. Schemas, all response fields, and an interactive playground. # OFAC Sanctions Source: https://docs.usecroma.com/guides/united-states/ofac The US Treasury's sanctions lists: search every designated person, company, vessel and aircraft by name or alias, program, type and country, and read one party's full record. The Office of Foreign Assets Control, part of the US Treasury, publishes the parties that US persons may not deal with. The Specially Designated Nationals and Blocked Persons list is the well-known one, and a consolidated list carries the other programs. Each party comes with every name OFAC knows it by, its addresses, the programs it is designated under, and OFAC's own note, which is where dates and places of birth, passport, tax and registration numbers are written. Both lists, brought up to date every day and searchable across primary names and aliases at once. A party OFAC delists stops matching the same day. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search sanctioned parties `POST /us/ofac/sanctions-search/v1` Dataset Searches both lists by any combination of name or alias, list, party type, sanctions program and country. | Field | Type | Notes | | ------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in the party's primary name or any of its aliases. Every word must match; no stemming. | | `list` | enum | Optional. `sdn` for the Specially Designated Nationals and Blocked Persons list, `non_sdn` for the consolidated list of the other programs. | | `party_type` | enum | Optional. `individual`, `entity` for a company or organisation, `vessel` or `aircraft`. | | `program` | string | Optional. A sanctions program code, e.g. `RUSSIA-EO14024`, `SDGT`, `CUBA`. A party designated under several matches any of them. | | `country` | string | Optional. Country of one of the party's addresses, as OFAC writes it, e.g. `Cuba`, `Russia`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/ofac/sanctions-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "aerocaribbean" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `parties[]`, by name. Every party carries `id` (the key, e.g. `sdn-36`), `list` (`sdn` or `non_sdn`), `entity_number`, `name` (`LAST, First` for a person), `party_type` (`individual`, `entity`, `vessel` or `aircraft`), `programs[]` (the sanctions programs, e.g. `RUSSIA-EO14024`, `SDGT`, `CUBA`), `title`, `remarks` (OFAC's own note, which carries dates and places of birth, passport, tax and registration numbers), `vessel` (call sign, type, tonnage, flag and owner, for a vessel), `aliases[]` (`{ type, name, remarks }`, where the type is `aka`, `fka` or `nka`), `alias_names[]`, `addresses[]` (`{ address, city_state_province, country, remarks }`) and `countries[]`. Empty fields are `null`. OFAC writes a person's name last name first, and records most identifying detail as prose in `remarks` rather than as fields. The search matches the party's primary name and every alias, word by word and without stemming, so `query` finds a party under any name OFAC records for it. Brought up to date daily; a party OFAC delists stops matching. A name match is a starting point, not a determination. OFAC's own guidance is to confirm a hit against the party's other identifiers before acting on it, and the list carries many similar names. ## One party `POST /us/ofac/sanctioned-party/v1` Dataset Resolves one sanctioned party by its id and returns the full record. | Field | Type | Notes | | ----- | ------ | ----------------------------------------------------------------------------------------------------------------------------- | | `id` | string | **Required.** The party's id, the list and OFAC's entity number joined by a hyphen, e.g. `sdn-36`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/us/ofac/sanctioned-party/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "id": "sdn-36" }' ``` Returns `found`, `id`, `as_of` and `party` (null when not found). Every party carries `id` (the key, e.g. `sdn-36`), `list` (`sdn` or `non_sdn`), `entity_number`, `name` (`LAST, First` for a person), `party_type` (`individual`, `entity`, `vessel` or `aircraft`), `programs[]` (the sanctions programs, e.g. `RUSSIA-EO14024`, `SDGT`, `CUBA`), `title`, `remarks` (OFAC's own note, which carries dates and places of birth, passport, tax and registration numbers), `vessel` (call sign, type, tonnage, flag and owner, for a vessel), `aliases[]` (`{ type, name, remarks }`, where the type is `aka`, `fka` or `nka`), `alias_names[]`, `addresses[]` (`{ address, city_state_province, country, remarks }`) and `countries[]`. Empty fields are `null`. OFAC writes a person's name last name first, and records most identifying detail as prose in `remarks` rather than as fields. An id no list carries returns `found: false` with HTTP 200, not an error. That is also the answer for a party OFAC has delisted. Schemas, all response fields, and an interactive playground. # SEC EDGAR Source: https://docs.usecroma.com/guides/united-states/sec Form D, the notice every US company and fund files when it raises money privately: search fundraises by issuer, people, state, industry, amount and date, and read one filing in full. When a US company or a fund raises money privately under Regulation D, it files a Form D with the Securities and Exchange Commission within fifteen days of the first sale: who the issuer is, its executives and directors, the industry, how much it is raising, how much it has sold and to how many investors. A startup's priced round and a venture fund's close both show up here, signed by the company. Every Form D filed since 2008, organized and ready to query, brought up to date every day. That is what makes a search across every fundraise by an executive's name, or every venture fund that closed in California this quarter, a single fast call. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search Form D filings `POST /us/sec/form-d-search/v1` Dataset Searches the filings by any combination of text, issuer, state, jurisdiction, industry, fund type, form type, dates and amount sold. Newest first. | Field | Type | Notes | | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words to match in the issuer's name and the names of its executives, directors and promoters. Every word must match; no stemming. | | `issuer_cik` | string | Optional. The issuer's EDGAR CIK, with or without leading zeros: every filing of one issuer. | | `state` | string | Optional. Two-letter state of the issuer's address, e.g. `CA`. | | `jurisdiction` | string | Optional. State or country of incorporation as the form spells it, e.g. `DELAWARE`, `CAYMAN ISLANDS`. | | `industry` | string | Optional. Industry group exactly as the form names it, e.g. `Other Technology`, `Biotechnology`, `Pooled Investment Fund`. | | `fund_type` | enum | Optional. For funds: `venture_capital_fund`, `private_equity_fund`, `hedge_fund` or `other_investment_fund`. | | `funds` | enum | Optional. `include` (default), `exclude` for operating companies only, `only` for funds only. Default `include`. | | `form_type` | enum | Optional. `D` for new notices, `D/A` for amendments. | | `filed_from` | string | Optional. Filing date lower bound (`yyyy-mm-dd`, inclusive). | | `filed_to` | string | Optional. Filing date upper bound (`yyyy-mm-dd`, inclusive). | | `min_amount_sold` | number | Optional. Only filings that have sold at least this many US dollars. Default `0`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/sec/form-d-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "databricks", "funds": "exclude" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `filings[]`, newest first. Every filing carries `accession_number` (the key), `form_type` (`D` new, `D/A` amendment), `filed_on`, `file_number`, `issuer` (`{ cik, name, previous_names[], entity_type, incorporated: { span, year }, jurisdiction, address, phone }`), `co_issuers[]`, `industry_group` (as the form names it: `Other Technology`, `Biotechnology`, `Pooled Investment Fund`, ...), `is_pooled_investment_fund`, `investment_fund_type` (`venture_capital_fund`, `private_equity_fund`, `hedge_fund`, `other_investment_fund` or null), `revenue_range`, `federal_exemptions[]` (`06b`, `06c`, `3C`, ...), `is_amendment`, `previous_accession_number`, `first_sale_on`, `securities` (equity, debt, options, ...), `minimum_investment`, `offering` (`{ total_amount, total_amount_indefinite, amount_sold, remaining, note }`, US dollars), `investors` (`{ has_non_accredited, non_accredited_count, total_count }`), `sales_commissions`, `finders_fees`, `proceeds_to_related_persons`, `related_persons[]` (executives, directors and promoters with `name`, `relationships[]` and `address`), `related_person_names[]`, `recipients[]` (who was paid to sell), `signature` and `filing_url`. Amounts are numbers in US dollars; an amount the filer marked indefinite is null with its `_indefinite` flag set. Dates are `yyyy-mm-dd`. Empty fields are `null`. Every Form D since 2008, companies and funds alike, brought up to date daily from EDGAR. Pass `funds: "exclude"` to see operating companies only, or `funds: "only"` with `fund_type` to follow venture funds closing. ## One filing `POST /us/sec/form-d-filing/v1` Dataset Resolves one Form D by its accession number and returns the full record. | Field | Type | Notes | | ------------------ | ------ | ----------------------------------------------------------------------------------------------- | | `accession_number` | string | **Required.** EDGAR's accession number, e.g. `0001587468-26-000001`, as returned by the search. | ```bash theme={"dark"} curl https://api.croma.run/us/sec/form-d-filing/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "accession_number": "0001587468-26-000001" }' ``` Returns `found`, `accession_number`, `as_of` and `filing` (null when not found). Every filing carries `accession_number` (the key), `form_type` (`D` new, `D/A` amendment), `filed_on`, `file_number`, `issuer` (`{ cik, name, previous_names[], entity_type, incorporated: { span, year }, jurisdiction, address, phone }`), `co_issuers[]`, `industry_group` (as the form names it: `Other Technology`, `Biotechnology`, `Pooled Investment Fund`, ...), `is_pooled_investment_fund`, `investment_fund_type` (`venture_capital_fund`, `private_equity_fund`, `hedge_fund`, `other_investment_fund` or null), `revenue_range`, `federal_exemptions[]` (`06b`, `06c`, `3C`, ...), `is_amendment`, `previous_accession_number`, `first_sale_on`, `securities` (equity, debt, options, ...), `minimum_investment`, `offering` (`{ total_amount, total_amount_indefinite, amount_sold, remaining, note }`, US dollars), `investors` (`{ has_non_accredited, non_accredited_count, total_count }`), `sales_commissions`, `finders_fees`, `proceeds_to_related_persons`, `related_persons[]` (executives, directors and promoters with `name`, `relationships[]` and `address`), `related_person_names[]`, `recipients[]` (who was paid to sell), `signature` and `filing_url`. Amounts are numbers in US dollars; an amount the filer marked indefinite is null with its `_indefinite` flag set. Dates are `yyyy-mm-dd`. Empty fields are `null`. An accession number EDGAR does not carry as a Form D returns `found: false` with HTTP 200, not an error. Schemas, all response fields, and an interactive playground. # SEC Form 13F Source: https://docs.usecroma.com/guides/united-states/sec-13f Form 13F, what every institutional manager over $100 million holds in US public equities: search filings by manager and quarter, read one filing's positions, and follow a security across every manager holding it. Every institutional investment manager with at least \$100 million in US public equities reports what it holds to the Securities and Exchange Commission within 45 days of each quarter's end, on Form 13F: the manager, the quarter, and one line per position with the issuer, its CUSIP, the value in dollars, the shares held, whether it is an option, and who votes the shares. Berkshire Hathaway's book, every pension fund and every hedge fund large enough to file are all here, signed by the manager. Every filing since 2013 and the positions of recent quarters, organized and ready to query. That is what makes a list of every manager that holds one CUSIP, or one manager's whole book for a quarter, a single fast call. The manager's CRD number ties a filing to the same firm in the investment adviser registry, so a manager's public book and the private funds it runs read together. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search filings `POST /us/sec-13f/filings-search/v1` Dataset Searches the filings by any combination of manager name, CIK, CRD, state, quarter and total value. Newest quarter first. | Field | Type | Notes | | ------------- | ------- | ---------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in the manager's name. Every word must match; no stemming. | | `manager_cik` | string | Optional. The manager's EDGAR CIK, with or without leading zeros: every filing of one manager. | | `manager_crd` | string | Optional. The manager's CRD number, the same id the investment adviser registry uses. | | `state` | string | Optional. Two-letter state of the manager's address, e.g. `NE` or `NY`. | | `period_from` | string | Optional. Earliest quarter end reported (`yyyy-mm-dd`, inclusive), e.g. `2026-03-31`. | | `period_to` | string | Optional. Latest quarter end reported (`yyyy-mm-dd`, inclusive). | | `min_value` | number | Optional. Only filings whose positions total at least this many US dollars. Default `0`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/sec-13f/filings-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "berkshire hathaway" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `filings[]`, newest quarter first and largest first within it. Every filing carries `accession_number` (the key), `filed_on`, `period` (the quarter end reported), `submission_type` (`13F-HR` a holdings report, `13F-NT` a notice that another manager reports the positions, and their `/A` amendments), `is_amendment`, `amendment_number`, `amendment_type`, `report_type`, `manager` (`{ cik, name, crd, sec_file_number, form_13f_file_number, address }`), `holdings_count`, `holdings_value` (US dollars), `other_managers_count`, `confidential_omitted`, `additional_information` and `filing_url`. Amounts are numbers in US dollars. Form 13F reported values in thousands until the rules that took effect in January 2023; the amounts here are normalized to dollars throughout, so a 2019 filing and a 2026 one compare directly. The SEC's own rule is applied by filing date; a minority of managers reported whole dollars before 2023 anyway, and their older amounts read a thousand times high. Dates are `yyyy-mm-dd`. Empty fields are `null`. The SEC publishes Form 13F as quarterly data sets a few weeks after each filing window closes, so the copy is as current as the newest data set: `as_of` says exactly how current. ## One filing and its positions `POST /us/sec-13f/filing/v1` Dataset Resolves one Form 13F by its accession number and returns it with the positions it reported, largest first. | Field | Type | Notes | | ------------------ | ------ | ------------------------------------------------------------------------------------------------------- | | `accession_number` | string | **Required.** EDGAR's accession number, e.g. `0001193125-26-226661`, as returned by the filings search. | ```bash theme={"dark"} curl https://api.croma.run/us/sec-13f/filing/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "accession_number": "0001193125-26-226661" }' ``` Returns `found`, `accession_number`, `as_of`, `filing` (null when not found) and `holdings[]`: the filing's positions, largest first, up to 200. Every filing carries `accession_number` (the key), `filed_on`, `period` (the quarter end reported), `submission_type` (`13F-HR` a holdings report, `13F-NT` a notice that another manager reports the positions, and their `/A` amendments), `is_amendment`, `amendment_number`, `amendment_type`, `report_type`, `manager` (`{ cik, name, crd, sec_file_number, form_13f_file_number, address }`), `holdings_count`, `holdings_value` (US dollars), `other_managers_count`, `confidential_omitted`, `additional_information` and `filing_url`. Amounts are numbers in US dollars. Form 13F reported values in thousands until the rules that took effect in January 2023; the amounts here are normalized to dollars throughout, so a 2019 filing and a 2026 one compare directly. The SEC's own rule is applied by filing date; a minority of managers reported whole dollars before 2023 anyway, and their older amounts read a thousand times high. Dates are `yyyy-mm-dd`. Empty fields are `null`. Every position carries `id` (the key: the filing's accession number and the position's sequence), `accession_number`, `filed_on`, `period`, `manager_cik`, `manager_name`, `manager_crd`, `issuer_name`, `cusip`, `figi`, `class_title`, `value` (US dollars), `shares`, `share_type` (`SH` shares or `PRN` principal amount), `put_call` (`PUT`, `CALL` or null when the position is the security itself), `discretion`, `other_managers`, and the voting authority split into `voting_sole`, `voting_shared` and `voting_none`. Values are normalized to US dollars across the whole series. Dates are `yyyy-mm-dd`. Empty fields are `null`. An accession number no Form 13F carries returns `found: false` with HTTP 200, not an error. `holdings` is empty for a notice, which reports no positions of its own, and for quarters older than the ones the copy keeps positions for. ## Search positions `POST /us/sec-13f/holdings-search/v1` Dataset Searches the positions by any combination of issuer, manager, CUSIP, options, quarter and value. Largest first. | Field | Type | Notes | | ------------- | ------- | ----------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words in the issuer's name or the manager's name. Every word must match; no stemming. | | `cusip` | string | Optional. The security's CUSIP, nine characters: every manager holding it. | | `manager_cik` | string | Optional. The manager's EDGAR CIK, with or without leading zeros: every filing of one manager. | | `manager_crd` | string | Optional. The manager's CRD number, the same id the investment adviser registry uses. | | `put_call` | enum | Optional. `PUT` or `CALL` for option positions only; leave empty for every position. | | `period_from` | string | Optional. Earliest quarter end reported (`yyyy-mm-dd`, inclusive), e.g. `2026-03-31`. | | `period_to` | string | Optional. Latest quarter end reported (`yyyy-mm-dd`, inclusive). | | `min_value` | number | Optional. Only positions worth at least this many US dollars. Default `0`. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/sec-13f/holdings-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "nvidia", "min_value": 1000000000 }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `holdings[]`, largest first. Every position carries `id` (the key: the filing's accession number and the position's sequence), `accession_number`, `filed_on`, `period`, `manager_cik`, `manager_name`, `manager_crd`, `issuer_name`, `cusip`, `figi`, `class_title`, `value` (US dollars), `shares`, `share_type` (`SH` shares or `PRN` principal amount), `put_call` (`PUT`, `CALL` or null when the position is the security itself), `discretion`, `other_managers`, and the voting authority split into `voting_sole`, `voting_shared` and `voting_none`. Values are normalized to US dollars across the whole series. Dates are `yyyy-mm-dd`. Empty fields are `null`. Pass a `cusip` to see every manager holding one security, or a `manager_cik` to see one manager's book. The copy keeps recent quarters; `as_of` says how current it is, and the filings search covers every quarter since 2013. Schemas, all response fields, and an interactive playground. # Sunbiz Source: https://docs.usecroma.com/guides/united-states/sunbiz Florida's registry of business entities: search corporations, LLCs, partnerships and trusts by name, officer or registered agent, and look one up by document number. Every business entity registered with the Florida Division of Corporations (Sunbiz): corporations, limited liability companies, partnerships and trusts, domestic and foreign, active and inactive, with the status, the addresses, the formation date, the FEI, the registered agent and the officers the Division publishes for each. The whole registry, organized and ready to query, brought up to date every day. That is what makes a search across every entity by the name of an officer or a registered agent, or every LLC formed in Miami this quarter, a single fast call. The whole source, organized and ready to query: every endpoint on this page answers in milliseconds. Every response carries `as_of`: how current the data is. [How datasets work](/datasets). ## Search entities `POST /us/sunbiz/entities-search/v1` Dataset Searches the registry by any combination of text, name prefix, status, filing type, city, state, FEI and dates. | Field | Type | Notes | | --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | Optional. Words to match in the entity name, its officers' names and its registered agent's name. Every word must match; no stemming. | | `name_prefix` | string | Optional. The start of the entity name, the way the registry's own search matches it. Results come back alphabetical. | | `status` | enum | Optional. `active` or `inactive`. | | `filing_type` | enum | Optional. `florida_llc`, `foreign_llc`, `domestic_profit`, `foreign_profit`, `domestic_nonprofit`, `foreign_nonprofit`, `domestic_limited_partnership`, `foreign_limited_partnership`, `nonprofit_registration`, `trust` or `registered_agent_designation`. | | `city` | string | Optional. City of the principal address as the registry spells it, e.g. `MIAMI`, `TAMPA`. | | `state` | string | Optional. Two-letter state of the principal address, e.g. `FL`. | | `fei_number` | string | Optional. The entity's nine-digit FEI/EIN, with or without the hyphen. | | `filed_from` | string | Optional. Formation date lower bound (`yyyy-mm-dd`, inclusive). An entity filed with a delayed effective date carries that later date. | | `filed_to` | string | Optional. Formation date upper bound (`yyyy-mm-dd`, inclusive). | | `updated_after` | string | Optional. Only entities the registry published a change for on or after this date: what moved since you last looked. | | `page` | integer | Optional. 1-based page. Default `1`. | | `per_page` | integer | Optional. Results per page, 1-50. Default `20`. | ```bash theme={"dark"} curl https://api.croma.run/us/sunbiz/entities-search/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "registered agents inc", "status": "active", "city": "MIAMI" }' ``` Returns `as_of` (how current the data is), the applied filters, `total` (matches across every page), `page`, `per_page`, `total_pages`, `count` and `entities[]`. With `name_prefix`, alphabetical; otherwise the most recently formed first. Every entity carries `document_number` (the registry's key), `name`, `status` (`active` or `inactive`), `filing_type` (`florida_llc`, `foreign_llc`, `domestic_profit`, `foreign_profit`, `domestic_nonprofit`, `foreign_nonprofit`, `domestic_limited_partnership`, `foreign_limited_partnership`, `nonprofit_registration`, `trust`, `registered_agent_designation`), `jurisdiction` (`FL`, another state's code, or a country code for an entity formed abroad), `principal_address` and `mailing_address` (`{ line_1, line_2, city, state, zip, country }`), `filed_on`, `fei_number`, `last_transaction_on`, `annual_reports[]` (`{ year, filed_on }`, the last three), `registered_agent` (`{ kind, name, first_name, middle_name, last_name, address }`), `officers[]` (the same shape plus `title`, the office as the registry abbreviates it: `P`, `VP`, `MGR`, `AMBR`, `D`, `T`, `S`, `CEO`, ...), `officer_names[]`, `more_than_six_officers` and `updated_at` (when the registry published the state the record reflects). A person's `name` is `FIRST MIDDLE LAST`; a company's is its registered name. Dates are `yyyy-mm-dd`; a zip is `12345` or `12345-6789`. Empty fields are `null`. The whole registry, active and inactive entities alike, as of the last daily file the Division published. The registry's own site searches names one prefix at a time; here a search reaches every officer and registered agent too. ## Entity by document number `POST /us/sunbiz/entity/v1` Dataset Resolves one entity by its document number and returns the full record. | Field | Type | Notes | | ----------------- | ------ | ------------------------------------------------------------------------------------------------------------------- | | `document_number` | string | **Required.** The registry's document number, e.g. `P26000044030`, as returned by the search. Case does not matter. | ```bash theme={"dark"} curl https://api.croma.run/us/sunbiz/entity/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "document_number": "P26000044030" }' ``` Returns `found`, `document_number`, `as_of` and `entity` (null when not found). Every entity carries `document_number` (the registry's key), `name`, `status` (`active` or `inactive`), `filing_type` (`florida_llc`, `foreign_llc`, `domestic_profit`, `foreign_profit`, `domestic_nonprofit`, `foreign_nonprofit`, `domestic_limited_partnership`, `foreign_limited_partnership`, `nonprofit_registration`, `trust`, `registered_agent_designation`), `jurisdiction` (`FL`, another state's code, or a country code for an entity formed abroad), `principal_address` and `mailing_address` (`{ line_1, line_2, city, state, zip, country }`), `filed_on`, `fei_number`, `last_transaction_on`, `annual_reports[]` (`{ year, filed_on }`, the last three), `registered_agent` (`{ kind, name, first_name, middle_name, last_name, address }`), `officers[]` (the same shape plus `title`, the office as the registry abbreviates it: `P`, `VP`, `MGR`, `AMBR`, `D`, `T`, `S`, `CEO`, ...), `officer_names[]`, `more_than_six_officers` and `updated_at` (when the registry published the state the record reflects). A person's `name` is `FIRST MIDDLE LAST`; a company's is its registered name. Dates are `yyyy-mm-dd`; a zip is `12345` or `12345-6789`. Empty fields are `null`. A document number the registry does not carry returns `found: false` with HTTP 200, not an error. Schemas, all response fields, and an interactive playground. # Introduction Source: https://docs.usecroma.com/introduction The Croma API in one page: court cases, criminal records, company registries, vehicles and laws from 36 official sources in Colombia, Peru and Mexico. Croma is an API for government data. Court cases, criminal records, company registries, vehicle records, laws: 36 sources across Colombia, Peru, and Mexico, plus global web tools. Every endpoint takes the same key, returns the same JSON shape, and is also a tool on the [MCP server](/mcp-server). ## What you can query Missing a source? Ask for it in our [WhatsApp community](https://chat.whatsapp.com/KjvKXdPgbhm2mYqymm8aEp?mode=gi_t). 21 sources: courts & litigation, background checks, companies & tax, public procurement, vehicles & transit. 8 sources: taxpayer and identity lookups, vehicle and transit records. 7 sources: laws & regulation, courts & prosecutors, and the business directory. AI-powered web search, page extraction, structured generation, and cited research. ## Start building Get a key and make your first call in three steps. Connect any MCP client to every Croma tool. Full endpoint reference with a playground. # Live lookups Source: https://docs.usecroma.com/live-lookups How Croma live lookups answer: straight from the source at request time, with the source's own freshness, and async delivery when they run long. Most endpoints query the source when you call: these are **live lookups**. The answer comes from the source at that moment, in the same JSON shape as every other endpoint. The rest are [dataset endpoints](/datasets), and any endpoint without the **Dataset** pill in its guide is live. A live lookup: * returns what the source says right now, not as of a refresh, * resolves one subject per call (a cédula, a plate, a radicado), * spends **10 credits** per request (see [Rate limits](/rate-limits)). ## Latency Most live lookups answer in a few seconds, at the pace of their source. The slowest run as [async jobs](/async-jobs): wait inline, poll, or get a callback; that page lists which endpoints they are. A repeated identical lookup can answer from a recent cached result (`X-Cache: HIT`). Cached answers spend the same credits as a miss. ## Availability A live lookup is only as available as its source. When the source fails or is unreachable, the endpoint returns a `5xx` with `type: "upstream_error"` (see [Errors](/errors)). Lookups are idempotent, so retrying is always safe. The other answer mode: the whole source, queried in milliseconds. # MCP Source: https://docs.usecroma.com/mcp-server Connect Claude, ChatGPT, Cursor or any MCP client to Croma's government data sources: the server URL, authentication and every tool exposed over MCP. Croma exposes every data source as a tool over the [Model Context Protocol](https://modelcontextprotocol.io) (MCP), served over Streamable HTTP at: ``` https://api.croma.run/mcp ``` Any MCP client can connect. Interactive clients (Claude, ChatGPT, Cursor) use the OAuth flow: [add Croma to Claude in one click](https://claude.ai/new?modal=add-custom-connector\&connectorName=Croma%20%7C%20The%20API%20for%20government%20data\&connectorUrl=https%3A%2F%2Fapi.croma.run%2Fmcp#settings/customize-connectors) and sign in with your Croma account. For your own code you authenticate with the **same API key as the REST API**: send it as a bearer token and the tools run scoped to your organization, sharing the same [rate limits](/rate-limits) and usage. ## Use it from the AI SDK The [AI SDK](https://ai-sdk.dev) can load the Croma tools directly and hand them to a model for tool calling. Pass your key in the `Authorization` header of the transport: ```ts theme={"dark"} import { experimental_createMCPClient as createMCPClient, generateText } from "ai"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { anthropic } from "@ai-sdk/anthropic"; const mcp = await createMCPClient({ transport: new StreamableHTTPClientTransport( new URL("https://api.croma.run/mcp"), { requestInit: { headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}` }, }, }, ), }); // Every data source, exposed as a tool the model can call. const tools = await mcp.tools(); const { text } = await generateText({ model: anthropic("claude-opus-4-8"), tools, // Let the model call tools and then answer. Consult the AI SDK docs for the // multi-step setting in your version (`stopWhen` / `maxSteps`). prompt: "Consulta los antecedentes de la Policía Nacional para la cédula 1234567890.", }); await mcp.close(); console.log(text); ``` Treat the key as a secret: load it from an environment variable or secrets manager, never commit it, and close the client (`mcp.close()`) when you are done so the connection is released. ## Start from the chat template [Croma Chat Template](https://github.com/croma-ai/croma-chat-template) is an open-source Next.js chat built on this endpoint with the AI SDK and [AI Elements](https://ai-sdk.dev/elements): streaming responses, tool calls across every Croma source, a per-message source picker, and optional rate limiting. Try the live deployment at [chat.usecroma.com](https://chat.usecroma.com), or use the repository's one-click Vercel deploy: it asks for your `CROMA_API_KEY` and a model key and comes up ready to use. ## Tool names Tools are named after their source, with underscores instead of hyphens, for example `policia_criminal_records`, `rues_entity_by_nit`, and `rama_judicial_cases_by_radicado`. Call `mcp.tools()` to list the full set with their input schemas, or browse the [API reference](/api-reference) for the fields each one accepts. [Async lookups](/async-jobs) always wait inline over MCP: the tool call returns the finished result, with no `202`, polling, or callbacks. ## Any MCP client The AI SDK is one option. Because the endpoint speaks standard MCP over Streamable HTTP, the official [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk), LangChain, and other MCP-aware frameworks connect the same way: point them at `https://api.croma.run/mcp` and set the `Authorization: Bearer` header. # Quickstart Source: https://docs.usecroma.com/quickstart Get an API key, make your first authenticated request and read the response envelope: your first Croma API call in three steps, with copy-paste curl examples. Croma keys are issued per **organization** at [platform.usecroma.com](https://platform.usecroma.com). A key looks like `croma_live_…` (or `croma_test_…` outside production). Treat it as a secret. It carries your org's full API access. Personal keys are rejected. The API only accepts organization-scoped keys. See [Authentication](/authentication) for details. Every data endpoint is a versioned `POST` path (for example `/co/rama-judicial/cases-by-entity/v1`) on `https://api.croma.run`. It takes a small JSON body and the key in an `Authorization: Bearer` header. ```bash cURL theme={"dark"} curl https://api.croma.run/co/rama-judicial/cases-by-entity/v1 \ -H "Authorization: Bearer $CROMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "PEDRO CIFUENTES", "entity_type": "natural", "page": 1 }' ``` ```ts TypeScript theme={"dark"} const res = await fetch("https://api.croma.run/co/rama-judicial/cases-by-entity/v1", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "PEDRO CIFUENTES", entity_type: "natural", page: 1 }), }); const { data } = await res.json(); ``` ```python Python theme={"dark"} import os, requests res = requests.post( "https://api.croma.run/co/rama-judicial/cases-by-entity/v1", headers={"Authorization": f"Bearer {os.environ['CROMA_API_KEY']}"}, json={"name": "PEDRO CIFUENTES", "entity_type": "natural", "page": 1}, ) body = res.json() ``` Successful responses wrap the payload under `data`: ```json theme={"dark"} { "data": { } } ``` Rate-limit state and a request id come back as response headers; there's no `meta` object in the body: ``` X-RateLimit-Limit: 100 X-RateLimit-Remaining: 99 X-RateLimit-Reset: 2026-05-23T18:00:00.000Z X-Request-Id: req_8f3c… ``` Longer lookups resolve as [async jobs](/async-jobs): the same request can wait inline, poll, or call you back when done. Failures share one [error shape](/errors) across every endpoint. ## Next steps Connect any MCP client to every Croma tool with one URL. Full endpoint reference with an interactive playground. # Rate limits Source: https://docs.usecroma.com/rate-limits How Croma rate limits work: per-organization buckets shared across keys, plan quotas, the headers that report your usage and how 429 responses behave. ## Credits Every organization holds a plan that includes a monthly number of **credits**, and every request spends credits according to what it costs to serve: | Request | Credits | | ---------------------------------------------------------------------------------------------------- | ------- | | [Live request](/live-lookups): a country or global endpoint that queries the source when you call it | 10 | | [Dataset request](/datasets): an endpoint answered from Croma's own tables (its guide says so) | 1 | | Plan | Price | Credits / month | | -------- | ----- | --------------- | | Free | \$0 | 5,000 | | Hobby | \$20 | 20,000 | | Standard | \$99 | 100,000 | [Batch requests](/batch) spend credits **per item**: a 10-item batch of live requests spends 100. Cached hits (`X-Cache: HIT`) spend the same as a miss. Failed requests spend nothing, and job status polls never spend credits. Credits reset on the plan's monthly date and are managed from the [console](https://platform.usecroma.com/billing). Contracts carry their own monthly number. ## Per-organization buckets Rate limits are enforced **per organization**, not per key. Every key issued to the same org shares one allowance, so adding keys doesn't multiply it. A few endpoints carry an hourly ceiling on top of the plan allowance, and job polling draws from a bucket of its own: | Bucket | Limit | Endpoints | | ------------------ | ------------ | --------------------------------------------------------------------------------------- | | Extract & Generate | 60 / hour | [Extract](/guides/global/extract), [Generate](/guides/global/generate). | | Web Search | 10 / hour | [Web Search](/guides/global/web-search). | | Research | 10 / hour | [Research](/guides/global/research). | | Job polling | 600 / minute | [`GET /jobs/:id`](/async-jobs). Its own bucket, so polling never spends your allowance. | The hourly ceilings are additional, not separate: a Research call spends one of its 10 hourly slots **and** 10 credits from your plan. Each endpoint's page notes its limit. ## Quota in response headers Rate-limit state comes back as HTTP headers on every response (not in the body): | Header | Meaning | | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `X-RateLimit-Limit` | The window's size: your plan's credits on data endpoints, the hourly ceiling where one applies. | | `X-RateLimit-Remaining` | Credits (or requests, in an hourly window) left before you're throttled. | | `X-RateLimit-Reset` | ISO timestamp when the window resets. | | `RateLimit-Policy` | The window's policy as an IETF `RateLimit-Policy` field, e.g. `"credits";q=5000;w=2592000`. Endpoints with an hourly ceiling list both policies. Present on every response, including `401` and `429`, so a client can read the limits before it has a key. | ## Retries and idempotency Every Croma operation is a lookup: repeating a request with the same body returns the same result and never creates or changes a record, so retrying after a timeout or a dropped connection is always safe. Send an optional `Idempotency-Key` header (any string up to 255 characters, a UUID works) and the API echoes it back in the `Idempotency-Key` response header, so you can tie a retry to its first attempt in your logs. Each attempt that reaches the API counts against the quota above; a `429` tells you to wait for `Retry-After` seconds rather than retry immediately. \| `X-Request-Id` | Unique id for the request (`req_…`); include it in support reports. | \| `X-Cache` | `HIT` or `MISS` on cacheable endpoints. Cached hits still count against your quota. | ## When the credits are spent A request your remaining credits cannot cover returns `402` with a `billing_error` envelope. Upgrade from the console, or wait for the reset in `X-RateLimit-Reset`: ```json theme={"dark"} { "error": { "type": "billing_error", "code": "plan_limit_reached", "message": "Your plan has no credits left for this period. Upgrade at https://platform.usecroma.com/billing or wait until 2026-10-01T00:00:00.000Z." } } ``` ## When you exceed an hourly ceiling Requests over an hourly ceiling return `429` with a `rate_limit_error` envelope and a `Retry-After` header (seconds): ```json theme={"dark"} { "error": { "type": "rate_limit_error", "code": "rate_limited", "message": "Rate limit exceeded. Try again in 42 seconds." } } ``` ``` Retry-After: 42 X-RateLimit-Remaining: 0 X-RateLimit-Reset: 2026-05-23T18:00:00.000Z ``` Back off until `Retry-After` elapses (or `X-RateLimit-Reset`), then retry. The limiter **fails open**: if the rate-limit backend is briefly unavailable, requests are allowed through and no `X-RateLimit-*` headers are emitted. Don't depend on the headers always being present. The error envelope and every error code. # Versioning and deprecation Source: https://docs.usecroma.com/versioning How the Croma API is versioned, which parts of the contract can change without notice, and how much warning a retiring endpoint gets before shutdown. Agents integrate once and then run unattended, so the contract has to say up front what may change and how much warning a change gets. ## Versioning Every endpoint path carries its major version: `/co/rues/entity-by-nit/v1`, `/pe/sunat/ruc/v1`, `/global/web-search/v1`. The version is part of the path, not a header, so a request is unambiguous on its own and the OpenAPI description at `https://api.croma.run/openapi` (also `https://usecroma.com/openapi.json`) lists every version in service. Within a major version the contract only grows. These changes ship without a new version and without notice: * New endpoints, new optional request fields, new response fields. * New values in fields that are documented as open sets (source-language statuses, names, legal terms). * New sources behind an existing endpoint, when the response shape is unchanged. These changes are breaking and require a new major path (`/v2`): * Removing or renaming a request or response field. * Changing a field's type or meaning. * Making an optional request field required. * Changing an error `code` or the error envelope. Field names are English `snake_case` on every endpoint, and every endpoint accepts an optional [`Idempotency-Key`](/rate-limits#retries-and-idempotency) header; those conventions are part of the contract too. ## Deprecation When an endpoint version is scheduled for removal: 1. It is announced in the [changelog](https://usecroma.com/en/changelog) (and its [Atom feed](https://usecroma.com/changelog/atom.xml)) at least **90 days** before the sunset date, naming the successor. 2. From the announcement on, every response from the retiring endpoint carries a `Deprecation` header ([RFC 9745](https://www.rfc-editor.org/rfc/rfc9745)) with the date the deprecation took effect, a `Sunset` header ([RFC 8594](https://www.rfc-editor.org/rfc/rfc8594)) with the removal date, and a `Link` header with `rel="successor-version"` pointing at the replacement. 3. The OpenAPI description marks the operation `deprecated: true` and its description names the successor. 4. After the sunset date the path answers `410 Gone` with the standard error envelope (`code: "endpoint_retired"`) and the same `Link` header, for at least 90 more days. Two endpoints are deprecated today. `POST /co/siata/v1` (SIATA), since 2026-08-27, with sunset on 2026-12-01; its successor is the [SIATA Geoportal](/guides/colombia/siata-geoportal) source, starting with `POST /co/siata-geoportal/weather/v1`. And `POST /mx/scjn/tesis-browse/v1` (SCJN), since 2026-09-07, with sunset on 2026-12-15; its successor is [`POST /mx/scjn/tesis-search/v1`](/guides/mexico/scjn), which takes the same request and answers the same response. Every response from either carries the headers above. A client that watches for `Deprecation` and `Sunset` on every response learns of a retirement the day it is announced. ## What this does not cover * Data content. Croma returns official records as they are published; a source changing what it publishes is not an API change. Each guide notes the source's own limits. * Rate limits and quotas, which are per organization and can change with your plan. They are reported on every response; see [Rate limits](/rate-limits). * The MCP server negotiates its protocol version per the Model Context Protocol; the tool names track the endpoint ids (`rues_entity_by_nit`) and follow the same deprecation schedule as the endpoints behind them. # Caixa FGTS Regularity Certificate (CRF) Source: https://docs.usecroma.com/api-reference/brazil/caixa-fgts-regularity-certificate-crf /api-reference/openapi.json post /br/caixa/fgts-certificate/v1 Check whether a Brazilian employer is up to date with the FGTS, by CNPJ, from Caixa Econômica Federal: `regular` with the current Certificado de Regularidade do FGTS (number, validity, establishment address), or `irregular` with which body reports the impediment (PGFN or Caixa). Optionally the certificates issued in the last 24 months. `found: false` when the CNPJ is not registered as an employer. # CGU Sanction Source: https://docs.usecroma.com/api-reference/brazil/cgu-sanction /api-reference/openapi.json post /br/cgu/sanction/v1 Resolve one sanction on Brazil's federal integrity registers (CGU) by its id and return the full record: the party, its names and document (CPFs masked), the sanction, the sanctioning body, the dates, the legal basis, the process, and the fine, the expelled servant's post or the leniency agreement's terms where they apply. `found: false` when no register carries that id. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # CGU Sanctions Search Source: https://docs.usecroma.com/api-reference/brazil/cgu-sanctions-search /api-reference/openapi.json post /br/cgu/sanctions-search/v1 Search Brazil's federal integrity registers kept by the Controladoria-Geral da União (CEIS, CNEP, CEAF, CEPIM and the leniency agreements) by free text over every name the register gives the party, by CNPJ or CPF (exact; CPFs come back masked), register, party type and the sanctioning body's state. One row per sanction, by name, pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # DJEN Publications Search Source: https://docs.usecroma.com/api-reference/brazil/djen-publications-search /api-reference/openapi.json post /br/djen/publications-search/v1 Search Brazil's national court publications (Diário de Justiça Eletrônico Nacional, CNJ) by party name, lawyer name, OAB number, CNJ case number, court, free text and availability date: intimações, citações, editais and listas de distribuição from every state, federal, labour, electoral and military court and the superior courts, newest first, with the full text and the parties and lawyers each publication is addressed to. At least one of party, lawyer, OAB number, case number, court or text is required; `total` is exact for a single day and stops at 10,000 for a range. # IBAMA Environmental Embargo Source: https://docs.usecroma.com/api-reference/brazil/ibama-environmental-embargo /api-reference/openapi.json post /br/ibama/embargo/v1 One environmental embargo from IBAMA by the `id` the search returns: the party, the place and area, the infraction and whether it is active, lifted or cancelled. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # IBAMA Environmental Embargoes Search Source: https://docs.usecroma.com/api-reference/brazil/ibama-environmental-embargoes-search /api-reference/openapi.json post /br/ibama/embargoes-search/v1 Search every environmental embargo Brazil's federal environmental agency (IBAMA) has imposed since 1987, by CPF or CNPJ (or its 8-character root), name or property, state, municipality, term number or date. Each embargo carries its status (`active`, `lifted`, `cancelled`), the area in hectares, the place, the infraction and the process; the response counts how many matches are active. CPFs are matched exactly and returned masked. Updated daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # MTE Slave Labour Register Listing Source: https://docs.usecroma.com/api-reference/brazil/mte-slave-labour-register-listing /api-reference/openapi.json post /br/mte/employer/v1 One listing from Brazil's slave labour employer registers, by the `id` the search returns. `found: false` once the employer has left the register. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # MTE Slave Labour Register Search Source: https://docs.usecroma.com/api-reference/brazil/mte-slave-labour-register-search /api-reference/openapi.json post /br/mte/slave-labour-search/v1 Search Brazil's register of employers caught keeping workers in conditions analogous to slavery (Cadastro de Empregadores, the "Lista Suja"), and the register of employers under a conduct-adjustment agreement, by CNPJ (or its 8-character root), CPF, name, state or inspection year. Each listing carries the establishment, workers found, activity, the final decision date and every period on the register. CPFs are matched exactly and returned masked. Updated daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # PGFN Debtor Source: https://docs.usecroma.com/api-reference/brazil/pgfn-debtor /api-reference/openapi.json post /br/pgfn/debtor/v1 Total what one Brazilian company owes the Union in the dívida ativa (Procuradoria-Geral da Fazenda Nacional), by CNPJ or by its 8-character root for every establishment: the number of debts, the amount owed as principal debtor, the part in court, a breakdown by regime (federal taxes, social security, FGTS), and the 50 largest debts. `found: false` when PGFN has inscribed nothing. Served by Croma (`as_of` says how current the data is), refreshed with each quarterly release. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # PGFN Debts Search Source: https://docs.usecroma.com/api-reference/brazil/pgfn-debts-search /api-reference/openapi.json post /br/pgfn/debts-search/v1 Search the active debts Brazilian companies owe the Union in the dívida ativa (Procuradoria-Geral da Fazenda Nacional): federal taxes, social security contributions and the FGTS, by company name, CNPJ or its 8-character root, regime, state, status, the company's role in the debt, whether it is in court, and an amount range. Largest amount first, pages of up to 50. Companies only. Served by Croma (`as_of` says how current the data is), refreshed with each quarterly release. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # TST Labour-Debt Certificate (CNDT) Source: https://docs.usecroma.com/api-reference/brazil/tst-labour-debt-certificate-cndt /api-reference/openapi.json post /br/tst/labour-certificate/v1 Issue Brazil's labour-debt certificate (Certidão Negativa de Débitos Trabalhistas) for a company by CNPJ, live from the Tribunal Superior do Trabalho: `clear`, `debts`, or `debts_secured` (every debt secured or suspended, with the legal effect of a clearance), the certificate number, issue time and validity, and each labour case with its court and whether the debt is secured. Optionally the official PDF. Async job; most calls finish inline. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # ANCP-CCE Concepto Source: https://docs.usecroma.com/api-reference/colombia/ancp-cce-concepto /api-reference/openapi.json post /co/ancp-cce/concepto/v1 Retrieve one ANCP-CCE concepto by id or slug (e.g. `c-1094-de-2026`): full doctrinal text, dates, subjects and subtopics. `found: false` when nothing matches. # ANCP-CCE Conceptos Search Source: https://docs.usecroma.com/api-reference/colombia/ancp-cce-conceptos-search /api-reference/openapi.json post /co/ancp-cce/conceptos-search/v1 Search conceptos (public-procurement legal opinions) from the Relatoría de la ANCP-CCE (Colombia Compra Eficiente) by free text, tema (descriptor), and modification date. Paginated, newest-modified first. Drill into one with `ancp-cce-concepto` for the full text. # Colombia Law Detail Source: https://docs.usecroma.com/api-reference/colombia/colombia-law-detail /api-reference/openapi.json post /co/legalize/law/v1 Resolve a single Colombian law by its identifier and return the full record, sourced from Legalize: metadata plus the law text as Markdown (`content_md`). `found: false` when no law matches the identifier. # Colombia Laws Search Source: https://docs.usecroma.com/api-reference/colombia/colombia-laws-search /api-reference/openapi.json post /co/legalize/laws/v1 Search Colombian legislation as structured data, sourced from Legalize. Filter by free text, law type, publication year, status, and jurisdiction. Returns paginated law summaries; use `per_page` and `page` to page. Drill into one with `legalize-law-detail`. # RUNT Vehicle by Plate Source: https://docs.usecroma.com/api-reference/colombia/runt-vehicle-by-plate /api-reference/openapi.json post /co/runt/vehicle-by-plate/v1 Resolve a Colombian vehicle in RUNT (Registro Único Nacional de Tránsito) by plate and the registered owner's document. Returns the vehicle record (brand, line, model year, class, body, color, engine displacement, fuel, weights, VIN, engine/chassis/serial numbers, traffic authority, registration dates, lien/pledge flags) plus SOAT insurance history, técnico-mecánica (RTM) inspection history, extended technical data, registered guarantees/liens (with the creditor, e.g. a financing bank), ownership limitations, armoring (blindaje) status, civil-liability policies, DIJIN and scrapping certificates, normalization records, and scrapping status. `document_type` defaults to `CC`. `found: false` when the plate and owner document have no active match. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # RUNT Vehicle History by Plate Source: https://docs.usecroma.com/api-reference/colombia/runt-vehicle-history-by-plate /api-reference/openapi.json post /co/runt/vehicle-history-by-plate/v1 Look up a Colombian vehicle's history in RUNT (Registro Único Nacional de Tránsito) by plate alone, without the owner's document. Returns the registered owner(s) (name and identification number), the vehicle characteristics (brand, line, model year, class, body, color, VIN, engine/chassis/serial numbers), the traffic-license and import records, SOAT and técnico-mecánica (RTM) history, any accident on record, recent and pending procedures (trámites), and guarantee/lien and ownership-limitation summaries. `found: false` when the plate has no record. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SECOP Sanctions by Provider Source: https://docs.usecroma.com/api-reference/colombia/secop-sanctions-by-provider /api-reference/openapi.json post /co/secop/sanctions-by-provider/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/sanctions-search/v1` instead. List the fines and sanctions (multas y sanciones) recorded against one state contractor by cédula or NIT: sanctioning entity, resolution number, value, and the dates the sanction was published and became final. A direct adverse signal for counterparty screening, from Colombia Compra Eficiente's open data. # SIATA Aburrá Valley Conditions Source: https://docs.usecroma.com/api-reference/colombia/siata-aburrá-valley-conditions /api-reference/openapi.json post /co/siata/v1 Deprecated since 2026-08-27; stops answering on 2026-12-01. Use `POST /co/siata-geoportal/weather/v1` instead. Live environmental conditions for the Aburrá Valley (Medellín metropolitan area) from SIATA: per-station weather (temperature, humidity, wind, pressure), rainfall (accumulated + intensity), and air quality (24h PM2.5 + ICA index). All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) to get only nearby stations, nearest first with `distance_km` populated. Coverage is the Medellín metro area only. # SIATA Air Quality Source: https://docs.usecroma.com/api-reference/colombia/siata-air-quality /api-reference/openapi.json post /co/siata-geoportal/air-quality/v1 Current air quality at SIATA's reference stations in the Aburrá Valley (Medellín metropolitan area): 24-hour PM2.5 and PM10, 8-hour ozone and CO, 1-hour NO2 and SO2, each as a concentration with Colombia's numeric air-quality index (ICA) and its category, plus the pollutant driving each station's index. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Alerts Source: https://docs.usecroma.com/api-reference/colombia/siata-alerts /api-reference/openapi.json post /co/siata-geoportal/alerts/v1 Official notices from SIATA, the early-warning system of the Aburrá Valley (Medellín metropolitan area): title, plain-text description, validity dates and audience. Returns the active notices; pass `include_past: true` for every notice on record, most recent first. # SIATA Cameras Source: https://docs.usecroma.com/api-reference/colombia/siata-cameras /api-reference/openapi.json post /co/siata-geoportal/cameras/v1 SIATA's camera network in the Aburrá Valley (Medellín metropolitan area), about 90 cameras pointed at river gauges, the sky, underpasses and the boundary layer, each with the URL of its latest snapshot. All inputs optional: pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby cameras nearest first, or `type` (`nivel`, `cielo`, `deprimido`, `capa_limite`) to keep one kind. # SIATA Citizen Air Sensors Source: https://docs.usecroma.com/api-reference/colombia/siata-citizen-air-sensors /api-reference/openapi.json post /co/siata-geoportal/citizen-sensors/v1 The citizen-science PM2.5 sensor network of the Aburrá Valley (Medellín metropolitan area), about 230 low-cost sensors: PM2.5 over the last hour, the daily air-quality index (ICA) with its category, whether each sensor is reporting, and its data recovery over 24 hours and 15 days. All inputs optional: an empty body returns every sensor; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby sensors nearest first, or `municipality` / `station_code` to narrow. Indicative data; use the air-quality endpoint for the reference network. # SIATA Rainfall Source: https://docs.usecroma.com/api-reference/colombia/siata-rainfall /api-reference/openapi.json post /co/siata-geoportal/rainfall/v1 Rain at every SIATA gauge in the Aburrá Valley (Medellín metropolitan area): whether it is raining now and the source's extreme-rain flag, rain accumulated over seven trailing windows (5 minutes to 30 days), and monthly totals for the current year with each month's data availability. All inputs optional: an empty body returns every gauge; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby gauges nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA River Levels Source: https://docs.usecroma.com/api-reference/colombia/siata-river-levels /api-reference/openapi.json post /co/siata-geoportal/river-levels/v1 Current river, stream and storm-sewer water levels for the Aburrá Valley (Medellín metropolitan area) from SIATA: per-station level in metres against the station's flood thresholds (with a derived status), the highest and mean level over the last three hours, the source's alert colour and level, six trailing windows, basin morphology and land cover. `include_series` adds a per-minute 3-hour series. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Seismic Events Source: https://docs.usecroma.com/api-reference/colombia/siata-seismic-events /api-reference/openapi.json post /co/siata-geoportal/seismic-events/v1 The last earthquakes recorded by SIATA's accelerograph and seismograph network in the Aburrá Valley (Medellín metropolitan area): per station, the most recent events with magnitude, epicentre, depth and what the station measured (peak ground acceleration and Mercalli intensity on accelerographs, peak ground velocity on seismographs). All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. # SIATA Weather Source: https://docs.usecroma.com/api-reference/colombia/siata-weather /api-reference/openapi.json post /co/siata-geoportal/weather/v1 Current weather at every SIATA station in the Aburrá Valley (Medellín metropolitan area): temperature, humidity, wind, pressure, an hourly 12-hour series per station, and the valley's UV index with today's hourly series. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Weather Forecast Source: https://docs.usecroma.com/api-reference/colombia/siata-weather-forecast /api-reference/openapi.json post /co/siata-geoportal/forecast/v1 SIATA's two-day weather forecast for the Aburrá Valley (Medellín metropolitan area), per municipality and, for Medellín, per zone: daily maximum and minimum temperature and the likelihood of rain for each part of the day (early morning, morning, afternoon, night). Pass `municipality` to get one municipality; an empty body returns every zone. Issued once a day. # SIATA Weather Station Series Source: https://docs.usecroma.com/api-reference/colombia/siata-weather-station-series /api-reference/openapi.json post /co/siata-geoportal/weather-series/v1 Minute-by-minute weather at one SIATA station in the Aburrá Valley (Medellín metropolitan area): temperature, humidity, wind speed and pressure over the last hour at one-minute resolution (`window: "1h"`, the default) or the last six hours at five-minute resolution (`window: "6h"`), with the source's means and temperature percentiles. `station_code` is required; codes come from the weather endpoint. Returns `found: false` for an unknown station. # SIMIT Account Status Source: https://docs.usecroma.com/api-reference/colombia/simit-account-status /api-reference/openapi.json post /co/simit/account-status/v1 Look up a SIMIT (Sistema Integrado de Información sobre Multas y Sanciones por Infracciones de Tránsito) account status by vehicle plate or by a person's identification number. Returns outstanding comparendos and multas (each with the offending party, infraction codes and descriptions, traffic authority, department, amounts, and the discount/payment projections), the account totals, any payment agreements (acuerdos de pago), and driving courses (cursos viales). `is_plate` reports whether the value was matched as a plate. `clear: true` means paz y salvo (nothing outstanding). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Extract JSON Source: https://docs.usecroma.com/api-reference/global/extract-json /api-reference/openapi.json post /global/extract/json/v1 Pull structured data off any public web page. You supply a JSON Schema describing the object you want and the fields are located on the page and returned under `result`, already typed. # Extract Markdown Source: https://docs.usecroma.com/api-reference/global/extract-markdown /api-reference/openapi.json post /global/extract/markdown/v1 Turn any public web page into clean Markdown. `scope` keeps either the article body or the whole page, and `include_metadata` adds the page's title, author, published date and image. Handles pages that render themselves in the browser at `effort: max`. # Generate JSON Source: https://docs.usecroma.com/api-reference/global/generate-json /api-reference/openapi.json post /global/generate/json/v1 Read a public web page and return a new object built from it, following your `instructions` and your JSON Schema. Unlike `extract-json`, the fields need not appear on the page: summarize, classify, translate or reshape what is there. # Research Source: https://docs.usecroma.com/api-reference/global/research /api-reference/openapi.json post /global/research/v1 Answer an open question from live sources. Returns a written report in Markdown with numbered citations plus the list of sources behind it. Typically takes a few seconds; it is a research pass, not a lookup, so verify anything you act on against the primary source. # Web Search Source: https://docs.usecroma.com/api-reference/global/web-search /api-reference/openapi.json post /global/web-search/v1 AI-powered web search. Returns structured results with URLs, titles, authors, dates, highlights, and relevance scores. # Get Job Status Source: https://docs.usecroma.com/api-reference/jobs/get-job-status /api-reference/openapi.json get /jobs/{id} Poll the status and result of an async job created by an async-capable endpoint. Returns the job envelope; `data` is populated once `status` is `completed`, `error` once it is `failed`. Jobs are org-scoped — another org's job reads as 404. # Banxico Circular Source: https://docs.usecroma.com/api-reference/mexico/banxico-circular /api-reference/openapi.json post /mx/banxico/circular/v1 One Banco de México circular in full, by its `number`: subject, obligated entities, the consolidated (compiled) text PDF, the original text PDF with its DOF date, and every modification with dates and PDFs. Amendment circulars have no page of their own: looking one up returns the amended base circular (its `number` says which), whose modifications list carries the requested número. # Banxico Circulars Source: https://docs.usecroma.com/api-reference/mexico/banxico-circulars /api-reference/openapi.json post /mx/banxico/circulars/v1 The chronological index of every circular and disposición issued by Banco de México (1,200+ entries back to 1969), each with subject, abrogation status, and which base circular it modifies. One row per index entry: a circular amending several bases appears once per base. Optional `year` filters one year. Paged, 100 per page; drill into one with `banxico-circular`. # CNBV Regulation History Source: https://docs.usecroma.com/api-reference/mexico/cnbv-regulation-history /api-reference/openapi.json post /mx/cnbv/regulation-history/v1 Every modifying resolución and annex for one CNBV norma (by `regulation_id` from `cnbv-regulations`), each with its DOF date and official PDF. The Circular Única de Bancos alone carries 180+ modifications. # CNBV Regulations Source: https://docs.usecroma.com/api-reference/mexico/cnbv-regulations /api-reference/openapi.json post /mx/cnbv/regulations/v1 The CNBV's current regulatory catalog (~113 normas: leyes, disposiciones de carácter general including the Circular Única de Bancos, circulares, acuerdos, reglas), each with type, DOF publication date, applicable sectors, and the official PDF. Optional `query` filters by name. Paged, 50 per page. Norms with a `regulation_id` have modification history via `cnbv-regulation-history`. # DOF Publication Source: https://docs.usecroma.com/api-reference/mexico/dof-publication /api-reference/openapi.json post /mx/dof/publication/v1 Retrieve one publication from Mexico's official federal gazette (DOF) by id, including its plain text when the publication is machine-readable. Publications range from a few hundred characters to entire decrees, so the text is returned in character ranges: `content.total_length` is the full size, and when `content.has_more` is true request the next range with `offset: content.next_offset`. Anything published before the 1973 volume is held only as a scan and returns `is_image_only: true` with `content: null`, its metadata, and `scan_url` for the official scanned page. This returns one gazette publication, not the consolidated text of a law; for that use `diputados-federal-law`. # DOF Publications by Date Source: https://docs.usecroma.com/api-reference/mexico/dof-publications-by-date /api-reference/openapi.json post /mx/dof/publications-by-date/v1 Everything published in Mexico's official federal gazette (Diario Oficial de la Federación) on a given date: decrees, law reforms, and regulator disposiciones across the morning, evening, and extraordinary editions, each with its issuing branch and agency. The gazette is organised by day, so a date is the only way in; it publishes the decree that created or amended a law, never the consolidated current text of one. For that, use `diputados-federal-law`. The index reaches back to 1917, while machine-readable text starts with the 1973 volume: `has_text: true` marks publications retrievable with `dof-publication`, and every entry carries `scan_url` for the official scanned page. # FGR Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fgr-bulletins /api-reference/openapi.json post /mx/fiscalias/fgr/bulletins/v1 Browse the public press bulletins (comunicados) of the federal prosecutor (FGR), most recent first; page forward with `page` until `has_more` is false. Each item carries its bulletin `code`, `scope` (national or state), date, and headline, and links to the full comunicado. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía CDMX Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-cdmx-bulletins /api-reference/openapi.json post /mx/fiscalias/cdmx/bulletins/v1 Browse the public press bulletins (comunicados) of the Mexico City prosecutor, most recent first, paged with `page` (10 per page). Each bulletin carries its comunicado `code`, date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Chiapas Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-chiapas-bulletins /api-reference/openapi.json post /mx/fiscalias/chiapas/bulletins/v1 Browse the public press bulletins (comunicados) of the Chiapas state prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin carries its comunicado number, classification, date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Chihuahua Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-chihuahua-bulletins /api-reference/openapi.json post /mx/fiscalias/chihuahua/bulletins/v1 Search the public press bulletins (comunicados) of the Chihuahua state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Optional `from_date`/`to_date` bound the range. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence); the `categories` name the acting unit. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Estado de México Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-estado-de-méxico-bulletins /api-reference/openapi.json post /mx/fiscalias/edomex/bulletins/v1 Browse the public press bulletins (comunicados) of the Estado de México prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin carries its comunicado `code`, date, headline, and a link to the full document. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Jalisco Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-jalisco-bulletins /api-reference/openapi.json post /mx/fiscalias/jalisco/bulletins/v1 Search the public press bulletins (comunicados) of the Jalisco state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence) and carries the issuing author and tags. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Nuevo León Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-nuevo-león-bulletins /api-reference/openapi.json post /mx/fiscalias/nuevoleon/bulletins/v1 Search the public press bulletins (comunicados) of the Nuevo León prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin carries its date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Puebla Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-puebla-bulletins /api-reference/openapi.json post /mx/fiscalias/puebla/bulletins/v1 Search the public press bulletins (comunicados) of the Puebla state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin carries its numbered boletín, date, and headline. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Veracruz Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-veracruz-bulletins /api-reference/openapi.json post /mx/fiscalias/veracruz/bulletins/v1 Search the public press bulletins (comunicados) of the Veracruz state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Optional `from_date`/`to_date` bound the range. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence). These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Zacatecas Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-zacatecas-bulletins /api-reference/openapi.json post /mx/fiscalias/zacatecas/bulletins/v1 Browse the public press bulletins (comunicados) of the Zacatecas state prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence) and carries the full text. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Mexican Federal Law Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-law /api-reference/openapi.json post /mx/diputados/federal-law/v1 One Mexican federal law in full by its `law_id`: current consolidated text (PDF/DOC), original DOF publication with its scan, and every reform decree that amended it, newest first, each with its DOF date, headline, documents, and any fe de erratas. # Mexican Federal Laws Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-laws /api-reference/openapi.json post /mx/diputados/federal-laws/v1 The Cámara de Diputados catalog of federal laws and codes (315+), each with its official name, abbreviation, original DOF publication date, most recent reform date, consolidated PDF/DOC text, and whether it is still in force. Optional `query` filters by name or abbreviation. Paged, 100 per page; drill into one with `diputados-federal-law`. # Mexican Federal Regulations Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-regulations /api-reference/openapi.json post /mx/diputados/federal-regulations/v1 The Cámara de Diputados catalog of federal reglamentos (135+), each with its DOF publication date, consolidated text, whether it is still in force, and an inline history of reforms, annual amount updates, erratas and vigencia notices. Optional `query` filters by name. Paged, 50 per page. # Mexican Law Reforms by Year Source: https://docs.usecroma.com/api-reference/mexico/mexican-law-reforms-by-year /api-reference/openapi.json post /mx/diputados/law-reforms/v1 Every reform decree published in the DOF in one year, from the Cámara de Diputados reform log: the decree prose, the canonical actions it takes (reforman, adicionan, derogan, abrogan, expiden...), and every law it touches. One entry per publication day; a single day can bundle several instruments. Defaults to the current year. Paged, 50 decrees per page. # SCJN Tesis Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis /api-reference/openapi.json post /mx/scjn/tesis/v1 Retrieve one tesis by its registro digital (`registration_number`), including the full text, citation (clave, época, localización), subjects, precedent notes, and linked ruling ids. # SCJN Tesis Browse Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis-browse /api-reference/openapi.json post /mx/scjn/tesis-browse/v1 Deprecated since 2026-09-07; stops answering on 2026-12-15. Use `POST /mx/scjn/tesis-search/v1` instead. Same request and response as `scjn-tesis-search`, which replaces it: the Mexican Supreme Court's case law in full, filtered by words in the title and text, binding force, subject, época, year, instance, court, formation, publication window and the court's modification date. Newest first, pages of up to 20 full records, with `as_of`. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SCJN Tesis Search Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis-search /api-reference/openapi.json post /mx/scjn/tesis-search/v1 Search the Mexican Supreme Court's case law: every tesis and jurisprudencia the Semanario Judicial de la Federación has published since 1911 (300k+), each in full. Match words in the title and text (`query`, optional; every word must appear) and filter by binding force (`tesis_type`: jurisprudencia vs aislada), subject (materia), época number, year, deciding level (`instance`), court or chamber, how the criterion was formed (`formation`), publication window (`published_from`/`published_to`) and the court's own modification date (`updated_after`). Newest first, pages of up to 50 full records; `as_of` says how current the data is. Read one by its registro digital with `scjn-tesis`. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SIEM Establishment Source: https://docs.usecroma.com/api-reference/mexico/siem-establishment /api-reference/openapi.json post /mx/siem/establishment/v1 Retrieve one SIEM establishment's declared profile: RFC, legal or personal name, commercial name, activity, address and contact, headcount, import/export flags, declared products and services, and registration status. Returns `found: false` when the id is unknown. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SIEM Establishments Search Source: https://docs.usecroma.com/api-reference/mexico/siem-establishments-search /api-reference/openapi.json post /mx/siem/establishments/v1 Search Mexican business establishments in the SIEM directory by commercial name or razón social. Optional filters narrow by state (INEGI code) and SCIAN activity. SIEM is a self-declared directory: registration is voluntary and each establishment chooses which fields stay public, so absence is not evidence of anything. Drill into a result with `siem-establishment`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # APESEG SOAT Certificate History Source: https://docs.usecroma.com/api-reference/peru/apeseg-soat-certificate-history /api-reference/openapi.json post /pe/apeseg/soat/v1 Look up a vehicle plate's SOAT (mandatory traffic-accident insurance) certificate history from APESEG (Asociación Peruana de Empresas de Seguros). `has_active_soat: true` means a currently valid (VIGENTE) certificate exists, returned as `active`; `certificates` lists the full history. `found: false` when the plate has no SOAT record. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Callao Traffic Tickets Source: https://docs.usecroma.com/api-reference/peru/callao-traffic-tickets /api-reference/openapi.json post /pe/callao/papeletas/v1 List the outstanding traffic tickets (papeletas) registered against a vehicle plate in the province of Callao, issued by the Municipalidad Provincial del Callao. `has_papeletas: false` means the plate has no outstanding tickets on record. When tickets exist, `papeletas` lists each one (code, ticket number, infraction date, amount, installment) and `total` is the sum of the outstanding amounts in PEN. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # OECE Process by OCID Source: https://docs.usecroma.com/api-reference/peru/oece-process-by-ocid /api-reference/openapi.json post /pe/oece/process/v1 Resolve one Peruvian public-procurement procedure (SEACE, published by OECE) by its OCDS id and return the full record: buyer, estimated value, items with their stage, bidding documents, awards with suppliers, and contracts. `found: false` when there is no procedure with that id. Served by Croma (`as_of` says how current the data is), covering procedures published from 2020. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # OECE Processes Search Source: https://docs.usecroma.com/api-reference/peru/oece-processes-search /api-reference/openapi.json post /pe/oece/processes-search/v1 Search Peru's public-procurement procedures (SEACE, published by OECE) by free text over title and description, buyer RUC, awarded supplier RUC, department, category (goods/services/works), procedure type, publication-date window and last-modified date. Newest first, pages of up to 50. Served by Croma (`as_of` says how current the data is), covering procedures published from 2020. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # RREE Foreigner Cards Source: https://docs.usecroma.com/api-reference/peru/rree-foreigner-cards /api-reference/openapi.json post /pe/rree/foreigner-cards/v1 Verify a Peruvian foreigner identity card (carné de extranjería) by its 8-digit card number: names, nationality, immigration status, and expiration. `found: false` when no card matches. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAT Lima Account Status Source: https://docs.usecroma.com/api-reference/peru/sat-lima-account-status /api-reference/openapi.json post /pe/sat-lima/account-status/v1 Look up outstanding debt owed to the SAT de Lima (Servicio de Administración Tributaria de Lima) for a person, company, or vehicle. Pass `document_type` (`dni`, `ruc`, `placa`, `papeleta`, `cod_administrado`, or `compromiso`; defaults to `dni`) plus `document_number`. Returns each outstanding item (taxes such as impuesto vehicular / predial / arbitrios, traffic tickets, administrative fines, and payment commitments) with its group, reference, amount, status, and relevant dates, plus the account total. `clear: true` means nothing is outstanding. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAT Lima Vehicle Capture Orders Source: https://docs.usecroma.com/api-reference/peru/sat-lima-vehicle-capture-orders /api-reference/openapi.json post /pe/sat-lima/capturas/v1 Check whether a vehicle plate has an outstanding capture order (orden de captura) in the province of Lima, issued by the SAT de Lima (Servicio de Administración Tributaria de Lima) for unpaid tax debt or traffic tickets. `has_capture_order: false` means the plate has no capture order on record. When an order exists, `orders` lists each one with the fields the source reports. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SBS SOAT Report Source: https://docs.usecroma.com/api-reference/peru/sbs-soat-report /api-reference/openapi.json post /pe/sbs/soat/v1 Look up a vehicle plate's SOAT (mandatory traffic-accident insurance) report from SBS (Superintendencia de Banca, Seguros y AFP), Peru's banking and insurance regulator. Returns `accident_count` (accidents covered by SOAT in the last 5 years) and `policies`, the list of SOAT policies on record (issuing company, vehicle class/use, accidents per policy, policy/certificate number, coverage window, and status VIGENTE/VENCIDA/ANULADA). `has_active_soat: true` means a policy is currently in force, returned as `active`. `found: false` means no SOAT information is reported for the plate. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer by Document Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-by-document /api-reference/openapi.json post /pe/sunat/document/v1 Look up a Peruvian taxpayer's full record by identity document (DNI, carné de extranjería, passport, or diplomatic card). `found: false` when no taxpayer matches. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer by RUC Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-by-ruc /api-reference/openapi.json post /pe/sunat/ruc/v1 Look up a Peruvian taxpayer's full record by RUC (11 digits). `found: false` when the RUC is not registered. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer Search by Name Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-search-by-name /api-reference/openapi.json post /pe/sunat/name/v1 Search Peruvian taxpayers by name or razón social. Returns up to 30 matches (SUNAT's cap). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUTRAN Infraction Record Source: https://docs.usecroma.com/api-reference/peru/sutran-infraction-record /api-reference/openapi.json post /pe/sutran/infracciones/v1 Look up the infraction documents (papeletas and other actos) on record for a vehicle plate from SUTRAN (Superintendencia de Transporte Terrestre de Personas, Carga y Mercancías), Peru's national road-transport authority. `has_infractions: false` means the plate has no infractions on record. When infractions exist, `infractions` lists each one (document number, type, date, infraction code, classification). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Delaware Entities Search Source: https://docs.usecroma.com/api-reference/united-states/delaware-entities-search /api-reference/openapi.json post /us/delaware/entities-search/v1 Search the Delaware Division of Corporations registry of business entities by name: corporations, LLCs, limited partnerships, statutory trusts and partnerships, domestic and foreign, active and inactive. Returns up to 50 matches with their file numbers (`truncated` says whether more exist); `exact: true` matches the full name exactly. Pass a file number to `delaware_entity` for the record. # Delaware Entity by File Number Source: https://docs.usecroma.com/api-reference/united-states/delaware-entity-by-file-number /api-reference/openapi.json post /us/delaware/entity/v1 Look up one Delaware business entity by its file number and return the Division of Corporations' free record: name, incorporation or formation date, entity kind and type, residency, state of formation and the registered agent. `found: false` when the Division has no entity under that number. Live from the Division; not a statement of good standing. # SEC Form D Filing Source: https://docs.usecroma.com/api-reference/united-states/sec-form-d-filing /api-reference/openapi.json post /us/sec/form-d-filing/v1 Resolve one Form D filing by its EDGAR accession number and return the full record: issuer, executives and directors, industry, exemptions, securities, amounts offered and sold, investors, sales compensation and signature. `found: false` when EDGAR has no Form D under that number. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SEC Form D Search Source: https://docs.usecroma.com/api-reference/united-states/sec-form-d-search /api-reference/openapi.json post /us/sec/form-d-search/v1 Search every Form D filed with the SEC since 2008 (the notice a US company or fund files when it raises money privately) by free text over the issuer and its executives, directors and promoters, by issuer CIK, state, jurisdiction of incorporation, industry group, fund type, funds in or out, form type (new or amendment), filing-date window and minimum amount sold. Newest first, pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Sunbiz Entities Search Source: https://docs.usecroma.com/api-reference/united-states/sunbiz-entities-search /api-reference/openapi.json post /us/sunbiz/entities-search/v1 Search Florida's registry of business entities (Sunbiz, the Division of Corporations) by free text over the entity name, its officers and its registered agent, by name prefix, status (active/inactive), filing type (LLC, corporation, partnership, trust...), city and state of the principal address, FEI number, formation-date window and last-published date. Pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Sunbiz Entity by Document Number Source: https://docs.usecroma.com/api-reference/united-states/sunbiz-entity-by-document-number /api-reference/openapi.json post /us/sunbiz/entity/v1 Resolve one Florida business entity (Sunbiz, the Division of Corporations) by its document number and return the full record: status, filing type, addresses, formation date, FEI, annual reports, registered agent and officers. `found: false` when the registry has no entity with that number. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Create an export Source: https://docs.usecroma.com/legal/api-reference/create-export legal/openapi.json POST /v1/exports Start an export of your filtered Croma Legal dataset as CSV or JSONL: an async job that returns a job id you poll until the download URL is ready to fetch. # Portfolio analytics Source: https://docs.usecroma.com/legal/api-reference/get-analytics legal/openapi.json GET /v1/analytics Aggregate analytics over your Croma Legal portfolio: process counts, actuación activity and defendant totals, scoped to your organization's own data. # Get job status Source: https://docs.usecroma.com/legal/api-reference/get-job legal/openapi.json GET /jobs/{id} Poll the status of a Croma Legal async job by id: pending, running, completed or failed, with the result payload or download URL once it finishes running. # Get a process Source: https://docs.usecroma.com/legal/api-reference/get-process legal/openapi.json GET /v1/processes/{process_id} Fetch one court case from your Croma Legal portfolio by id: radicación, parties, court, status and the case metadata tracked daily for your organization. # List actuaciones Source: https://docs.usecroma.com/legal/api-reference/list-actions legal/openapi.json GET /v1/actions List actuaciones across your whole Croma Legal portfolio with cursor pagination and date filters: every court action as it is published, newest first. # List a defendant's processes Source: https://docs.usecroma.com/legal/api-reference/list-defendant-processes legal/openapi.json GET /v1/defendants/{defendant_id}/processes List every court case linked to one defendant in your Croma Legal portfolio, with the same filters and cursor pagination as the main process list endpoint. # List defendants Source: https://docs.usecroma.com/legal/api-reference/list-defendants legal/openapi.json GET /v1/defendants List the defendants tracked in your Croma Legal portfolio with cursor pagination: each with its document, name and the court cases currently linked to it. # List a process's actuaciones Source: https://docs.usecroma.com/legal/api-reference/list-process-actions legal/openapi.json GET /v1/processes/{process_id}/actions List one process's actuaciones in your Croma Legal portfolio: every court action for the case with its dates, annotations and cursor pagination built in. # List processes Source: https://docs.usecroma.com/legal/api-reference/list-processes legal/openapi.json GET /v1/processes List the court cases in your Croma Legal portfolio with cursor pagination and filters by status, court, defendant document or date of last actuación. # API Reference Source: https://docs.usecroma.com/legal/api-reference/overview The complete Croma Legal API reference: every endpoint with its parameters, response schema, error codes and an interactive playground to try calls. Every endpoint in this reference lives under `https://api.legal.usecroma.com` and is authenticated with a bearer API key. Pick an endpoint from the sidebar to see its parameters, response schema, an example, and a "try it" playground. ## Endpoints | Method | Path | What it returns | | ------ | ------------------------------------------------------------------------------------------ | ----------------------------------------------------- | | `GET` | [`/v1/processes`](/legal/api-reference/list-processes) | Your cases, filtered and cursor-paginated. | | `GET` | [`/v1/processes/{process_id}`](/legal/api-reference/get-process) | One case, fully enriched. UUID or radicado. | | `GET` | [`/v1/processes/{process_id}/actions`](/legal/api-reference/list-process-actions) | A case's actuaciones, newest first. | | `GET` | [`/v1/actions`](/legal/api-reference/list-actions) | The organization-wide actuaciones feed. | | `GET` | [`/v1/defendants`](/legal/api-reference/list-defendants) | Your defendants with case counts. | | `GET` | [`/v1/defendants/{defendant_id}/processes`](/legal/api-reference/list-defendant-processes) | Every case linked to one defendant. | | `GET` | [`/v1/analytics`](/legal/api-reference/get-analytics) | KPIs and distributions over the portfolio. | | `POST` | [`/v1/exports`](/legal/api-reference/create-export) | A CSV / JSONL export of the complete dataset (async). | | `GET` | [`/jobs/{id}`](/legal/api-reference/get-job) | Status and result of an export job. | ## Conventions * **Auth**: `Authorization: Bearer ` on every endpoint. See [Authentication](/legal/authentication). * **Read endpoints are `GET`** with filters as query parameters; only exports are a `POST` with a JSON body. * **Success**: responses wrap the payload under `data`: `{ "data": … }`. Lists add `next_cursor` and `has_more` (or `total`). * **Errors**: `{ "error": { "type", "code", "message" } }` with a non-2xx status. See [Errors](/legal/errors). * **No match**: an empty list is a `200`, not a `404`. Only the single-case endpoints return `404`, when the id or radicado isn't in your organization. * **Field names** are `snake_case`; dates are ISO 8601 in UTC; ids are UUIDs, and processes also accept their radicado. * **Rate limits**: reported via `X-RateLimit-*` response headers. See [Rate limits](/legal/rate-limits). * **Scoping**: every response is limited to the organization that owns the key. There is no parameter to choose another organization. Cursors, page sizes, date semantics and incremental sync. Wait inline, poll, or get a callback for the complete dataset. # Authentication Source: https://docs.usecroma.com/legal/authentication Where Croma Legal API keys are created and revoked, how the bearer scheme works, how keys scope to your organization and what to do the moment a key leaks. ## Where to get a key Keys are created and revoked in the Croma Legal dashboard at [legal.usecroma.com](https://legal.usecroma.com), under **Desarrolladores**, tab **Claves de API**. The full key is shown only once at creation, so copy it somewhere safe before leaving the page. An organization can hold up to **5** active keys; revoke the ones you no longer use. Open the Croma Legal dashboard to mint and manage your organization's keys. Key management is enabled per user by Croma (every member of the organization sees the MCP setup, but only enabled users see the **Claves de API** tab). If you need it, ask your Croma contact. ## Bearer scheme Send the key in the `Authorization` header using the `Bearer` scheme, on every request: ```bash theme={"dark"} Authorization: Bearer croma_live_xxxxxxxxxxxxxxxxxxxx ``` The same key authenticates the REST API and the [MCP server](/legal/mcp-server): usage and rate limits are shared between the two. ## Organization-scoped keys only Keys are minted for an **organization**, not an individual user, and every request is scoped to that organization: the API never accepts an organization id from the caller. A personal key is rejected with `401`: ```json theme={"dark"} { "error": { "type": "authentication_error", "code": "personal_api_key_not_allowed", "message": "Personal API keys are not allowed. Use an organization key." } } ``` ## Key format Keys are issued branded as `croma__…`: `croma_live_…` in production and `croma_test_…` elsewhere. Legal keys only work against `api.legal.usecroma.com`; a key from the Croma public-data platform (`platform.usecroma.com`) is rejected here, and vice versa. A key grants read access to your organization's entire portfolio, including defendant identification numbers and any data you imported. Store it as a secret (environment variable or secrets manager), never commit it, and revoke it from the dashboard the moment it may have been exposed. Revocation takes effect immediately. ## Failed authentication Every authentication failure returns `401` with an `authentication_error` envelope. The `code` tells you what went wrong: | Code | What it means | How to fix | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | `invalid_api_key` | The `Authorization` header is missing or malformed, or the key was revoked, expired, or belongs to another Croma product. | Send a valid Legal key as `Authorization: Bearer `, or create a new one in the dashboard. | | `personal_api_key_not_allowed` | A personal key was used where only organization keys are accepted. | Use an organization key created from the Croma Legal dashboard. | How lists page, which dates mean what, and how to sync incrementally. # Errors Source: https://docs.usecroma.com/legal/errors The Croma Legal API error envelope: how failures are shaped, every status code the API returns, stable error codes and how to branch on them safely. ## Envelope Successful responses return `{ "data": … }`. Failures return an `error` object and a non-2xx HTTP status. Branch on the status code, not a body flag: ```json theme={"dark"} { "error": { "type": "invalid_request_error", "code": "invalid_param", "message": "status must be one of TRACKING, NOT_TRACKING.", "param": "status", "details": { "issues": [{ "path": "status", "message": "status must be one of TRACKING, NOT_TRACKING." }] } } } ``` | Field | Notes | | --------- | ---------------------------------------------------------- | | `type` | Broad category (see below). | | `code` | Specific machine-readable code. Branch on this. | | `message` | Human-readable; safe to surface in UI. | | `param` | Offending field. Present on validation errors. | | `details` | Optional structured detail (e.g. all validation `issues`). | Every response also carries an `X-Request-Id` header; include it when reporting an issue. Error responses repeat the `code` in an `X-Croma-Error-Code` header, so you can branch without parsing the body. ## Types and codes | Status | `type` | `code` | Meaning | | ------ | ----------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `400` | `invalid_request_error` | `invalid_param` | A query parameter or body field failed validation; see `param` / `details`. Unknown enum values, an unrecognized `city`, or an invalid export body land here. | | `400` | `invalid_request_error` | `callback_unavailable` | [Export](/legal/exports) callback delivery is temporarily unavailable. Wait inline or poll the status URL instead. | | `401` | `authentication_error` | `invalid_api_key` | Missing or invalid key. See [Authentication](/legal/authentication). | | `401` | `authentication_error` | `personal_api_key_not_allowed` | A personal key was used; organization keys only. | | `404` | `not_found_error` | `not_found` | No process with that id or radicado in your organization. | | `404` | `not_found_error` | `job_not_found` | No [export job](/legal/exports) with that id in your organization. | | `404` | `not_found_error` | `endpoint_not_found` | No API endpoint at that path. See the [API Reference](/legal/api-reference/overview). | | `405` | `invalid_request_error` | `method_not_allowed` | Wrong method. Read endpoints are `GET`; exports are `POST`. The `Allow` header names the right one. | | `429` | `rate_limit_error` | `rate_limited` | Quota exceeded; see [Rate limits](/legal/rate-limits). | | `500` | `api_error` | `internal_error` | Unexpected internal error. Retry, and contact support with the `X-Request-Id` if it persists. | | `502` | `api_error` | `job_failed` | An [export](/legal/exports) that was waited on inline failed. | A "no match" on a list is never a `404`: searches and feeds return `200` with an empty `data`, and a defendant with no cases returns an empty list. Only the single-case endpoints (`GET /v1/processes/{id}` and its `/actions`) return `404`, and only when the id or radicado isn't in your organization. A case that exists but belongs to another organization also reads as `404`. [Exports](/legal/exports) can also fail as a **job** rather than as an HTTP error: a polled or called-back job carries the same `error` object inside the envelope, with `code: "job_failed"`. # Exports Source: https://docs.usecroma.com/legal/exports Export your complete filtered Croma Legal dataset as a CSV or JSONL download: the async job lifecycle, download URLs and the limits that apply to each export. Lists page at up to 100 rows per request, which is right for an app and wrong for a BI load. **Exports** produce one file with the complete filtered dataset of an entity (processes, actuaciones or defendants), up to 100,000 rows, and hand you a download URL. ``` POST https://api.legal.usecroma.com/v1/exports ``` Because a large portfolio takes longer than a single request should hold, an export runs as an **async job**: the same request can resolve three ways, and you choose which fits your app. **Small exports feel synchronous.** By default the request waits up to 20 seconds and, if the file is ready, returns `200 { data }` with the URL. The other modes are opt-in, for when you'd rather not hold the connection open. ## The request ```json theme={"dark"} { "entity": "processes", "format": "csv", "filters": { "status": "TRACKING", "date_from": "2024-01-01" } } ``` | Field | Required | Meaning | | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity` | yes | `processes`, `actions` or `defendants`. | | `format` | no | `csv` (default; UTF-8 with BOM so Excel renders accents) or `jsonl` (one JSON object per line, best for scripts). | | `filters` | no | Same names as the list endpoints' query params, in one flat object. Filters that don't apply to the chosen entity are ignored. See [ExportFilters](/legal/api-reference/create-export). | | `callback_url` | no | Public HTTPS URL to `POST` the result to. Turns on [callback mode](#mode-3-callback-webhook). | Unknown fields in the body (or in `filters`) are rejected with `400`. The result, once the file exists: ```json theme={"dark"} { "data": { "url": "https://files.usecroma.com/legal-exports/processes-2026-08-21.csv", "entity": "processes", "format": "csv", "rows": 1280, "bytes": 418233, "truncated": false, "expires_at": "2026-08-22T14:03:10.000Z" } } ``` * `url` is unguessable but not authenticated: anyone holding it can download the file. It is guaranteed until `expires_at` (24 hours after completion) and removed shortly after; download promptly and don't post it anywhere public. * `truncated: true` means the 100,000-row cap was hit and the file is **not** the complete dataset. Narrow the filters (for instance by date range) and export again. ## The three ways to get the result | Mode | You send | You get back | | ------------------------- | ---------------------------------- | ------------------------------------------------- | | **Wait inline** (default) | nothing extra, or `Prefer: wait=N` | `200 { data }` if it finishes in time, else `202` | | **Poll** | `Prefer: wait=0` | `202` now, then `GET /jobs/:id` until done | | **Callback** | `callback_url` in the body | `202` now, then a `POST` to your URL when done | All three are backed by the **same job**, so pick per request. *** ## Mode 1: Wait inline (default) Just call the endpoint. The request holds open until the file is ready (up to **20 seconds** by default) and returns `{ data }`. ```bash cURL theme={"dark"} curl -X POST https://api.legal.usecroma.com/v1/exports \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "entity": "defendants", "format": "jsonl" }' ``` ```ts TypeScript theme={"dark"} const res = await fetch("https://api.legal.usecroma.com/v1/exports", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_LEGAL_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ entity: "defendants", format: "jsonl" }), }); if (res.status === 200) { const { data } = await res.json(); // data.url is ready to download } else if (res.status === 202) { // not ready in time; poll the status URL (see Mode 2) } ``` Control how long to wait with the standard [`Prefer: wait=N`](https://www.rfc-editor.org/rfc/rfc7240#section-4.3) header (seconds, clamped to **55**): ```bash theme={"dark"} curl -X POST https://api.legal.usecroma.com/v1/exports \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" \ -H "Content-Type: application/json" \ -H "Prefer: wait=50" \ -d '{ "entity": "processes", "format": "csv" }' ``` * **`200`**: done. Body is `{ "data": … }` as above. * **`202`**: not done within the wait. Body is a [job envelope](#the-job-envelope); follow its `status_url` to poll. The `X-Job-Id` header carries the job id. Always handle both `200` and `202`. A `202` is not an error; it just means "still generating, come back for it." A portfolio of tens of thousands of actuaciones routinely takes longer than the default 20-second wait. *** ## Mode 2: Poll Send `Prefer: wait=0` to get a `202` immediately, then `GET` the job's `status_url` until it reaches a terminal state. ```bash cURL theme={"dark"} # 1. Start the export (returns 202 immediately) curl -i -X POST https://api.legal.usecroma.com/v1/exports \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" \ -H "Content-Type: application/json" \ -H "Prefer: wait=0" \ -d '{ "entity": "actions", "filters": { "since": "2026-01-01" } }' # 2. Poll the status_url from the response (or the Location header) curl https://api.legal.usecroma.com/jobs/run_abc123def456 \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" ``` ```ts TypeScript theme={"dark"} // 1. Start the export const start = await fetch("https://api.legal.usecroma.com/v1/exports", { method: "POST", headers: { Authorization: `Bearer ${process.env.CROMA_LEGAL_API_KEY}`, "Content-Type": "application/json", Prefer: "wait=0", }, body: JSON.stringify({ entity: "actions", filters: { since: "2026-01-01" } }), }); const { job } = await start.json(); // 2. Poll until terminal async function poll(statusUrl: string) { while (true) { const res = await fetch(statusUrl, { headers: { Authorization: `Bearer ${process.env.CROMA_LEGAL_API_KEY}` }, }); const body = await res.json(); if (body.job.status === "completed") return body.data; if (["failed", "canceled", "expired"].includes(body.job.status)) { throw new Error(body.error?.message ?? body.job.status); } // honor Retry-After; defaults to 2s while running const wait = Number(res.headers.get("Retry-After") ?? 2) * 1000; await new Promise((r) => setTimeout(r, wait)); } } const { url } = await poll(job.status_url); ``` `GET /jobs/:id` always returns `200` with the [envelope](#the-job-envelope). While the job is still running it includes a `Retry-After` header (seconds); use it to pace your polling. Polling has its own generous [rate-limit bucket](/legal/rate-limits). Jobs are scoped to your organization; a job belonging to another organization reads as `404`. *** ## Mode 3: Callback (webhook) Include a `callback_url` in the request body. You get a `202` right away, and Croma `POST`s the result to your URL once the file is ready, with no polling. ```bash theme={"dark"} curl -i -X POST https://api.legal.usecroma.com/v1/exports \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "entity": "processes", "format": "csv", "callback_url": "https://your-app.com/webhooks/croma-legal" }' ``` `callback_url` must be an absolute **HTTPS** URL on a public host (localhost and private ranges are rejected). When the job finishes, Croma sends a `POST` to it: * **Body**: the same [job envelope](#the-job-envelope) as the poll endpoint. * **`x-croma-job-id`**: the job id. * **`x-croma-signature`**: `sha256=`, an HMAC-SHA256 of the raw request body, so you can verify the payload's integrity. ```http theme={"dark"} POST /webhooks/croma-legal HTTP/1.1 content-type: application/json x-croma-job-id: run_abc123def456 x-croma-signature: sha256=9f86d081… { "job": { "id": "run_abc123def456", "status": "completed", … }, "data": { "url": "…" }, "error": null } ``` Signature verification uses a shared secret issued by Croma; reach out if you want it enabled for your callbacks. Respond `2xx` quickly; non-`2xx` responses are retried. *** ## The job envelope The `202` response, `GET /jobs/:id`, and the callback body all share one shape: ```json theme={"dark"} { "job": { "id": "run_abc123def456", "status": "completed", "endpoint": "/v1/exports", "created_at": "2026-08-21T14:03:10.000Z", "finished_at": "2026-08-21T14:03:41.000Z", "status_url": "https://api.legal.usecroma.com/jobs/run_abc123def456" }, "data": { "url": "…", "entity": "processes", "format": "csv", "rows": 1280, "bytes": 418233, "truncated": false, "expires_at": "2026-08-22T14:03:41.000Z" }, "error": null } ``` * **`data`** is populated only when `status` is `completed`. Otherwise it's `null`. * **`error`** is populated only when the job has `failed`, as `{ "type", "code", "message" }` with `code: "job_failed"`. ### Statuses | `status` | Terminal? | Meaning | | ----------- | --------- | -------------------------------------------------- | | `queued` | no | Accepted, waiting to run. | | `running` | no | Generating the file. | | `completed` | yes | Done. Read `data.url`. | | `failed` | yes | The export errored. Read `error`; create it again. | | `canceled` | yes | The run was canceled. | | `expired` | yes | The run expired before completing. | ## What's in the file Columns are the same whether you pick `csv` or `jsonl`. Nested values (`metadata`) are serialized as JSON text in CSV cells. `id`, `registration_number`, `plaintiff_name`, `defendant_name`, `defendant_id`, `office`, `status`, `registration_date`, `last_discovery_date`, `is_private`, `latest_action_message`, `latest_action_date`, `metadata`. The two `latest_action_*` columns carry the most recent actuación of each case, so the file reads like the portfolio view in the dashboard. `id`, `process_id`, `registration_number`, `message`, `note`, `registration_date`, `action_created_at`, `source`, `publication_url`, `document_url`, `plaintiff_name`, `defendant_name`, `defendant_id`, `defender_name`, `office`, `priority`, `is_private`, `last_discovery_date`, `metadata`. This is the largest dataset: filter by `since`, `date_from` / `date_to`, `office` or `defendant` to stay under the row cap. `id`, `identification_number`, `name`, `process_count`, `metadata`, `created_at`. ## Headers reference | Header | Where | Meaning | | ---------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------- | | `Prefer: wait=N` | request | Seconds to wait inline before returning `202`. Default 20, clamped to 55. `wait=0` returns `202` immediately. | | `Preference-Applied: wait=N` | `200` response | Echoes the wait that was applied. | | `Location` | `202` response | The job's `status_url`. | | `Retry-After` | `202` / running poll | Suggested seconds before polling again. | | `X-Job-Id` | `202` / `200` response | The job id. | Full request and response schema, with the filters per entity. How failures and the `error` object work. # Introduction Source: https://docs.usecroma.com/legal/introduction The Croma Legal API gives your systems the same view as the dashboard: read your litigation portfolio, defendants and every actuación as it is published. Croma Legal tracks your organization's court cases and surfaces every new actuación as it is published. The Legal API gives your own systems the same view: read your portfolio of **processes**, the **actuaciones** feed across every case, your **defendants**, aggregated **analytics**, and bulk **exports**, all scoped to your organization and all behind one key. ``` https://api.legal.usecroma.com ``` Every endpoint is a `GET` with query parameters (exports are a `POST`) and returns JSON under `data`. The same key also opens the [MCP server](/legal/mcp-server), so an AI assistant can answer questions over the portfolio with the identical tools. This is a different product from the Croma public-data API at `api.croma.run` (court, registry and vehicle lookups across Colombia, Peru and Mexico). Keys are not interchangeable: Legal keys are issued from the Croma Legal dashboard and only work here. For public-data lookups, start at the [Croma API introduction](/introduction). ## What you can read Your cases with status, office, filing date, the linked defendant, and your own custom fields. Look one up by radicado. The organization-wide feed of filings and court events, or the timeline of a single case. Built for incremental syncs. Demandados with their case counts and any data you imported about them, such as medidas cautelares. KPIs and distributions by status, office, city, period and most active cases, for dashboards and reports. The complete filtered dataset as CSV or JSONL, generated asynchronously and delivered as a download URL. The same data as tools for Claude, ChatGPT, Cursor or your own agent, including read-only SQL over your portfolio. ## Start building Get a key and list your processes in three steps. Where keys come from and how the bearer scheme works. Every endpoint with its parameters, response shape and a playground. # MCP Source: https://docs.usecroma.com/legal/mcp-server Query your litigation portfolio as read-only tools over MCP from Claude, ChatGPT, Cursor or your own agent: server URL, auth and every tool exposed. Croma Legal exposes the portfolio as tools over the [Model Context Protocol](https://modelcontextprotocol.io) (MCP), served over Streamable HTTP at: ``` https://api.legal.usecroma.com/mcp ``` Every tool is **read-only** and runs scoped to your organization. Two ways to authenticate are accepted: * **OAuth**, for interactive clients (Claude, ChatGPT, Cursor, and any client that supports dynamic client registration). The user signs in with their Croma Legal account and the tools run against their organization. Every member of the organization can connect this way; no API key needed. * **API key**, for your own code (AI SDK, scripts, agents). Send the same key as the REST API as a bearer token; the tools resolve straight to the organization that owns it. Usage and [rate limits](/legal/rate-limits) are shared with the REST API. ## Connect Claude or ChatGPT The dashboard's **Desarrolladores → Conexión MCP** tab walks through the same steps with copy buttons. In short: 1. Click [Add Croma Legal to Claude](https://claude.ai/new?modal=add-custom-connector\&connectorName=Croma%20Legal\&connectorUrl=https%3A%2F%2Fapi.legal.usecroma.com%2Fmcp#settings/customize-connectors): Claude opens **Add custom connector** with the name `Croma Legal` and the server URL `https://api.legal.usecroma.com/mcp` already filled in. (By hand: open **Settings → Connectors**, click **+ Add custom connector** and paste them.) 2. Check the values and click **Add**. 3. Click **Connect** on the new connector and sign in with your Croma Legal account. The tools appear in every new chat. 1. In ChatGPT, go to **Settings → Security** and turn on **Developer mode** (custom connections need a paid plan). 2. Open **Connectors**, click **+**, name it `Croma Legal` and paste `https://api.legal.usecroma.com/mcp`. 3. Sign in with your Croma Legal account when prompted, then enable Croma Legal from the **+** menu in a chat. The account you sign in with must belong to a Croma Legal organization. If it doesn't, the connection succeeds but every tool answers that the account has no organization; ask an administrator to add you and reconnect. ## Use it from the AI SDK The [AI SDK](https://ai-sdk.dev) can load the tools directly and hand them to a model. Pass your key in the `Authorization` header of the transport: ```ts theme={"dark"} import { experimental_createMCPClient as createMCPClient, generateText } from "ai"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { anthropic } from "@ai-sdk/anthropic"; const mcp = await createMCPClient({ transport: new StreamableHTTPClientTransport( new URL("https://api.legal.usecroma.com/mcp"), { requestInit: { headers: { Authorization: `Bearer ${process.env.CROMA_LEGAL_API_KEY}` }, }, }, ), }); // The portfolio, exposed as tools the model can call. const tools = await mcp.tools(); const { text } = await generateText({ model: anthropic("claude-opus-4-8"), tools, // Consult the AI SDK docs for the multi-step setting in your version // (`stopWhen` / `maxSteps`) so the model can call tools and then answer. prompt: "¿Cuántos procesos llevan más de 90 días sin actuaciones? Lista los diez más antiguos.", }); await mcp.close(); console.log(text); ``` Treat the key as a secret: load it from an environment variable or secrets manager, never commit it, and close the client (`mcp.close()`) when you are done so the connection is released. Because the endpoint speaks standard MCP over Streamable HTTP, the official [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk), LangChain, and other MCP-aware frameworks connect the same way: point them at the URL and set the `Authorization: Bearer` header. ## Tools Thirteen tools cover the same data as the REST API, plus helpers that only make sense for an agent. Tool results are JSON; empty results come back as a short Spanish sentence, since the people reading them are Spanish speakers. | Tool | What it does | REST equivalent | | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | | `list_processes` | Search and list cases by radicado, defendant, office, city, status, priority, filing-date range and whether they have actuaciones. | [`GET /v1/processes`](/legal/api-reference/list-processes) | | `get_process` | One case fully enriched, with its actuaciones timeline and the defendant's imported data. | [`GET /v1/processes/{id}`](/legal/api-reference/get-process) | | `get_process_actions` | A case's actuaciones, newest first, paginated. | [`GET /v1/processes/{id}/actions`](/legal/api-reference/list-process-actions) | | `list_actions` | The organization-wide feed of recent actuaciones, filterable by radicado, keyword, defendant, office and `since`. | [`GET /v1/actions`](/legal/api-reference/list-actions) | | `list_stale_processes` | Cases with **no** actuaciones in the last N days, most stale first. For impulso procesal reviews. | none | | `list_defendants` | Defendants with case counts and imported data, searchable by identification number or name. | [`GET /v1/defendants`](/legal/api-reference/list-defendants) | | `get_defendant_processes` | Every case linked to one defendant. | [`GET /v1/defendants/{id}/processes`](/legal/api-reference/list-defendant-processes) | | `get_analytics` | KPIs and distributions by office, city, status, priority, assignee and time. | [`GET /v1/analytics`](/legal/api-reference/get-analytics) | | `lookup_values` | Resolves a human-provided name into the exact stored value for `office`, `city`, `metadata`, `assignee` or `defendant`. Agents call it before filtering. | none | | `export_data` | Generates a CSV or JSONL file with the complete filtered dataset. Waits inline up to 40 seconds, otherwise returns a `job_id`. | [`POST /v1/exports`](/legal/api-reference/create-export) | | `get_export` | Checks an export started with `export_data` and returns the download URL when ready. | [`GET /jobs/{id}`](/legal/api-reference/get-job) | | `describe_data` | Lists the views, columns, your organization's own metadata fields and the rules for `query_data`. | none | | `query_data` | Runs one read-only PostgreSQL `SELECT` over the `processes`, `actions`, `defendants` and `requests` views of your organization. For aggregations, joins and ad-hoc questions the other tools don't cover. | none | Call `mcp.tools()` to get the full input schema of each tool. ### Notes on `query_data` * The views are already filtered to your organization; there is no organization column to filter on. * One statement per call, `SELECT` (or `WITH … SELECT`) only. Results are capped at 500 rows (200 by default); when `truncated` is `true`, use `export_data` for the complete set. * Unfiltered queries over the full actuaciones history can exceed the statement timeout; bound them by date, office or defendant. * Measure procedural activity with the judicial dates (`registration_date`, `last_action_date`), never with `action_created_at` or `last_discovery_date`. `describe_data` spells out each column's meaning. ### Discovery The server publishes its card at `https://api.legal.usecroma.com/.well-known/mcp/server-card.json` (name, description and the current tool list) and the OAuth metadata at `/.well-known/oauth-authorization-server` and `/.well-known/oauth-protected-resource/mcp`, so clients that support auto-discovery need nothing beyond the URL. The same data over plain HTTP, with a playground. # Pagination & filters Source: https://docs.usecroma.com/legal/pagination How Croma Legal lists paginate with cursors and pages, what each filter matches, which date field means what and how to sync your data incrementally. ## Two pagination styles **Cursor pagination** is used by the large lists: [`GET /v1/processes`](/legal/api-reference/list-processes), [`GET /v1/actions`](/legal/api-reference/list-actions) and [`GET /v1/defendants`](/legal/api-reference/list-defendants). | Param / field | Meaning | | ------------------------ | ---------------------------------------------------------------- | | `page_size` (request) | Rows per page. Default `25`, max `100`. | | `cursor` (request) | The `next_cursor` of the previous page. Omit for the first page. | | `next_cursor` (response) | Opaque string for the next page; `null` on the last page. | | `has_more` (response) | `true` while there are more rows. | Cursors are opaque: pass them back unchanged and don't build them yourself. They are meant to be used within one pass over the list; to start over, drop the cursor and request the first page again. ```ts theme={"dark"} async function* processes(params: Record) { let cursor: string | null = null; do { const url = new URL("https://api.legal.usecroma.com/v1/processes"); for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v); url.searchParams.set("page_size", "100"); if (cursor) url.searchParams.set("cursor", cursor); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.CROMA_LEGAL_API_KEY}` }, }); const body = await res.json(); yield* body.data; cursor = body.has_more ? body.next_cursor : null; } while (cursor); } ``` **Page-number pagination** is used by a single case's timeline, [`GET /v1/processes/{process_id}/actions`](/legal/api-reference/list-process-actions): `page` (from `1`) and `page_size` (default `25`, max `100`), with the `total` count in the response. Paging through a whole portfolio to build a file is the slow way. For the complete dataset, use [Exports](/legal/exports): one request, one CSV or JSONL download, up to 100,000 rows. ## Addressing a case Wherever a process appears in a path, both forms work and resolve to the same case: * the internal `id` (a UUID) returned by the list endpoints, or * the registration number (radicado), e.g. `11001400300120240012300`. Defendants are addressed by their internal `id` from [`GET /v1/defendants`](/legal/api-reference/list-defendants) (also exposed as `defendant_uuid` on a process's detail). The `defendant_id` field on processes and actuaciones is the identification number (cédula or NIT), not that UUID. ## How filters match * **Text filters** (`q`, `defendant`, `defendant_id`, `office`, `name`, `content`) are partial and case-insensitive: `office=civil municipal` matches `JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ`. * **Enums** (`status`, `priority`, `since_mode`, `granularity`) must match exactly; an unknown value returns `400 invalid_param`. * **Booleans** (`has_actions`) take `true` or `false`. * **Dates** are ISO 8601 (`2026-08-01` or `2026-08-01T00:00:00Z`). An unparseable date is ignored rather than rejected, so double-check the format if a date filter seems to have no effect. * Filters **combine with AND**. A list with no matches is a `200` with an empty `data`, never a `404`. `q` always matches the **registration number** (radicado): use it on processes and on the actuaciones feed. On defendants, `q` matches the identification number and `name` matches the name. ## Which date is which The portfolio carries several dates; picking the right one matters for reporting and for syncing. | Field | On | Meaning | | --------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------- | | `registration_date` | process | Filing date (fecha de radicación). `date_from` / `date_to` filter on it. | | `last_discovery_date` | process | Last time Croma reviewed the case. It updates even when nothing changed, so it does **not** indicate judicial activity. | | `tracking_since` | process detail | When the case entered your organization's portfolio. | | `registration_date` | actuación | The actuación's judicial date. The date that measures procedural activity; may be `null` for some actuaciones. | | `action_created_at` | actuación | When Croma recorded the actuación. The date to use for "what is new since my last sync". | On the actuaciones feed, `since_mode` picks which of the two actuación dates `since` / `until` and the ordering use: * `discovered` (default): `action_created_at`. * `judicial`: `registration_date`. ## Default ordering | Endpoint | Order | | ----------------------------------- | ------------------------------------------------------------------------------------------------------ | | `GET /v1/processes` | Most recently reviewed first (`last_discovery_date` desc). | | `GET /v1/processes/{id}/actions` | Newest first by judicial date. | | `GET /v1/actions` | Most relevant first: a relevance score over the actuación text, then date (per `since_mode`), then id. | | `GET /v1/defendants` | Newest defendant record first. | | `GET /v1/defendants/{id}/processes` | Most recently active case first (latest actuación date). | ## Recipe: incremental sync of actuaciones To mirror the portfolio's activity into your own system, pull the feed by discovery time and keep a watermark: Capture `now` before the first request. This will be the next run's `since`, so anything recorded while you page is picked up next time. ```bash theme={"dark"} curl "https://api.legal.usecroma.com/v1/actions?since=2026-08-20T06:00:00Z&since_mode=discovered&page_size=100" \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" ``` Follow `next_cursor` until `has_more` is `false`. Each row carries `process_id` and `registration_number`, so you can attach it to the case you already hold, or fetch the case with [`GET /v1/processes/{process_id}`](/legal/api-reference/get-process) if it is new to you. Store the `now` you captured as the next `since`. Because `since` is inclusive, re-running with the same watermark is safe: you may see the boundary rows again, and their `id` lets you de-duplicate. Use `since_mode=judicial` instead when the question is "which actuaciones happened in court during a period", for example a weekly report of filings dated within that week. How quotas are bucketed and reported on every response. # Quickstart Source: https://docs.usecroma.com/legal/quickstart Create a Croma Legal API key in the dashboard, authenticate with the bearer scheme and list your organization's court cases: three steps with examples. Keys are created in the Croma Legal dashboard at [legal.usecroma.com](https://legal.usecroma.com): open **Desarrolladores** and then **Claves de API**. Keys belong to your **organization**, look like `croma_live_…`, and are shown once at creation, so copy the key before leaving the page. Key management is enabled per user by Croma. If you don't see the **Claves de API** tab, ask your Croma contact to enable it for your account. See [Authentication](/legal/authentication) for details. Every endpoint lives under `https://api.legal.usecroma.com/v1` and takes the key in an `Authorization: Bearer` header. Filters are query parameters. ```bash cURL theme={"dark"} curl "https://api.legal.usecroma.com/v1/processes?status=TRACKING&page_size=5" \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" ``` ```ts TypeScript theme={"dark"} const url = new URL("https://api.legal.usecroma.com/v1/processes"); url.searchParams.set("status", "TRACKING"); url.searchParams.set("page_size", "5"); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.CROMA_LEGAL_API_KEY}` }, }); const { data, next_cursor, has_more } = await res.json(); ``` ```python Python theme={"dark"} import os, requests res = requests.get( "https://api.legal.usecroma.com/v1/processes", headers={"Authorization": f"Bearer {os.environ['CROMA_LEGAL_API_KEY']}"}, params={"status": "TRACKING", "page_size": 5}, ) body = res.json() ``` List endpoints return the rows under `data` plus a cursor for the next page: ```json theme={"dark"} { "data": [ { "id": "3f1c2a44-9b1e-4c5a-8d2f-6a7b8c9d0e1f", "registration_number": "11001400300120240012300", "plaintiff_name": "BANCO EJEMPLO S.A.", "defendant_name": "CLIENTE DE EJEMPLO", "office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ", "status": "TRACKING", "registration_date": "2024-03-12T00:00:00.000Z", "last_discovery_date": "2026-08-20T09:14:33.000Z", "defendant_id": "1234567890" } ], "next_cursor": "5", "has_more": true } ``` Pass `next_cursor` back as `cursor` to get the following page (see [Pagination & filters](/legal/pagination)). Rate-limit state and a request id come back as response headers: ``` X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 999 X-RateLimit-Reset: 2026-08-22T09:14:33.000Z X-Request-Id: req_8f3c… ``` ## Go further A few calls you will reach for next. Each accepts the radicado or the internal `id` wherever a process is addressed. ```bash theme={"dark"} # One case, fully enriched, by radicado curl "https://api.legal.usecroma.com/v1/processes/11001400300120240012300" \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" # Everything recorded since your last sync, across all cases curl "https://api.legal.usecroma.com/v1/actions?since=2026-08-20T00:00:00Z&since_mode=discovered" \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" # Portfolio KPIs, grouped by month curl "https://api.legal.usecroma.com/v1/analytics?granularity=month&days=365" \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" # The full portfolio as a CSV download curl -X POST "https://api.legal.usecroma.com/v1/exports" \ -H "Authorization: Bearer $CROMA_LEGAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "entity": "processes", "format": "csv" }' ``` ## Next steps Cursors, page sizes, date semantics and how to build an incremental sync. Every endpoint with its parameters, response fields and a playground. Pull the complete dataset as CSV or JSONL instead of paging. Point Claude, ChatGPT or your own agent at the same data. # Rate limits Source: https://docs.usecroma.com/legal/rate-limits How Croma Legal API quotas work: per-organization buckets shared by every key and MCP call, the headers that report your usage and how 429 responses behave. ## Per-organization buckets Rate limits are enforced **per organization**, not per key. Every key issued to the same organization shares one bucket, and calls made through the [MCP server](/legal/mcp-server) draw from that same bucket, so adding keys or clients doesn't multiply your quota. | Bucket | Limit | Endpoints | | ----------- | --------------------- | ----------------------------------------------------------------------------------------------------- | | Default | 1,000 requests / 24 h | Every `/v1/*` endpoint and every MCP tool call. | | Job polling | 600 / minute | [`GET /jobs/:id`](/legal/exports). Its own bucket, so polling an export never spends your data quota. | The window is sliding: a request made 24 hours ago frees its slot. ## Quota in response headers Rate-limit state comes back as HTTP headers on every response (not in the body): | Header | Meaning | | ----------------------- | ------------------------------------------------------------------- | | `X-RateLimit-Limit` | Requests allowed in the current window. | | `X-RateLimit-Remaining` | Requests left before you're throttled. | | `X-RateLimit-Reset` | ISO timestamp when the window resets. | | `X-Request-Id` | Unique id for the request (`req_…`); include it in support reports. | ## When you exceed the limit Over-quota requests return `429` with a `rate_limit_error` envelope and a `Retry-After` header (seconds): ```json theme={"dark"} { "error": { "type": "rate_limit_error", "code": "rate_limited", "message": "Rate limit exceeded. Try again in 42 seconds." } } ``` ``` Retry-After: 42 X-RateLimit-Remaining: 0 X-RateLimit-Reset: 2026-08-22T09:14:33.000Z ``` Back off until `Retry-After` elapses (or `X-RateLimit-Reset`), then retry. Over MCP, the tool call returns an error message instead of a result. The limiter **fails open**: if the rate-limit backend is briefly unavailable, requests are allowed through and no `X-RateLimit-*` headers are emitted. Don't depend on the headers always being present. ## Staying well under the limit * Use `page_size=100` when paging; fewer, larger pages cost fewer requests. * For a complete copy of the data, one [export](/legal/exports) replaces hundreds of list calls. * For aggregates, call [`GET /v1/analytics`](/legal/api-reference/get-analytics) once rather than paging rows to count them. * Sync incrementally with `since` on the actuaciones feed (see [Pagination & filters](/legal/pagination)) instead of re-reading the portfolio. The error envelope and every error code. # ADRES Health Affiliation Status Source: https://docs.usecroma.com/api-reference/colombia/adres-health-affiliation-status /api-reference/openapi.json post /co/adres/affiliation-status/v1 Look up a person's affiliation to the Colombian health system (BDUA): the entities (EPS) they are or were affiliated to, the régimen (contributivo/subsidiado), affiliation dates, and affiliate type. `document_type` defaults to `CC`. Returns `found: false` when the document is not registered in BDUA. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # ANCP-CCE Concepto Source: https://docs.usecroma.com/api-reference/colombia/ancp-cce-concepto /api-reference/openapi.json post /co/ancp-cce/concepto/v1 Retrieve one ANCP-CCE concepto by id or slug (e.g. `c-1094-de-2026`): full doctrinal text, dates, subjects and subtopics. `found: false` when nothing matches. # ANCP-CCE Conceptos Search Source: https://docs.usecroma.com/api-reference/colombia/ancp-cce-conceptos-search /api-reference/openapi.json post /co/ancp-cce/conceptos-search/v1 Search conceptos (public-procurement legal opinions) from the Relatoría de la ANCP-CCE (Colombia Compra Eficiente) by free text, tema (descriptor), and modification date. Paginated, newest-modified first. Drill into one with `ancp-cce-concepto` for the full text. # CNDJ Ruling Source: https://docs.usecroma.com/api-reference/colombia/cndj-ruling /api-reference/openapi.json post /co/cndj/ruling/v1 Retrieve one CNDJ disciplinary ruling by its `registration_number` + `ficha_number` key: the editorial fields (titulación, descriptores, fuentes normativas, salvamentos) plus the ruling document and its extracted full text when it carries a text layer. `found: false` when no document is stored for that key. # CNDJ Rulings Search Source: https://docs.usecroma.com/api-reference/colombia/cndj-rulings-search /api-reference/openapi.json post /co/cndj/rulings-search/v1 Search disciplinary rulings from the Relatoría de la Comisión Nacional de Disciplina Judicial (CNDJ) by free text or the advanced filters (reporting magistrate, topic, respondent, matter, subtopic, filing year). Returns the matching summaries with their `numero_unico` + `numero_ficha` key; read one in full with `cndj-ruling`. # Consejo de Estado Jurisprudence Search Source: https://docs.usecroma.com/api-reference/colombia/consejo-de-estado-jurisprudence-search /api-reference/openapi.json post /co/consejo-estado/search/v1 Search the Relatoría del Consejo de Estado's traditional jurisprudence corpus (broadly providencias before December 2021) by section, type, date window, radicado, ponente, party or challenged rule. Each row carries the providencia's metadata plus a `url` permalink to feed to `consejo-estado-providencia`. For December 2021 onward use the SAMAI endpoints. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Consejo de Estado Providencia Source: https://docs.usecroma.com/api-reference/colombia/consejo-de-estado-providencia /api-reference/openapi.json post /co/consejo-estado/providencia/v1 Retrieve the full text of one providencia from the Relatoría del Consejo de Estado, by the `url` permalink a search row exposes. `found: false` when the permalink resolves to no document. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Contaduría State Delinquent Debtor Records Source: https://docs.usecroma.com/api-reference/colombia/contaduría-state-delinquent-debtor-records /api-reference/openapi.json post /co/contaduria/state-delinquent-debtors/v1 Check whether a person or entity is a delinquent debtor to the Colombian State, from the Contaduría General de la Nación's register (Boletín de Deudores Morosos del Estado). Returns two verdicts: delinquent debt owed to the State (Ley 901 de 2004) and default on a payment agreement (Ley 1066 de 2006). `document_type` defaults to `CC`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Contraloría Fiscal Records Source: https://docs.usecroma.com/api-reference/colombia/contraloría-fiscal-records /api-reference/openapi.json post /co/contraloria/fiscal-records/v1 Check whether a person is reported as a responsable fiscal in the Contraloría's SIBOR boletín (certificado de antecedentes de responsabilidad fiscal). `document_type` defaults to `CC`. Returns the verdict plus a verification code. # DIAN Doctrina Document Source: https://docs.usecroma.com/api-reference/colombia/dian-doctrina-document /api-reference/openapi.json post /co/dian/doctrina/v1 Retrieve the text of one DIAN doctrine document by the `document_id` returned by `dian-doctrina-search`: the official title and the body of the oficio, concepto or norm. Compiled norms run to millions of characters, so the body is returned in character ranges: `content.total_length` is the full size, and when `content.has_more` is true request the next range with `offset: content.next_offset`. `found: false` when no document carries that id. # DIAN Doctrina Search Source: https://docs.usecroma.com/api-reference/colombia/dian-doctrina-search /api-reference/openapi.json post /co/dian/doctrina-search/v1 Full-text search over DIAN's published tax doctrine and related legal compilation: oficios, conceptos, decretos, resoluciones, leyes and high-court rulings. Each hit carries the `document_id` used by `dian-doctrina-document`, plus the title, issuing body, epigraph and a matching excerpt. Optional filters: `document_type` (e.g. `Oficios`, `Conceptos`) and `year`. Paginated with `page` and `per_page`; `capped: true` means the source returned more matches than are retrievable, so narrow the query. # DIAN Electronic Document Source: https://docs.usecroma.com/api-reference/colombia/dian-electronic-document /api-reference/openapi.json post /co/dian/electronic-document/v1 Validate a Colombian electronic document (factura electrónica, nota crédito/débito) by its CUFE/UUID and the emisor or receptor NIT. Returns the issuer, recipient, totals and taxes, current legitimate holder, validations, and events. Set `include_pdf: true` to also receive `pdf_url`, the URL of the official PDF representation. `found: false` means the document is not registered under that CUFE, or the NIT matches neither the emisor nor the receptor. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Policía Criminal Records Source: https://docs.usecroma.com/api-reference/colombia/policía-criminal-records /api-reference/openapi.json post /co/policia/criminal-records/v1 Check a person's Colombian criminal record (antecedentes). `document_type` defaults to `CC`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Procuraduría Disciplinary Records Source: https://docs.usecroma.com/api-reference/colombia/procuraduría-disciplinary-records /api-reference/openapi.json post /co/procuraduria/disciplinary-records/v1 Check a person or entity's antecedentes with the Procuraduría General de la Nación (disciplinary, penal, contractual, fiscal, and pérdida de investidura records from SIRI). `document_type` defaults to `CC`. Returns the verdict, the registered name, and the antecedente sections reproduced from the certificate. # Rama Judicial Cases by Entity Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-entity /api-reference/openapi.json post /co/rama-judicial/cases-by-entity/v1 Search Colombian judicial cases by entity name. Optional filters narrow by entity type, court code, recent activity, and page. # Rama Judicial Cases by Radicado Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-radicado /api-reference/openapi.json post /co/rama-judicial/cases-by-radicado/v1 Resolve a Colombian judicial case by radicado and return case metadata plus the first 40 actuaciones (actions) available. # Rama Judicial Cases by Radicado (Batch) Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-radicado-batch /api-reference/openapi.json post /co/rama-judicial/cases-by-radicado/v1/batch Resolve up to 50 Colombian judicial cases by radicado in one request. Returns one result per radicado in input order, each with its own status, so a single bad radicado never fails the batch. Each item counts as one request against your quota. # Registraduría Vital Status Source: https://docs.usecroma.com/api-reference/colombia/registraduría-vital-status /api-reference/openapi.json post /co/registraduria/vital-status/v1 Check a Colombian cédula's vital status. Returns `found: false` if the cédula isn't in the registry; otherwise `status` is `ALIVE` or `DECEASED`. # RUES Entities by Name Source: https://docs.usecroma.com/api-reference/colombia/rues-entities-by-name /api-reference/openapi.json post /co/rues/entities-by-name/v1 Search Colombian businesses in RUES by name, paginated, each result enriched with its full registry record (DetalleRM). # RUES Entity by NIT Source: https://docs.usecroma.com/api-reference/colombia/rues-entity-by-nit /api-reference/openapi.json post /co/rues/entity-by-nit/v1 Resolve a Colombian business by NIT and return its full RUES record: registry detail, financial statements, renewal history, related parties and registry notices. # SAMAI Corporaciones Source: https://docs.usecroma.com/api-reference/colombia/samai-corporaciones /api-reference/openapi.json post /co/samai/corporaciones/v1 Every corporación (despacho) SAMAI exposes, with its code and name. A code scopes a process search. # SAMAI Processes Source: https://docs.usecroma.com/api-reference/colombia/samai-processes /api-reference/openapi.json post /co/samai/processes/v1 Search live contentious-administrative processes (Consejo de Estado plus every Tribunal and Juzgado Administrativo) by party, radicado, or class, scoped to a corporación. Returns one page of matches with the reporting magistrate, class, filing date, parties and the official detail link. A radicado search derives the corporación from the radicado when none is given. # SAMAI Secciones Source: https://docs.usecroma.com/api-reference/colombia/samai-secciones /api-reference/openapi.json post /co/samai/secciones/v1 The secciones (salas) inside one corporación, with their codes and names. # SECOP Contract by ID Source: https://docs.usecroma.com/api-reference/colombia/secop-contract-by-id /api-reference/openapi.json post /co/secop/contract/v1 Resolve one electronic contract (SECOP II) by its contract id and return the full contract record plus its satellite history: registered additions/modifications, insurance policies (garantías) with insurer and validity, and the delivery plan with planned vs actual progress. `found: false` when no contract matches the id. # SECOP Contracts by Provider Source: https://docs.usecroma.com/api-reference/colombia/secop-contracts-by-provider /api-reference/openapi.json post /co/secop/contracts-by-provider/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/contracts-search/v1` instead. List the public-procurement contracts (SECOP II) awarded to one provider by cédula or NIT, across all contracting entities: the contractor profile (who hired them, values, status, dates). Optional filters: contracting-entity NIT and a sign-date window (`from_date`/`to_date`). Pages of 500, newest first (`page`, 1-based); `capped: true` means the page is full and later pages may exist. # SECOP Process by Notice Source: https://docs.usecroma.com/api-reference/colombia/secop-process-by-notice /api-reference/openapi.json post /co/secop/process/v1 Resolve a Colombian public-procurement process (SECOP II) by its OpportunityDetail noticeUID and return the process header, the per-provider award list, and every awarded contract: providers, documents, values, dates, and execution amounts. Sourced from Colombia Compra Eficiente's open data. `found: false` when no process matches the noticeUID. # SECOP Processes by Entity Source: https://docs.usecroma.com/api-reference/colombia/secop-processes-by-entity /api-reference/openapi.json post /co/secop/processes-by-entity/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/processes-search/v1` instead. List the procurement processes (SECOP II) published by one contracting entity (by NIT), optionally within a publication-date window. The audit population for an entity. Returns lean summaries (drill into one with `secop-process`). Pages of 500, newest first (`page`, 1-based); `capped: true` means the page is full and later pages may exist. # SECOP Sanctions by Provider Source: https://docs.usecroma.com/api-reference/colombia/secop-sanctions-by-provider /api-reference/openapi.json post /co/secop/sanctions-by-provider/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/sanctions-search/v1` instead. List the fines and sanctions (multas y sanciones) recorded against one state contractor by cédula or NIT: sanctioning entity, resolution number, value, and the dates the sanction was published and became final. A direct adverse signal for counterparty screening, from Colombia Compra Eficiente's open data. # SICAAC Insolvency Cases Source: https://docs.usecroma.com/api-reference/colombia/sicaac-insolvency-cases /api-reference/openapi.json post /co/sicaac/insolvency-cases/v1 Look up Colombian natural-person insolvency cases by document number. `document_type` defaults to `CC` (Cédula de Ciudadanía). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Superfinanciera Complaints Source: https://docs.usecroma.com/api-reference/colombia/superfinanciera-complaints /api-reference/openapi.json post /co/superfinanciera/complaints/v1 Return the action history of a specific jurisdictional complaint filed against a person or entity at Colombia's Superfinanciera. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Supersociedades Financial Statements Source: https://docs.usecroma.com/api-reference/colombia/supersociedades-financial-statements /api-reference/openapi.json post /co/supersociedades/financial-statements/v1 Annual financial statements a Colombian company has filed with the Superintendencia de Sociedades, by NIT: income statement, balance sheet and cash flow per fiscal year, plus the company identity from the filing cover. One filing per year (the preferred entry point, latest re-submission), newest first, up to 10 years. Figures come as filed, in the unit the filing declares. # Caixa FGTS Regularity Certificate (CRF) Source: https://docs.usecroma.com/api-reference/brazil/caixa-fgts-regularity-certificate-crf /api-reference/openapi.json post /br/caixa/fgts-certificate/v1 Check whether a Brazilian employer is up to date with the FGTS, by CNPJ, from Caixa Econômica Federal: `regular` with the current Certificado de Regularidade do FGTS (number, validity, establishment address), or `irregular` with which body reports the impediment (PGFN or Caixa). Optionally the certificates issued in the last 24 months. `found: false` when the CNPJ is not registered as an employer. # CGU Sanction Source: https://docs.usecroma.com/api-reference/brazil/cgu-sanction /api-reference/openapi.json post /br/cgu/sanction/v1 Resolve one sanction on Brazil's federal integrity registers (CGU) by its id and return the full record: the party, its names and document (CPFs masked), the sanction, the sanctioning body, the dates, the legal basis, the process, and the fine, the expelled servant's post or the leniency agreement's terms where they apply. `found: false` when no register carries that id. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # CGU Sanctions Search Source: https://docs.usecroma.com/api-reference/brazil/cgu-sanctions-search /api-reference/openapi.json post /br/cgu/sanctions-search/v1 Search Brazil's federal integrity registers kept by the Controladoria-Geral da União (CEIS, CNEP, CEAF, CEPIM and the leniency agreements) by free text over every name the register gives the party, by CNPJ or CPF (exact; CPFs come back masked), register, party type and the sanctioning body's state. One row per sanction, by name, pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # DJEN Publications Search Source: https://docs.usecroma.com/api-reference/brazil/djen-publications-search /api-reference/openapi.json post /br/djen/publications-search/v1 Search Brazil's national court publications (Diário de Justiça Eletrônico Nacional, CNJ) by party name, lawyer name, OAB number, CNJ case number, court, free text and availability date: intimações, citações, editais and listas de distribuição from every state, federal, labour, electoral and military court and the superior courts, newest first, with the full text and the parties and lawyers each publication is addressed to. At least one of party, lawyer, OAB number, case number, court or text is required; `total` is exact for a single day and stops at 10,000 for a range. # IBAMA Environmental Embargo Source: https://docs.usecroma.com/api-reference/brazil/ibama-environmental-embargo /api-reference/openapi.json post /br/ibama/embargo/v1 One environmental embargo from IBAMA by the `id` the search returns: the party, the place and area, the infraction and whether it is active, lifted or cancelled. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # IBAMA Environmental Embargoes Search Source: https://docs.usecroma.com/api-reference/brazil/ibama-environmental-embargoes-search /api-reference/openapi.json post /br/ibama/embargoes-search/v1 Search every environmental embargo Brazil's federal environmental agency (IBAMA) has imposed since 1987, by CPF or CNPJ (or its 8-character root), name or property, state, municipality, term number or date. Each embargo carries its status (`active`, `lifted`, `cancelled`), the area in hectares, the place, the infraction and the process; the response counts how many matches are active. CPFs are matched exactly and returned masked. Updated daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # MTE Slave Labour Register Listing Source: https://docs.usecroma.com/api-reference/brazil/mte-slave-labour-register-listing /api-reference/openapi.json post /br/mte/employer/v1 One listing from Brazil's slave labour employer registers, by the `id` the search returns. `found: false` once the employer has left the register. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # MTE Slave Labour Register Search Source: https://docs.usecroma.com/api-reference/brazil/mte-slave-labour-register-search /api-reference/openapi.json post /br/mte/slave-labour-search/v1 Search Brazil's register of employers caught keeping workers in conditions analogous to slavery (Cadastro de Empregadores, the "Lista Suja"), and the register of employers under a conduct-adjustment agreement, by CNPJ (or its 8-character root), CPF, name, state or inspection year. Each listing carries the establishment, workers found, activity, the final decision date and every period on the register. CPFs are matched exactly and returned masked. Updated daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # PGFN Debtor Source: https://docs.usecroma.com/api-reference/brazil/pgfn-debtor /api-reference/openapi.json post /br/pgfn/debtor/v1 Total what one Brazilian company owes the Union in the dívida ativa (Procuradoria-Geral da Fazenda Nacional), by CNPJ or by its 8-character root for every establishment: the number of debts, the amount owed as principal debtor, the part in court, a breakdown by regime (federal taxes, social security, FGTS), and the 50 largest debts. `found: false` when PGFN has inscribed nothing. Served by Croma (`as_of` says how current the data is), refreshed with each quarterly release. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # PGFN Debts Search Source: https://docs.usecroma.com/api-reference/brazil/pgfn-debts-search /api-reference/openapi.json post /br/pgfn/debts-search/v1 Search the active debts Brazilian companies owe the Union in the dívida ativa (Procuradoria-Geral da Fazenda Nacional): federal taxes, social security contributions and the FGTS, by company name, CNPJ or its 8-character root, regime, state, status, the company's role in the debt, whether it is in court, and an amount range. Largest amount first, pages of up to 50. Companies only. Served by Croma (`as_of` says how current the data is), refreshed with each quarterly release. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # TST Labour-Debt Certificate (CNDT) Source: https://docs.usecroma.com/api-reference/brazil/tst-labour-debt-certificate-cndt /api-reference/openapi.json post /br/tst/labour-certificate/v1 Issue Brazil's labour-debt certificate (Certidão Negativa de Débitos Trabalhistas) for a company by CNPJ, live from the Tribunal Superior do Trabalho: `clear`, `debts`, or `debts_secured` (every debt secured or suspended, with the legal effect of a clearance), the certificate number, issue time and validity, and each labour case with its court and whether the debt is secured. Optionally the official PDF. Async job; most calls finish inline. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Colombia Law Detail Source: https://docs.usecroma.com/api-reference/colombia/colombia-law-detail /api-reference/openapi.json post /co/legalize/law/v1 Resolve a single Colombian law by its identifier and return the full record, sourced from Legalize: metadata plus the law text as Markdown (`content_md`). `found: false` when no law matches the identifier. # Colombia Laws Search Source: https://docs.usecroma.com/api-reference/colombia/colombia-laws-search /api-reference/openapi.json post /co/legalize/laws/v1 Search Colombian legislation as structured data, sourced from Legalize. Filter by free text, law type, publication year, status, and jurisdiction. Returns paginated law summaries; use `per_page` and `page` to page. Drill into one with `legalize-law-detail`. # RUNT Vehicle by Plate Source: https://docs.usecroma.com/api-reference/colombia/runt-vehicle-by-plate /api-reference/openapi.json post /co/runt/vehicle-by-plate/v1 Resolve a Colombian vehicle in RUNT (Registro Único Nacional de Tránsito) by plate and the registered owner's document. Returns the vehicle record (brand, line, model year, class, body, color, engine displacement, fuel, weights, VIN, engine/chassis/serial numbers, traffic authority, registration dates, lien/pledge flags) plus SOAT insurance history, técnico-mecánica (RTM) inspection history, extended technical data, registered guarantees/liens (with the creditor, e.g. a financing bank), ownership limitations, armoring (blindaje) status, civil-liability policies, DIJIN and scrapping certificates, normalization records, and scrapping status. `document_type` defaults to `CC`. `found: false` when the plate and owner document have no active match. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # RUNT Vehicle History by Plate Source: https://docs.usecroma.com/api-reference/colombia/runt-vehicle-history-by-plate /api-reference/openapi.json post /co/runt/vehicle-history-by-plate/v1 Look up a Colombian vehicle's history in RUNT (Registro Único Nacional de Tránsito) by plate alone, without the owner's document. Returns the registered owner(s) (name and identification number), the vehicle characteristics (brand, line, model year, class, body, color, VIN, engine/chassis/serial numbers), the traffic-license and import records, SOAT and técnico-mecánica (RTM) history, any accident on record, recent and pending procedures (trámites), and guarantee/lien and ownership-limitation summaries. `found: false` when the plate has no record. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SIATA Aburrá Valley Conditions Source: https://docs.usecroma.com/api-reference/colombia/siata-aburrá-valley-conditions /api-reference/openapi.json post /co/siata/v1 Deprecated since 2026-08-27; stops answering on 2026-12-01. Use `POST /co/siata-geoportal/weather/v1` instead. Live environmental conditions for the Aburrá Valley (Medellín metropolitan area) from SIATA: per-station weather (temperature, humidity, wind, pressure), rainfall (accumulated + intensity), and air quality (24h PM2.5 + ICA index). All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) to get only nearby stations, nearest first with `distance_km` populated. Coverage is the Medellín metro area only. # SIATA Air Quality Source: https://docs.usecroma.com/api-reference/colombia/siata-air-quality /api-reference/openapi.json post /co/siata-geoportal/air-quality/v1 Current air quality at SIATA's reference stations in the Aburrá Valley (Medellín metropolitan area): 24-hour PM2.5 and PM10, 8-hour ozone and CO, 1-hour NO2 and SO2, each as a concentration with Colombia's numeric air-quality index (ICA) and its category, plus the pollutant driving each station's index. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Alerts Source: https://docs.usecroma.com/api-reference/colombia/siata-alerts /api-reference/openapi.json post /co/siata-geoportal/alerts/v1 Official notices from SIATA, the early-warning system of the Aburrá Valley (Medellín metropolitan area): title, plain-text description, validity dates and audience. Returns the active notices; pass `include_past: true` for every notice on record, most recent first. # SIATA Cameras Source: https://docs.usecroma.com/api-reference/colombia/siata-cameras /api-reference/openapi.json post /co/siata-geoportal/cameras/v1 SIATA's camera network in the Aburrá Valley (Medellín metropolitan area), about 90 cameras pointed at river gauges, the sky, underpasses and the boundary layer, each with the URL of its latest snapshot. All inputs optional: pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby cameras nearest first, or `type` (`nivel`, `cielo`, `deprimido`, `capa_limite`) to keep one kind. # SIATA Citizen Air Sensors Source: https://docs.usecroma.com/api-reference/colombia/siata-citizen-air-sensors /api-reference/openapi.json post /co/siata-geoportal/citizen-sensors/v1 The citizen-science PM2.5 sensor network of the Aburrá Valley (Medellín metropolitan area), about 230 low-cost sensors: PM2.5 over the last hour, the daily air-quality index (ICA) with its category, whether each sensor is reporting, and its data recovery over 24 hours and 15 days. All inputs optional: an empty body returns every sensor; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby sensors nearest first, or `municipality` / `station_code` to narrow. Indicative data; use the air-quality endpoint for the reference network. # SIATA Rainfall Source: https://docs.usecroma.com/api-reference/colombia/siata-rainfall /api-reference/openapi.json post /co/siata-geoportal/rainfall/v1 Rain at every SIATA gauge in the Aburrá Valley (Medellín metropolitan area): whether it is raining now and the source's extreme-rain flag, rain accumulated over seven trailing windows (5 minutes to 30 days), and monthly totals for the current year with each month's data availability. All inputs optional: an empty body returns every gauge; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby gauges nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA River Levels Source: https://docs.usecroma.com/api-reference/colombia/siata-river-levels /api-reference/openapi.json post /co/siata-geoportal/river-levels/v1 Current river, stream and storm-sewer water levels for the Aburrá Valley (Medellín metropolitan area) from SIATA: per-station level in metres against the station's flood thresholds (with a derived status), the highest and mean level over the last three hours, the source's alert colour and level, six trailing windows, basin morphology and land cover. `include_series` adds a per-minute 3-hour series. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Seismic Events Source: https://docs.usecroma.com/api-reference/colombia/siata-seismic-events /api-reference/openapi.json post /co/siata-geoportal/seismic-events/v1 The last earthquakes recorded by SIATA's accelerograph and seismograph network in the Aburrá Valley (Medellín metropolitan area): per station, the most recent events with magnitude, epicentre, depth and what the station measured (peak ground acceleration and Mercalli intensity on accelerographs, peak ground velocity on seismographs). All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. # SIATA Weather Source: https://docs.usecroma.com/api-reference/colombia/siata-weather /api-reference/openapi.json post /co/siata-geoportal/weather/v1 Current weather at every SIATA station in the Aburrá Valley (Medellín metropolitan area): temperature, humidity, wind, pressure, an hourly 12-hour series per station, and the valley's UV index with today's hourly series. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Weather Forecast Source: https://docs.usecroma.com/api-reference/colombia/siata-weather-forecast /api-reference/openapi.json post /co/siata-geoportal/forecast/v1 SIATA's two-day weather forecast for the Aburrá Valley (Medellín metropolitan area), per municipality and, for Medellín, per zone: daily maximum and minimum temperature and the likelihood of rain for each part of the day (early morning, morning, afternoon, night). Pass `municipality` to get one municipality; an empty body returns every zone. Issued once a day. # SIATA Weather Station Series Source: https://docs.usecroma.com/api-reference/colombia/siata-weather-station-series /api-reference/openapi.json post /co/siata-geoportal/weather-series/v1 Minute-by-minute weather at one SIATA station in the Aburrá Valley (Medellín metropolitan area): temperature, humidity, wind speed and pressure over the last hour at one-minute resolution (`window: "1h"`, the default) or the last six hours at five-minute resolution (`window: "6h"`), with the source's means and temperature percentiles. `station_code` is required; codes come from the weather endpoint. Returns `found: false` for an unknown station. # SIMIT Account Status Source: https://docs.usecroma.com/api-reference/colombia/simit-account-status /api-reference/openapi.json post /co/simit/account-status/v1 Look up a SIMIT (Sistema Integrado de Información sobre Multas y Sanciones por Infracciones de Tránsito) account status by vehicle plate or by a person's identification number. Returns outstanding comparendos and multas (each with the offending party, infraction codes and descriptions, traffic authority, department, amounts, and the discount/payment projections), the account totals, any payment agreements (acuerdos de pago), and driving courses (cursos viales). `is_plate` reports whether the value was matched as a plate. `clear: true` means paz y salvo (nothing outstanding). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Extract JSON Source: https://docs.usecroma.com/api-reference/global/extract-json /api-reference/openapi.json post /global/extract/json/v1 Pull structured data off any public web page. You supply a JSON Schema describing the object you want and the fields are located on the page and returned under `result`, already typed. # Extract Markdown Source: https://docs.usecroma.com/api-reference/global/extract-markdown /api-reference/openapi.json post /global/extract/markdown/v1 Turn any public web page into clean Markdown. `scope` keeps either the article body or the whole page, and `include_metadata` adds the page's title, author, published date and image. Handles pages that render themselves in the browser at `effort: max`. # Generate JSON Source: https://docs.usecroma.com/api-reference/global/generate-json /api-reference/openapi.json post /global/generate/json/v1 Read a public web page and return a new object built from it, following your `instructions` and your JSON Schema. Unlike `extract-json`, the fields need not appear on the page: summarize, classify, translate or reshape what is there. # Research Source: https://docs.usecroma.com/api-reference/global/research /api-reference/openapi.json post /global/research/v1 Answer an open question from live sources. Returns a written report in Markdown with numbered citations plus the list of sources behind it. Typically takes a few seconds; it is a research pass, not a lookup, so verify anything you act on against the primary source. # Web Search Source: https://docs.usecroma.com/api-reference/global/web-search /api-reference/openapi.json post /global/web-search/v1 AI-powered web search. Returns structured results with URLs, titles, authors, dates, highlights, and relevance scores. # Get Job Status Source: https://docs.usecroma.com/api-reference/jobs/get-job-status /api-reference/openapi.json get /jobs/{id} Poll the status and result of an async job created by an async-capable endpoint. Returns the job envelope; `data` is populated once `status` is `completed`, `error` once it is `failed`. Jobs are org-scoped — another org's job reads as 404. # Banxico Circular Source: https://docs.usecroma.com/api-reference/mexico/banxico-circular /api-reference/openapi.json post /mx/banxico/circular/v1 One Banco de México circular in full, by its `number`: subject, obligated entities, the consolidated (compiled) text PDF, the original text PDF with its DOF date, and every modification with dates and PDFs. Amendment circulars have no page of their own: looking one up returns the amended base circular (its `number` says which), whose modifications list carries the requested número. # Banxico Circulars Source: https://docs.usecroma.com/api-reference/mexico/banxico-circulars /api-reference/openapi.json post /mx/banxico/circulars/v1 The chronological index of every circular and disposición issued by Banco de México (1,200+ entries back to 1969), each with subject, abrogation status, and which base circular it modifies. One row per index entry: a circular amending several bases appears once per base. Optional `year` filters one year. Paged, 100 per page; drill into one with `banxico-circular`. # CNBV Regulation History Source: https://docs.usecroma.com/api-reference/mexico/cnbv-regulation-history /api-reference/openapi.json post /mx/cnbv/regulation-history/v1 Every modifying resolución and annex for one CNBV norma (by `regulation_id` from `cnbv-regulations`), each with its DOF date and official PDF. The Circular Única de Bancos alone carries 180+ modifications. # CNBV Regulations Source: https://docs.usecroma.com/api-reference/mexico/cnbv-regulations /api-reference/openapi.json post /mx/cnbv/regulations/v1 The CNBV's current regulatory catalog (~113 normas: leyes, disposiciones de carácter general including the Circular Única de Bancos, circulares, acuerdos, reglas), each with type, DOF publication date, applicable sectors, and the official PDF. Optional `query` filters by name. Paged, 50 per page. Norms with a `regulation_id` have modification history via `cnbv-regulation-history`. # DOF Publication Source: https://docs.usecroma.com/api-reference/mexico/dof-publication /api-reference/openapi.json post /mx/dof/publication/v1 Retrieve one publication from Mexico's official federal gazette (DOF) by id, including its plain text when the publication is machine-readable. Publications range from a few hundred characters to entire decrees, so the text is returned in character ranges: `content.total_length` is the full size, and when `content.has_more` is true request the next range with `offset: content.next_offset`. Anything published before the 1973 volume is held only as a scan and returns `is_image_only: true` with `content: null`, its metadata, and `scan_url` for the official scanned page. This returns one gazette publication, not the consolidated text of a law; for that use `diputados-federal-law`. # DOF Publications by Date Source: https://docs.usecroma.com/api-reference/mexico/dof-publications-by-date /api-reference/openapi.json post /mx/dof/publications-by-date/v1 Everything published in Mexico's official federal gazette (Diario Oficial de la Federación) on a given date: decrees, law reforms, and regulator disposiciones across the morning, evening, and extraordinary editions, each with its issuing branch and agency. The gazette is organised by day, so a date is the only way in; it publishes the decree that created or amended a law, never the consolidated current text of one. For that, use `diputados-federal-law`. The index reaches back to 1917, while machine-readable text starts with the 1973 volume: `has_text: true` marks publications retrievable with `dof-publication`, and every entry carries `scan_url` for the official scanned page. # FGR Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fgr-bulletins /api-reference/openapi.json post /mx/fiscalias/fgr/bulletins/v1 Browse the public press bulletins (comunicados) of the federal prosecutor (FGR), most recent first; page forward with `page` until `has_more` is false. Each item carries its bulletin `code`, `scope` (national or state), date, and headline, and links to the full comunicado. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía CDMX Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-cdmx-bulletins /api-reference/openapi.json post /mx/fiscalias/cdmx/bulletins/v1 Browse the public press bulletins (comunicados) of the Mexico City prosecutor, most recent first, paged with `page` (10 per page). Each bulletin carries its comunicado `code`, date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Chiapas Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-chiapas-bulletins /api-reference/openapi.json post /mx/fiscalias/chiapas/bulletins/v1 Browse the public press bulletins (comunicados) of the Chiapas state prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin carries its comunicado number, classification, date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Chihuahua Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-chihuahua-bulletins /api-reference/openapi.json post /mx/fiscalias/chihuahua/bulletins/v1 Search the public press bulletins (comunicados) of the Chihuahua state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Optional `from_date`/`to_date` bound the range. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence); the `categories` name the acting unit. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Estado de México Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-estado-de-méxico-bulletins /api-reference/openapi.json post /mx/fiscalias/edomex/bulletins/v1 Browse the public press bulletins (comunicados) of the Estado de México prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin carries its comunicado `code`, date, headline, and a link to the full document. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Jalisco Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-jalisco-bulletins /api-reference/openapi.json post /mx/fiscalias/jalisco/bulletins/v1 Search the public press bulletins (comunicados) of the Jalisco state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence) and carries the issuing author and tags. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Nuevo León Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-nuevo-león-bulletins /api-reference/openapi.json post /mx/fiscalias/nuevoleon/bulletins/v1 Search the public press bulletins (comunicados) of the Nuevo León prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin carries its date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Puebla Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-puebla-bulletins /api-reference/openapi.json post /mx/fiscalias/puebla/bulletins/v1 Search the public press bulletins (comunicados) of the Puebla state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin carries its numbered boletín, date, and headline. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Veracruz Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-veracruz-bulletins /api-reference/openapi.json post /mx/fiscalias/veracruz/bulletins/v1 Search the public press bulletins (comunicados) of the Veracruz state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Optional `from_date`/`to_date` bound the range. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence). These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Zacatecas Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-zacatecas-bulletins /api-reference/openapi.json post /mx/fiscalias/zacatecas/bulletins/v1 Browse the public press bulletins (comunicados) of the Zacatecas state prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence) and carries the full text. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Mexican Federal Law Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-law /api-reference/openapi.json post /mx/diputados/federal-law/v1 One Mexican federal law in full by its `law_id`: current consolidated text (PDF/DOC), original DOF publication with its scan, and every reform decree that amended it, newest first, each with its DOF date, headline, documents, and any fe de erratas. # Mexican Federal Laws Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-laws /api-reference/openapi.json post /mx/diputados/federal-laws/v1 The Cámara de Diputados catalog of federal laws and codes (315+), each with its official name, abbreviation, original DOF publication date, most recent reform date, consolidated PDF/DOC text, and whether it is still in force. Optional `query` filters by name or abbreviation. Paged, 100 per page; drill into one with `diputados-federal-law`. # Mexican Federal Regulations Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-regulations /api-reference/openapi.json post /mx/diputados/federal-regulations/v1 The Cámara de Diputados catalog of federal reglamentos (135+), each with its DOF publication date, consolidated text, whether it is still in force, and an inline history of reforms, annual amount updates, erratas and vigencia notices. Optional `query` filters by name. Paged, 50 per page. # Mexican Law Reforms by Year Source: https://docs.usecroma.com/api-reference/mexico/mexican-law-reforms-by-year /api-reference/openapi.json post /mx/diputados/law-reforms/v1 Every reform decree published in the DOF in one year, from the Cámara de Diputados reform log: the decree prose, the canonical actions it takes (reforman, adicionan, derogan, abrogan, expiden...), and every law it touches. One entry per publication day; a single day can bundle several instruments. Defaults to the current year. Paged, 50 decrees per page. # SCJN Tesis Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis /api-reference/openapi.json post /mx/scjn/tesis/v1 Retrieve one tesis by its registro digital (`registration_number`), including the full text, citation (clave, época, localización), subjects, precedent notes, and linked ruling ids. # SCJN Tesis Browse Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis-browse /api-reference/openapi.json post /mx/scjn/tesis-browse/v1 Deprecated since 2026-09-07; stops answering on 2026-12-15. Use `POST /mx/scjn/tesis-search/v1` instead. Same request and response as `scjn-tesis-search`, which replaces it: the Mexican Supreme Court's case law in full, filtered by words in the title and text, binding force, subject, época, year, instance, court, formation, publication window and the court's modification date. Newest first, pages of up to 20 full records, with `as_of`. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SCJN Tesis Search Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis-search /api-reference/openapi.json post /mx/scjn/tesis-search/v1 Search the Mexican Supreme Court's case law: every tesis and jurisprudencia the Semanario Judicial de la Federación has published since 1911 (300k+), each in full. Match words in the title and text (`query`, optional; every word must appear) and filter by binding force (`tesis_type`: jurisprudencia vs aislada), subject (materia), época number, year, deciding level (`instance`), court or chamber, how the criterion was formed (`formation`), publication window (`published_from`/`published_to`) and the court's own modification date (`updated_after`). Newest first, pages of up to 50 full records; `as_of` says how current the data is. Read one by its registro digital with `scjn-tesis`. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SIEM Establishment Source: https://docs.usecroma.com/api-reference/mexico/siem-establishment /api-reference/openapi.json post /mx/siem/establishment/v1 Retrieve one SIEM establishment's declared profile: RFC, legal or personal name, commercial name, activity, address and contact, headcount, import/export flags, declared products and services, and registration status. Returns `found: false` when the id is unknown. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SIEM Establishments Search Source: https://docs.usecroma.com/api-reference/mexico/siem-establishments-search /api-reference/openapi.json post /mx/siem/establishments/v1 Search Mexican business establishments in the SIEM directory by commercial name or razón social. Optional filters narrow by state (INEGI code) and SCIAN activity. SIEM is a self-declared directory: registration is voluntary and each establishment chooses which fields stay public, so absence is not evidence of anything. Drill into a result with `siem-establishment`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # APESEG SOAT Certificate History Source: https://docs.usecroma.com/api-reference/peru/apeseg-soat-certificate-history /api-reference/openapi.json post /pe/apeseg/soat/v1 Look up a vehicle plate's SOAT (mandatory traffic-accident insurance) certificate history from APESEG (Asociación Peruana de Empresas de Seguros). `has_active_soat: true` means a currently valid (VIGENTE) certificate exists, returned as `active`; `certificates` lists the full history. `found: false` when the plate has no SOAT record. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Callao Traffic Tickets Source: https://docs.usecroma.com/api-reference/peru/callao-traffic-tickets /api-reference/openapi.json post /pe/callao/papeletas/v1 List the outstanding traffic tickets (papeletas) registered against a vehicle plate in the province of Callao, issued by the Municipalidad Provincial del Callao. `has_papeletas: false` means the plate has no outstanding tickets on record. When tickets exist, `papeletas` lists each one (code, ticket number, infraction date, amount, installment) and `total` is the sum of the outstanding amounts in PEN. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # OECE Process by OCID Source: https://docs.usecroma.com/api-reference/peru/oece-process-by-ocid /api-reference/openapi.json post /pe/oece/process/v1 Resolve one Peruvian public-procurement procedure (SEACE, published by OECE) by its OCDS id and return the full record: buyer, estimated value, items with their stage, bidding documents, awards with suppliers, and contracts. `found: false` when there is no procedure with that id. Served by Croma (`as_of` says how current the data is), covering procedures published from 2020. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # OECE Processes Search Source: https://docs.usecroma.com/api-reference/peru/oece-processes-search /api-reference/openapi.json post /pe/oece/processes-search/v1 Search Peru's public-procurement procedures (SEACE, published by OECE) by free text over title and description, buyer RUC, awarded supplier RUC, department, category (goods/services/works), procedure type, publication-date window and last-modified date. Newest first, pages of up to 50. Served by Croma (`as_of` says how current the data is), covering procedures published from 2020. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # RREE Foreigner Cards Source: https://docs.usecroma.com/api-reference/peru/rree-foreigner-cards /api-reference/openapi.json post /pe/rree/foreigner-cards/v1 Verify a Peruvian foreigner identity card (carné de extranjería) by its 8-digit card number: names, nationality, immigration status, and expiration. `found: false` when no card matches. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAT Lima Account Status Source: https://docs.usecroma.com/api-reference/peru/sat-lima-account-status /api-reference/openapi.json post /pe/sat-lima/account-status/v1 Look up outstanding debt owed to the SAT de Lima (Servicio de Administración Tributaria de Lima) for a person, company, or vehicle. Pass `document_type` (`dni`, `ruc`, `placa`, `papeleta`, `cod_administrado`, or `compromiso`; defaults to `dni`) plus `document_number`. Returns each outstanding item (taxes such as impuesto vehicular / predial / arbitrios, traffic tickets, administrative fines, and payment commitments) with its group, reference, amount, status, and relevant dates, plus the account total. `clear: true` means nothing is outstanding. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAT Lima Vehicle Capture Orders Source: https://docs.usecroma.com/api-reference/peru/sat-lima-vehicle-capture-orders /api-reference/openapi.json post /pe/sat-lima/capturas/v1 Check whether a vehicle plate has an outstanding capture order (orden de captura) in the province of Lima, issued by the SAT de Lima (Servicio de Administración Tributaria de Lima) for unpaid tax debt or traffic tickets. `has_capture_order: false` means the plate has no capture order on record. When an order exists, `orders` lists each one with the fields the source reports. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SBS SOAT Report Source: https://docs.usecroma.com/api-reference/peru/sbs-soat-report /api-reference/openapi.json post /pe/sbs/soat/v1 Look up a vehicle plate's SOAT (mandatory traffic-accident insurance) report from SBS (Superintendencia de Banca, Seguros y AFP), Peru's banking and insurance regulator. Returns `accident_count` (accidents covered by SOAT in the last 5 years) and `policies`, the list of SOAT policies on record (issuing company, vehicle class/use, accidents per policy, policy/certificate number, coverage window, and status VIGENTE/VENCIDA/ANULADA). `has_active_soat: true` means a policy is currently in force, returned as `active`. `found: false` means no SOAT information is reported for the plate. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer by Document Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-by-document /api-reference/openapi.json post /pe/sunat/document/v1 Look up a Peruvian taxpayer's full record by identity document (DNI, carné de extranjería, passport, or diplomatic card). `found: false` when no taxpayer matches. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer by RUC Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-by-ruc /api-reference/openapi.json post /pe/sunat/ruc/v1 Look up a Peruvian taxpayer's full record by RUC (11 digits). `found: false` when the RUC is not registered. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer Search by Name Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-search-by-name /api-reference/openapi.json post /pe/sunat/name/v1 Search Peruvian taxpayers by name or razón social. Returns up to 30 matches (SUNAT's cap). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUTRAN Infraction Record Source: https://docs.usecroma.com/api-reference/peru/sutran-infraction-record /api-reference/openapi.json post /pe/sutran/infracciones/v1 Look up the infraction documents (papeletas and other actos) on record for a vehicle plate from SUTRAN (Superintendencia de Transporte Terrestre de Personas, Carga y Mercancías), Peru's national road-transport authority. `has_infractions: false` means the plate has no infractions on record. When infractions exist, `infractions` lists each one (document number, type, date, infraction code, classification). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Delaware Entities Search Source: https://docs.usecroma.com/api-reference/united-states/delaware-entities-search /api-reference/openapi.json post /us/delaware/entities-search/v1 Search the Delaware Division of Corporations registry of business entities by name: corporations, LLCs, limited partnerships, statutory trusts and partnerships, domestic and foreign, active and inactive. Returns up to 50 matches with their file numbers (`truncated` says whether more exist); `exact: true` matches the full name exactly. Pass a file number to `delaware_entity` for the record. # Delaware Entity by File Number Source: https://docs.usecroma.com/api-reference/united-states/delaware-entity-by-file-number /api-reference/openapi.json post /us/delaware/entity/v1 Look up one Delaware business entity by its file number and return the Division of Corporations' free record: name, incorporation or formation date, entity kind and type, residency, state of formation and the registered agent. `found: false` when the Division has no entity under that number. Live from the Division; not a statement of good standing. # SEC Form D Filing Source: https://docs.usecroma.com/api-reference/united-states/sec-form-d-filing /api-reference/openapi.json post /us/sec/form-d-filing/v1 Resolve one Form D filing by its EDGAR accession number and return the full record: issuer, executives and directors, industry, exemptions, securities, amounts offered and sold, investors, sales compensation and signature. `found: false` when EDGAR has no Form D under that number. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SEC Form D Search Source: https://docs.usecroma.com/api-reference/united-states/sec-form-d-search /api-reference/openapi.json post /us/sec/form-d-search/v1 Search every Form D filed with the SEC since 2008 (the notice a US company or fund files when it raises money privately) by free text over the issuer and its executives, directors and promoters, by issuer CIK, state, jurisdiction of incorporation, industry group, fund type, funds in or out, form type (new or amendment), filing-date window and minimum amount sold. Newest first, pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Sunbiz Entities Search Source: https://docs.usecroma.com/api-reference/united-states/sunbiz-entities-search /api-reference/openapi.json post /us/sunbiz/entities-search/v1 Search Florida's registry of business entities (Sunbiz, the Division of Corporations) by free text over the entity name, its officers and its registered agent, by name prefix, status (active/inactive), filing type (LLC, corporation, partnership, trust...), city and state of the principal address, FEI number, formation-date window and last-published date. Pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Sunbiz Entity by Document Number Source: https://docs.usecroma.com/api-reference/united-states/sunbiz-entity-by-document-number /api-reference/openapi.json post /us/sunbiz/entity/v1 Resolve one Florida business entity (Sunbiz, the Division of Corporations) by its document number and return the full record: status, filing type, addresses, formation date, FEI, annual reports, registered agent and officers. `found: false` when the registry has no entity with that number. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # ADRES Health Affiliation Status Source: https://docs.usecroma.com/api-reference/colombia/adres-health-affiliation-status /api-reference/openapi.json post /co/adres/affiliation-status/v1 Look up a person's affiliation to the Colombian health system (BDUA): the entities (EPS) they are or were affiliated to, the régimen (contributivo/subsidiado), affiliation dates, and affiliate type. `document_type` defaults to `CC`. Returns `found: false` when the document is not registered in BDUA. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # ANCP-CCE Concepto Source: https://docs.usecroma.com/api-reference/colombia/ancp-cce-concepto /api-reference/openapi.json post /co/ancp-cce/concepto/v1 Retrieve one ANCP-CCE concepto by id or slug (e.g. `c-1094-de-2026`): full doctrinal text, dates, subjects and subtopics. `found: false` when nothing matches. # ANCP-CCE Conceptos Search Source: https://docs.usecroma.com/api-reference/colombia/ancp-cce-conceptos-search /api-reference/openapi.json post /co/ancp-cce/conceptos-search/v1 Search conceptos (public-procurement legal opinions) from the Relatoría de la ANCP-CCE (Colombia Compra Eficiente) by free text, tema (descriptor), and modification date. Paginated, newest-modified first. Drill into one with `ancp-cce-concepto` for the full text. # CNDJ Ruling Source: https://docs.usecroma.com/api-reference/colombia/cndj-ruling /api-reference/openapi.json post /co/cndj/ruling/v1 Retrieve one CNDJ disciplinary ruling by its `registration_number` + `ficha_number` key: the editorial fields (titulación, descriptores, fuentes normativas, salvamentos) plus the ruling document and its extracted full text when it carries a text layer. `found: false` when no document is stored for that key. # CNDJ Rulings Search Source: https://docs.usecroma.com/api-reference/colombia/cndj-rulings-search /api-reference/openapi.json post /co/cndj/rulings-search/v1 Search disciplinary rulings from the Relatoría de la Comisión Nacional de Disciplina Judicial (CNDJ) by free text or the advanced filters (reporting magistrate, topic, respondent, matter, subtopic, filing year). Returns the matching summaries with their `numero_unico` + `numero_ficha` key; read one in full with `cndj-ruling`. # Consejo de Estado Jurisprudence Search Source: https://docs.usecroma.com/api-reference/colombia/consejo-de-estado-jurisprudence-search /api-reference/openapi.json post /co/consejo-estado/search/v1 Search the Relatoría del Consejo de Estado's traditional jurisprudence corpus (broadly providencias before December 2021) by section, type, date window, radicado, ponente, party or challenged rule. Each row carries the providencia's metadata plus a `url` permalink to feed to `consejo-estado-providencia`. For December 2021 onward use the SAMAI endpoints. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Consejo de Estado Providencia Source: https://docs.usecroma.com/api-reference/colombia/consejo-de-estado-providencia /api-reference/openapi.json post /co/consejo-estado/providencia/v1 Retrieve the full text of one providencia from the Relatoría del Consejo de Estado, by the `url` permalink a search row exposes. `found: false` when the permalink resolves to no document. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Contaduría State Delinquent Debtor Records Source: https://docs.usecroma.com/api-reference/colombia/contaduría-state-delinquent-debtor-records /api-reference/openapi.json post /co/contaduria/state-delinquent-debtors/v1 Check whether a person or entity is a delinquent debtor to the Colombian State, from the Contaduría General de la Nación's register (Boletín de Deudores Morosos del Estado). Returns two verdicts: delinquent debt owed to the State (Ley 901 de 2004) and default on a payment agreement (Ley 1066 de 2006). `document_type` defaults to `CC`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Contraloría Fiscal Records Source: https://docs.usecroma.com/api-reference/colombia/contraloría-fiscal-records /api-reference/openapi.json post /co/contraloria/fiscal-records/v1 Check whether a person is reported as a responsable fiscal in the Contraloría's SIBOR boletín (certificado de antecedentes de responsabilidad fiscal). `document_type` defaults to `CC`. Returns the verdict plus a verification code. # DIAN Doctrina Document Source: https://docs.usecroma.com/api-reference/colombia/dian-doctrina-document /api-reference/openapi.json post /co/dian/doctrina/v1 Retrieve the text of one DIAN doctrine document by the `document_id` returned by `dian-doctrina-search`: the official title and the body of the oficio, concepto or norm. Compiled norms run to millions of characters, so the body is returned in character ranges: `content.total_length` is the full size, and when `content.has_more` is true request the next range with `offset: content.next_offset`. `found: false` when no document carries that id. # DIAN Doctrina Search Source: https://docs.usecroma.com/api-reference/colombia/dian-doctrina-search /api-reference/openapi.json post /co/dian/doctrina-search/v1 Full-text search over DIAN's published tax doctrine and related legal compilation: oficios, conceptos, decretos, resoluciones, leyes and high-court rulings. Each hit carries the `document_id` used by `dian-doctrina-document`, plus the title, issuing body, epigraph and a matching excerpt. Optional filters: `document_type` (e.g. `Oficios`, `Conceptos`) and `year`. Paginated with `page` and `per_page`; `capped: true` means the source returned more matches than are retrievable, so narrow the query. # DIAN Electronic Document Source: https://docs.usecroma.com/api-reference/colombia/dian-electronic-document /api-reference/openapi.json post /co/dian/electronic-document/v1 Validate a Colombian electronic document (factura electrónica, nota crédito/débito) by its CUFE/UUID and the emisor or receptor NIT. Returns the issuer, recipient, totals and taxes, current legitimate holder, validations, and events. Set `include_pdf: true` to also receive `pdf_url`, the URL of the official PDF representation. `found: false` means the document is not registered under that CUFE, or the NIT matches neither the emisor nor the receptor. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Policía Criminal Records Source: https://docs.usecroma.com/api-reference/colombia/policía-criminal-records /api-reference/openapi.json post /co/policia/criminal-records/v1 Check a person's Colombian criminal record (antecedentes). `document_type` defaults to `CC`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Procuraduría Disciplinary Records Source: https://docs.usecroma.com/api-reference/colombia/procuraduría-disciplinary-records /api-reference/openapi.json post /co/procuraduria/disciplinary-records/v1 Check a person or entity's antecedentes with the Procuraduría General de la Nación (disciplinary, penal, contractual, fiscal, and pérdida de investidura records from SIRI). `document_type` defaults to `CC`. Returns the verdict, the registered name, and the antecedente sections reproduced from the certificate. # Rama Judicial Cases by Entity Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-entity /api-reference/openapi.json post /co/rama-judicial/cases-by-entity/v1 Search Colombian judicial cases by entity name. Optional filters narrow by entity type, court code, recent activity, and page. # Rama Judicial Cases by Radicado Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-radicado /api-reference/openapi.json post /co/rama-judicial/cases-by-radicado/v1 Resolve a Colombian judicial case by radicado and return case metadata plus the first 40 actuaciones (actions) available. # Rama Judicial Cases by Radicado (Batch) Source: https://docs.usecroma.com/api-reference/colombia/rama-judicial-cases-by-radicado-batch /api-reference/openapi.json post /co/rama-judicial/cases-by-radicado/v1/batch Resolve up to 50 Colombian judicial cases by radicado in one request. Returns one result per radicado in input order, each with its own status, so a single bad radicado never fails the batch. Each item counts as one request against your quota. # Registraduría Vital Status Source: https://docs.usecroma.com/api-reference/colombia/registraduría-vital-status /api-reference/openapi.json post /co/registraduria/vital-status/v1 Check a Colombian cédula's vital status. Returns `found: false` if the cédula isn't in the registry; otherwise `status` is `ALIVE` or `DECEASED`. # RUES Entities by Name Source: https://docs.usecroma.com/api-reference/colombia/rues-entities-by-name /api-reference/openapi.json post /co/rues/entities-by-name/v1 Search Colombian businesses in RUES by name, paginated, each result enriched with its full registry record (DetalleRM). # RUES Entity by NIT Source: https://docs.usecroma.com/api-reference/colombia/rues-entity-by-nit /api-reference/openapi.json post /co/rues/entity-by-nit/v1 Resolve a Colombian business by NIT and return its full RUES record: registry detail, financial statements, renewal history, related parties and registry notices. # RUNT Vehicle by Plate Source: https://docs.usecroma.com/api-reference/colombia/runt-vehicle-by-plate /api-reference/openapi.json post /co/runt/vehicle-by-plate/v1 Resolve a Colombian vehicle in RUNT (Registro Único Nacional de Tránsito) by plate and the registered owner's document. Returns the vehicle record (brand, line, model year, class, body, color, engine displacement, fuel, weights, VIN, engine/chassis/serial numbers, traffic authority, registration dates, lien/pledge flags) plus SOAT insurance history, técnico-mecánica (RTM) inspection history, extended technical data, registered guarantees/liens (with the creditor, e.g. a financing bank), ownership limitations, armoring (blindaje) status, civil-liability policies, DIJIN and scrapping certificates, normalization records, and scrapping status. `document_type` defaults to `CC`. `found: false` when the plate and owner document have no active match. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # RUNT Vehicle History by Plate Source: https://docs.usecroma.com/api-reference/colombia/runt-vehicle-history-by-plate /api-reference/openapi.json post /co/runt/vehicle-history-by-plate/v1 Look up a Colombian vehicle's history in RUNT (Registro Único Nacional de Tránsito) by plate alone, without the owner's document. Returns the registered owner(s) (name and identification number), the vehicle characteristics (brand, line, model year, class, body, color, VIN, engine/chassis/serial numbers), the traffic-license and import records, SOAT and técnico-mecánica (RTM) history, any accident on record, recent and pending procedures (trámites), and guarantee/lien and ownership-limitation summaries. `found: false` when the plate has no record. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAMAI Corporaciones Source: https://docs.usecroma.com/api-reference/colombia/samai-corporaciones /api-reference/openapi.json post /co/samai/corporaciones/v1 Every corporación (despacho) SAMAI exposes, with its code and name. A code scopes a process search. # SAMAI Processes Source: https://docs.usecroma.com/api-reference/colombia/samai-processes /api-reference/openapi.json post /co/samai/processes/v1 Search live contentious-administrative processes (Consejo de Estado plus every Tribunal and Juzgado Administrativo) by party, radicado, or class, scoped to a corporación. Returns one page of matches with the reporting magistrate, class, filing date, parties and the official detail link. A radicado search derives the corporación from the radicado when none is given. # SAMAI Secciones Source: https://docs.usecroma.com/api-reference/colombia/samai-secciones /api-reference/openapi.json post /co/samai/secciones/v1 The secciones (salas) inside one corporación, with their codes and names. # SECOP Contract by ID Source: https://docs.usecroma.com/api-reference/colombia/secop-contract-by-id /api-reference/openapi.json post /co/secop/contract/v1 Resolve one electronic contract (SECOP II) by its contract id and return the full contract record plus its satellite history: registered additions/modifications, insurance policies (garantías) with insurer and validity, and the delivery plan with planned vs actual progress. `found: false` when no contract matches the id. # SECOP Contracts by Provider Source: https://docs.usecroma.com/api-reference/colombia/secop-contracts-by-provider /api-reference/openapi.json post /co/secop/contracts-by-provider/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/contracts-search/v1` instead. List the public-procurement contracts (SECOP II) awarded to one provider by cédula or NIT, across all contracting entities: the contractor profile (who hired them, values, status, dates). Optional filters: contracting-entity NIT and a sign-date window (`from_date`/`to_date`). Pages of 500, newest first (`page`, 1-based); `capped: true` means the page is full and later pages may exist. # SECOP Process by Notice Source: https://docs.usecroma.com/api-reference/colombia/secop-process-by-notice /api-reference/openapi.json post /co/secop/process/v1 Resolve a Colombian public-procurement process (SECOP II) by its OpportunityDetail noticeUID and return the process header, the per-provider award list, and every awarded contract: providers, documents, values, dates, and execution amounts. Sourced from Colombia Compra Eficiente's open data. `found: false` when no process matches the noticeUID. # SECOP Processes by Entity Source: https://docs.usecroma.com/api-reference/colombia/secop-processes-by-entity /api-reference/openapi.json post /co/secop/processes-by-entity/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/processes-search/v1` instead. List the procurement processes (SECOP II) published by one contracting entity (by NIT), optionally within a publication-date window. The audit population for an entity. Returns lean summaries (drill into one with `secop-process`). Pages of 500, newest first (`page`, 1-based); `capped: true` means the page is full and later pages may exist. # SECOP Sanctions by Provider Source: https://docs.usecroma.com/api-reference/colombia/secop-sanctions-by-provider /api-reference/openapi.json post /co/secop/sanctions-by-provider/v1 Deprecated since 2026-08-30; stops answering on 2026-12-01. Use `POST /co/secop/sanctions-search/v1` instead. List the fines and sanctions (multas y sanciones) recorded against one state contractor by cédula or NIT: sanctioning entity, resolution number, value, and the dates the sanction was published and became final. A direct adverse signal for counterparty screening, from Colombia Compra Eficiente's open data. # SICAAC Insolvency Cases Source: https://docs.usecroma.com/api-reference/colombia/sicaac-insolvency-cases /api-reference/openapi.json post /co/sicaac/insolvency-cases/v1 Look up Colombian natural-person insolvency cases by document number. `document_type` defaults to `CC` (Cédula de Ciudadanía). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SIMIT Account Status Source: https://docs.usecroma.com/api-reference/colombia/simit-account-status /api-reference/openapi.json post /co/simit/account-status/v1 Look up a SIMIT (Sistema Integrado de Información sobre Multas y Sanciones por Infracciones de Tránsito) account status by vehicle plate or by a person's identification number. Returns outstanding comparendos and multas (each with the offending party, infraction codes and descriptions, traffic authority, department, amounts, and the discount/payment projections), the account totals, any payment agreements (acuerdos de pago), and driving courses (cursos viales). `is_plate` reports whether the value was matched as a plate. `clear: true` means paz y salvo (nothing outstanding). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Superfinanciera Complaints Source: https://docs.usecroma.com/api-reference/colombia/superfinanciera-complaints /api-reference/openapi.json post /co/superfinanciera/complaints/v1 Return the action history of a specific jurisdictional complaint filed against a person or entity at Colombia's Superfinanciera. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Supersociedades Financial Statements Source: https://docs.usecroma.com/api-reference/colombia/supersociedades-financial-statements /api-reference/openapi.json post /co/supersociedades/financial-statements/v1 Annual financial statements a Colombian company has filed with the Superintendencia de Sociedades, by NIT: income statement, balance sheet and cash flow per fiscal year, plus the company identity from the filing cover. One filing per year (the preferred entry point, latest re-submission), newest first, up to 10 years. Figures come as filed, in the unit the filing declares. # Caixa FGTS Regularity Certificate (CRF) Source: https://docs.usecroma.com/api-reference/brazil/caixa-fgts-regularity-certificate-crf /api-reference/openapi.json post /br/caixa/fgts-certificate/v1 Check whether a Brazilian employer is up to date with the FGTS, by CNPJ, from Caixa Econômica Federal: `regular` with the current Certificado de Regularidade do FGTS (number, validity, establishment address), or `irregular` with which body reports the impediment (PGFN or Caixa). Optionally the certificates issued in the last 24 months. `found: false` when the CNPJ is not registered as an employer. # CGU Sanction Source: https://docs.usecroma.com/api-reference/brazil/cgu-sanction /api-reference/openapi.json post /br/cgu/sanction/v1 Resolve one sanction on Brazil's federal integrity registers (CGU) by its id and return the full record: the party, its names and document (CPFs masked), the sanction, the sanctioning body, the dates, the legal basis, the process, and the fine, the expelled servant's post or the leniency agreement's terms where they apply. `found: false` when no register carries that id. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # CGU Sanctions Search Source: https://docs.usecroma.com/api-reference/brazil/cgu-sanctions-search /api-reference/openapi.json post /br/cgu/sanctions-search/v1 Search Brazil's federal integrity registers kept by the Controladoria-Geral da União (CEIS, CNEP, CEAF, CEPIM and the leniency agreements) by free text over every name the register gives the party, by CNPJ or CPF (exact; CPFs come back masked), register, party type and the sanctioning body's state. One row per sanction, by name, pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # DJEN Publications Search Source: https://docs.usecroma.com/api-reference/brazil/djen-publications-search /api-reference/openapi.json post /br/djen/publications-search/v1 Search Brazil's national court publications (Diário de Justiça Eletrônico Nacional, CNJ) by party name, lawyer name, OAB number, CNJ case number, court, free text and availability date: intimações, citações, editais and listas de distribuição from every state, federal, labour, electoral and military court and the superior courts, newest first, with the full text and the parties and lawyers each publication is addressed to. At least one of party, lawyer, OAB number, case number, court or text is required; `total` is exact for a single day and stops at 10,000 for a range. # IBAMA Environmental Embargo Source: https://docs.usecroma.com/api-reference/brazil/ibama-environmental-embargo /api-reference/openapi.json post /br/ibama/embargo/v1 One environmental embargo from IBAMA by the `id` the search returns: the party, the place and area, the infraction and whether it is active, lifted or cancelled. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # IBAMA Environmental Embargoes Search Source: https://docs.usecroma.com/api-reference/brazil/ibama-environmental-embargoes-search /api-reference/openapi.json post /br/ibama/embargoes-search/v1 Search every environmental embargo Brazil's federal environmental agency (IBAMA) has imposed since 1987, by CPF or CNPJ (or its 8-character root), name or property, state, municipality, term number or date. Each embargo carries its status (`active`, `lifted`, `cancelled`), the area in hectares, the place, the infraction and the process; the response counts how many matches are active. CPFs are matched exactly and returned masked. Updated daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # MTE Slave Labour Register Listing Source: https://docs.usecroma.com/api-reference/brazil/mte-slave-labour-register-listing /api-reference/openapi.json post /br/mte/employer/v1 One listing from Brazil's slave labour employer registers, by the `id` the search returns. `found: false` once the employer has left the register. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # MTE Slave Labour Register Search Source: https://docs.usecroma.com/api-reference/brazil/mte-slave-labour-register-search /api-reference/openapi.json post /br/mte/slave-labour-search/v1 Search Brazil's register of employers caught keeping workers in conditions analogous to slavery (Cadastro de Empregadores, the "Lista Suja"), and the register of employers under a conduct-adjustment agreement, by CNPJ (or its 8-character root), CPF, name, state or inspection year. Each listing carries the establishment, workers found, activity, the final decision date and every period on the register. CPFs are matched exactly and returned masked. Updated daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # PGFN Debtor Source: https://docs.usecroma.com/api-reference/brazil/pgfn-debtor /api-reference/openapi.json post /br/pgfn/debtor/v1 Total what one Brazilian company owes the Union in the dívida ativa (Procuradoria-Geral da Fazenda Nacional), by CNPJ or by its 8-character root for every establishment: the number of debts, the amount owed as principal debtor, the part in court, a breakdown by regime (federal taxes, social security, FGTS), and the 50 largest debts. `found: false` when PGFN has inscribed nothing. Served by Croma (`as_of` says how current the data is), refreshed with each quarterly release. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # PGFN Debts Search Source: https://docs.usecroma.com/api-reference/brazil/pgfn-debts-search /api-reference/openapi.json post /br/pgfn/debts-search/v1 Search the active debts Brazilian companies owe the Union in the dívida ativa (Procuradoria-Geral da Fazenda Nacional): federal taxes, social security contributions and the FGTS, by company name, CNPJ or its 8-character root, regime, state, status, the company's role in the debt, whether it is in court, and an amount range. Largest amount first, pages of up to 50. Companies only. Served by Croma (`as_of` says how current the data is), refreshed with each quarterly release. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # TST Labour-Debt Certificate (CNDT) Source: https://docs.usecroma.com/api-reference/brazil/tst-labour-debt-certificate-cndt /api-reference/openapi.json post /br/tst/labour-certificate/v1 Issue Brazil's labour-debt certificate (Certidão Negativa de Débitos Trabalhistas) for a company by CNPJ, live from the Tribunal Superior do Trabalho: `clear`, `debts`, or `debts_secured` (every debt secured or suspended, with the legal effect of a clearance), the certificate number, issue time and validity, and each labour case with its court and whether the debt is secured. Optionally the official PDF. Async job; most calls finish inline. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Colombia Law Detail Source: https://docs.usecroma.com/api-reference/colombia/colombia-law-detail /api-reference/openapi.json post /co/legalize/law/v1 Resolve a single Colombian law by its identifier and return the full record, sourced from Legalize: metadata plus the law text as Markdown (`content_md`). `found: false` when no law matches the identifier. # Colombia Laws Search Source: https://docs.usecroma.com/api-reference/colombia/colombia-laws-search /api-reference/openapi.json post /co/legalize/laws/v1 Search Colombian legislation as structured data, sourced from Legalize. Filter by free text, law type, publication year, status, and jurisdiction. Returns paginated law summaries; use `per_page` and `page` to page. Drill into one with `legalize-law-detail`. # SIATA Aburrá Valley Conditions Source: https://docs.usecroma.com/api-reference/colombia/siata-aburrá-valley-conditions /api-reference/openapi.json post /co/siata/v1 Deprecated since 2026-08-27; stops answering on 2026-12-01. Use `POST /co/siata-geoportal/weather/v1` instead. Live environmental conditions for the Aburrá Valley (Medellín metropolitan area) from SIATA: per-station weather (temperature, humidity, wind, pressure), rainfall (accumulated + intensity), and air quality (24h PM2.5 + ICA index). All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) to get only nearby stations, nearest first with `distance_km` populated. Coverage is the Medellín metro area only. # SIATA Air Quality Source: https://docs.usecroma.com/api-reference/colombia/siata-air-quality /api-reference/openapi.json post /co/siata-geoportal/air-quality/v1 Current air quality at SIATA's reference stations in the Aburrá Valley (Medellín metropolitan area): 24-hour PM2.5 and PM10, 8-hour ozone and CO, 1-hour NO2 and SO2, each as a concentration with Colombia's numeric air-quality index (ICA) and its category, plus the pollutant driving each station's index. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Alerts Source: https://docs.usecroma.com/api-reference/colombia/siata-alerts /api-reference/openapi.json post /co/siata-geoportal/alerts/v1 Official notices from SIATA, the early-warning system of the Aburrá Valley (Medellín metropolitan area): title, plain-text description, validity dates and audience. Returns the active notices; pass `include_past: true` for every notice on record, most recent first. # SIATA Cameras Source: https://docs.usecroma.com/api-reference/colombia/siata-cameras /api-reference/openapi.json post /co/siata-geoportal/cameras/v1 SIATA's camera network in the Aburrá Valley (Medellín metropolitan area), about 90 cameras pointed at river gauges, the sky, underpasses and the boundary layer, each with the URL of its latest snapshot. All inputs optional: pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby cameras nearest first, or `type` (`nivel`, `cielo`, `deprimido`, `capa_limite`) to keep one kind. # SIATA Citizen Air Sensors Source: https://docs.usecroma.com/api-reference/colombia/siata-citizen-air-sensors /api-reference/openapi.json post /co/siata-geoportal/citizen-sensors/v1 The citizen-science PM2.5 sensor network of the Aburrá Valley (Medellín metropolitan area), about 230 low-cost sensors: PM2.5 over the last hour, the daily air-quality index (ICA) with its category, whether each sensor is reporting, and its data recovery over 24 hours and 15 days. All inputs optional: an empty body returns every sensor; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby sensors nearest first, or `municipality` / `station_code` to narrow. Indicative data; use the air-quality endpoint for the reference network. # SIATA Rainfall Source: https://docs.usecroma.com/api-reference/colombia/siata-rainfall /api-reference/openapi.json post /co/siata-geoportal/rainfall/v1 Rain at every SIATA gauge in the Aburrá Valley (Medellín metropolitan area): whether it is raining now and the source's extreme-rain flag, rain accumulated over seven trailing windows (5 minutes to 30 days), and monthly totals for the current year with each month's data availability. All inputs optional: an empty body returns every gauge; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby gauges nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA River Levels Source: https://docs.usecroma.com/api-reference/colombia/siata-river-levels /api-reference/openapi.json post /co/siata-geoportal/river-levels/v1 Current river, stream and storm-sewer water levels for the Aburrá Valley (Medellín metropolitan area) from SIATA: per-station level in metres against the station's flood thresholds (with a derived status), the highest and mean level over the last three hours, the source's alert colour and level, six trailing windows, basin morphology and land cover. `include_series` adds a per-minute 3-hour series. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Seismic Events Source: https://docs.usecroma.com/api-reference/colombia/siata-seismic-events /api-reference/openapi.json post /co/siata-geoportal/seismic-events/v1 The last earthquakes recorded by SIATA's accelerograph and seismograph network in the Aburrá Valley (Medellín metropolitan area): per station, the most recent events with magnitude, epicentre, depth and what the station measured (peak ground acceleration and Mercalli intensity on accelerographs, peak ground velocity on seismographs). All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. # SIATA Weather Source: https://docs.usecroma.com/api-reference/colombia/siata-weather /api-reference/openapi.json post /co/siata-geoportal/weather/v1 Current weather at every SIATA station in the Aburrá Valley (Medellín metropolitan area): temperature, humidity, wind, pressure, an hourly 12-hour series per station, and the valley's UV index with today's hourly series. All inputs optional: an empty body returns every station; pass `latitude` + `longitude` (with optional `radius_km`, default 10) for nearby stations nearest first, or `municipality` / `station_code` to narrow. Coverage is the Medellín metro area only. # SIATA Weather Forecast Source: https://docs.usecroma.com/api-reference/colombia/siata-weather-forecast /api-reference/openapi.json post /co/siata-geoportal/forecast/v1 SIATA's two-day weather forecast for the Aburrá Valley (Medellín metropolitan area), per municipality and, for Medellín, per zone: daily maximum and minimum temperature and the likelihood of rain for each part of the day (early morning, morning, afternoon, night). Pass `municipality` to get one municipality; an empty body returns every zone. Issued once a day. # SIATA Weather Station Series Source: https://docs.usecroma.com/api-reference/colombia/siata-weather-station-series /api-reference/openapi.json post /co/siata-geoportal/weather-series/v1 Minute-by-minute weather at one SIATA station in the Aburrá Valley (Medellín metropolitan area): temperature, humidity, wind speed and pressure over the last hour at one-minute resolution (`window: "1h"`, the default) or the last six hours at five-minute resolution (`window: "6h"`), with the source's means and temperature percentiles. `station_code` is required; codes come from the weather endpoint. Returns `found: false` for an unknown station. # Extract JSON Source: https://docs.usecroma.com/api-reference/global/extract-json /api-reference/openapi.json post /global/extract/json/v1 Pull structured data off any public web page. You supply a JSON Schema describing the object you want and the fields are located on the page and returned under `result`, already typed. # Extract Markdown Source: https://docs.usecroma.com/api-reference/global/extract-markdown /api-reference/openapi.json post /global/extract/markdown/v1 Turn any public web page into clean Markdown. `scope` keeps either the article body or the whole page, and `include_metadata` adds the page's title, author, published date and image. Handles pages that render themselves in the browser at `effort: max`. # Generate JSON Source: https://docs.usecroma.com/api-reference/global/generate-json /api-reference/openapi.json post /global/generate/json/v1 Read a public web page and return a new object built from it, following your `instructions` and your JSON Schema. Unlike `extract-json`, the fields need not appear on the page: summarize, classify, translate or reshape what is there. # Research Source: https://docs.usecroma.com/api-reference/global/research /api-reference/openapi.json post /global/research/v1 Answer an open question from live sources. Returns a written report in Markdown with numbered citations plus the list of sources behind it. Typically takes a few seconds; it is a research pass, not a lookup, so verify anything you act on against the primary source. # Web Search Source: https://docs.usecroma.com/api-reference/global/web-search /api-reference/openapi.json post /global/web-search/v1 AI-powered web search. Returns structured results with URLs, titles, authors, dates, highlights, and relevance scores. # Get Job Status Source: https://docs.usecroma.com/api-reference/jobs/get-job-status /api-reference/openapi.json get /jobs/{id} Poll the status and result of an async job created by an async-capable endpoint. Returns the job envelope; `data` is populated once `status` is `completed`, `error` once it is `failed`. Jobs are org-scoped — another org's job reads as 404. # Banxico Circular Source: https://docs.usecroma.com/api-reference/mexico/banxico-circular /api-reference/openapi.json post /mx/banxico/circular/v1 One Banco de México circular in full, by its `number`: subject, obligated entities, the consolidated (compiled) text PDF, the original text PDF with its DOF date, and every modification with dates and PDFs. Amendment circulars have no page of their own: looking one up returns the amended base circular (its `number` says which), whose modifications list carries the requested número. # Banxico Circulars Source: https://docs.usecroma.com/api-reference/mexico/banxico-circulars /api-reference/openapi.json post /mx/banxico/circulars/v1 The chronological index of every circular and disposición issued by Banco de México (1,200+ entries back to 1969), each with subject, abrogation status, and which base circular it modifies. One row per index entry: a circular amending several bases appears once per base. Optional `year` filters one year. Paged, 100 per page; drill into one with `banxico-circular`. # CNBV Regulation History Source: https://docs.usecroma.com/api-reference/mexico/cnbv-regulation-history /api-reference/openapi.json post /mx/cnbv/regulation-history/v1 Every modifying resolución and annex for one CNBV norma (by `regulation_id` from `cnbv-regulations`), each with its DOF date and official PDF. The Circular Única de Bancos alone carries 180+ modifications. # CNBV Regulations Source: https://docs.usecroma.com/api-reference/mexico/cnbv-regulations /api-reference/openapi.json post /mx/cnbv/regulations/v1 The CNBV's current regulatory catalog (~113 normas: leyes, disposiciones de carácter general including the Circular Única de Bancos, circulares, acuerdos, reglas), each with type, DOF publication date, applicable sectors, and the official PDF. Optional `query` filters by name. Paged, 50 per page. Norms with a `regulation_id` have modification history via `cnbv-regulation-history`. # DOF Publication Source: https://docs.usecroma.com/api-reference/mexico/dof-publication /api-reference/openapi.json post /mx/dof/publication/v1 Retrieve one publication from Mexico's official federal gazette (DOF) by id, including its plain text when the publication is machine-readable. Publications range from a few hundred characters to entire decrees, so the text is returned in character ranges: `content.total_length` is the full size, and when `content.has_more` is true request the next range with `offset: content.next_offset`. Anything published before the 1973 volume is held only as a scan and returns `is_image_only: true` with `content: null`, its metadata, and `scan_url` for the official scanned page. This returns one gazette publication, not the consolidated text of a law; for that use `diputados-federal-law`. # DOF Publications by Date Source: https://docs.usecroma.com/api-reference/mexico/dof-publications-by-date /api-reference/openapi.json post /mx/dof/publications-by-date/v1 Everything published in Mexico's official federal gazette (Diario Oficial de la Federación) on a given date: decrees, law reforms, and regulator disposiciones across the morning, evening, and extraordinary editions, each with its issuing branch and agency. The gazette is organised by day, so a date is the only way in; it publishes the decree that created or amended a law, never the consolidated current text of one. For that, use `diputados-federal-law`. The index reaches back to 1917, while machine-readable text starts with the 1973 volume: `has_text: true` marks publications retrievable with `dof-publication`, and every entry carries `scan_url` for the official scanned page. # FGR Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fgr-bulletins /api-reference/openapi.json post /mx/fiscalias/fgr/bulletins/v1 Browse the public press bulletins (comunicados) of the federal prosecutor (FGR), most recent first; page forward with `page` until `has_more` is false. Each item carries its bulletin `code`, `scope` (national or state), date, and headline, and links to the full comunicado. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía CDMX Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-cdmx-bulletins /api-reference/openapi.json post /mx/fiscalias/cdmx/bulletins/v1 Browse the public press bulletins (comunicados) of the Mexico City prosecutor, most recent first, paged with `page` (10 per page). Each bulletin carries its comunicado `code`, date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Chiapas Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-chiapas-bulletins /api-reference/openapi.json post /mx/fiscalias/chiapas/bulletins/v1 Browse the public press bulletins (comunicados) of the Chiapas state prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin carries its comunicado number, classification, date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Chihuahua Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-chihuahua-bulletins /api-reference/openapi.json post /mx/fiscalias/chihuahua/bulletins/v1 Search the public press bulletins (comunicados) of the Chihuahua state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Optional `from_date`/`to_date` bound the range. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence); the `categories` name the acting unit. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Estado de México Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-estado-de-méxico-bulletins /api-reference/openapi.json post /mx/fiscalias/edomex/bulletins/v1 Browse the public press bulletins (comunicados) of the Estado de México prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin carries its comunicado `code`, date, headline, and a link to the full document. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Jalisco Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-jalisco-bulletins /api-reference/openapi.json post /mx/fiscalias/jalisco/bulletins/v1 Search the public press bulletins (comunicados) of the Jalisco state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence) and carries the issuing author and tags. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Nuevo León Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-nuevo-león-bulletins /api-reference/openapi.json post /mx/fiscalias/nuevoleon/bulletins/v1 Search the public press bulletins (comunicados) of the Nuevo León prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin carries its date, headline, and summary. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Puebla Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-puebla-bulletins /api-reference/openapi.json post /mx/fiscalias/puebla/bulletins/v1 Search the public press bulletins (comunicados) of the Puebla state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Each bulletin carries its numbered boletín, date, and headline. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Veracruz Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-veracruz-bulletins /api-reference/openapi.json post /mx/fiscalias/veracruz/bulletins/v1 Search the public press bulletins (comunicados) of the Veracruz state prosecutor. Free-text `query` searches the corpus; omit it for the most recent. Optional `from_date`/`to_date` bound the range. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence). These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Fiscalía Zacatecas Bulletins Source: https://docs.usecroma.com/api-reference/mexico/fiscalía-zacatecas-bulletins /api-reference/openapi.json post /mx/fiscalias/zacatecas/bulletins/v1 Browse the public press bulletins (comunicados) of the Zacatecas state prosecutor, most recent first; page forward with `page` until `has_more` is false. Each bulletin announces one procedural event (arrest, imputation, conviction, sentence) and carries the full text. These are public press releases, not a criminal-record database: a name in a bulletin is an indicio, never proof, and procedural stage must not be read as a conviction. # Mexican Federal Law Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-law /api-reference/openapi.json post /mx/diputados/federal-law/v1 One Mexican federal law in full by its `law_id`: current consolidated text (PDF/DOC), original DOF publication with its scan, and every reform decree that amended it, newest first, each with its DOF date, headline, documents, and any fe de erratas. # Mexican Federal Laws Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-laws /api-reference/openapi.json post /mx/diputados/federal-laws/v1 The Cámara de Diputados catalog of federal laws and codes (315+), each with its official name, abbreviation, original DOF publication date, most recent reform date, consolidated PDF/DOC text, and whether it is still in force. Optional `query` filters by name or abbreviation. Paged, 100 per page; drill into one with `diputados-federal-law`. # Mexican Federal Regulations Source: https://docs.usecroma.com/api-reference/mexico/mexican-federal-regulations /api-reference/openapi.json post /mx/diputados/federal-regulations/v1 The Cámara de Diputados catalog of federal reglamentos (135+), each with its DOF publication date, consolidated text, whether it is still in force, and an inline history of reforms, annual amount updates, erratas and vigencia notices. Optional `query` filters by name. Paged, 50 per page. # Mexican Law Reforms by Year Source: https://docs.usecroma.com/api-reference/mexico/mexican-law-reforms-by-year /api-reference/openapi.json post /mx/diputados/law-reforms/v1 Every reform decree published in the DOF in one year, from the Cámara de Diputados reform log: the decree prose, the canonical actions it takes (reforman, adicionan, derogan, abrogan, expiden...), and every law it touches. One entry per publication day; a single day can bundle several instruments. Defaults to the current year. Paged, 50 decrees per page. # SCJN Tesis Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis /api-reference/openapi.json post /mx/scjn/tesis/v1 Retrieve one tesis by its registro digital (`registration_number`), including the full text, citation (clave, época, localización), subjects, precedent notes, and linked ruling ids. # SCJN Tesis Browse Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis-browse /api-reference/openapi.json post /mx/scjn/tesis-browse/v1 Deprecated since 2026-09-07; stops answering on 2026-12-15. Use `POST /mx/scjn/tesis-search/v1` instead. Same request and response as `scjn-tesis-search`, which replaces it: the Mexican Supreme Court's case law in full, filtered by words in the title and text, binding force, subject, época, year, instance, court, formation, publication window and the court's modification date. Newest first, pages of up to 20 full records, with `as_of`. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SCJN Tesis Search Source: https://docs.usecroma.com/api-reference/mexico/scjn-tesis-search /api-reference/openapi.json post /mx/scjn/tesis-search/v1 Search the Mexican Supreme Court's case law: every tesis and jurisprudencia the Semanario Judicial de la Federación has published since 1911 (300k+), each in full. Match words in the title and text (`query`, optional; every word must appear) and filter by binding force (`tesis_type`: jurisprudencia vs aislada), subject (materia), época number, year, deciding level (`instance`), court or chamber, how the criterion was formed (`formation`), publication window (`published_from`/`published_to`) and the court's own modification date (`updated_after`). Newest first, pages of up to 50 full records; `as_of` says how current the data is. Read one by its registro digital with `scjn-tesis`. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SIEM Establishment Source: https://docs.usecroma.com/api-reference/mexico/siem-establishment /api-reference/openapi.json post /mx/siem/establishment/v1 Retrieve one SIEM establishment's declared profile: RFC, legal or personal name, commercial name, activity, address and contact, headcount, import/export flags, declared products and services, and registration status. Returns `found: false` when the id is unknown. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SIEM Establishments Search Source: https://docs.usecroma.com/api-reference/mexico/siem-establishments-search /api-reference/openapi.json post /mx/siem/establishments/v1 Search Mexican business establishments in the SIEM directory by commercial name or razón social. Optional filters narrow by state (INEGI code) and SCIAN activity. SIEM is a self-declared directory: registration is voluntary and each establishment chooses which fields stay public, so absence is not evidence of anything. Drill into a result with `siem-establishment`. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # APESEG SOAT Certificate History Source: https://docs.usecroma.com/api-reference/peru/apeseg-soat-certificate-history /api-reference/openapi.json post /pe/apeseg/soat/v1 Look up a vehicle plate's SOAT (mandatory traffic-accident insurance) certificate history from APESEG (Asociación Peruana de Empresas de Seguros). `has_active_soat: true` means a currently valid (VIGENTE) certificate exists, returned as `active`; `certificates` lists the full history. `found: false` when the plate has no SOAT record. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Callao Traffic Tickets Source: https://docs.usecroma.com/api-reference/peru/callao-traffic-tickets /api-reference/openapi.json post /pe/callao/papeletas/v1 List the outstanding traffic tickets (papeletas) registered against a vehicle plate in the province of Callao, issued by the Municipalidad Provincial del Callao. `has_papeletas: false` means the plate has no outstanding tickets on record. When tickets exist, `papeletas` lists each one (code, ticket number, infraction date, amount, installment) and `total` is the sum of the outstanding amounts in PEN. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # OECE Process by OCID Source: https://docs.usecroma.com/api-reference/peru/oece-process-by-ocid /api-reference/openapi.json post /pe/oece/process/v1 Resolve one Peruvian public-procurement procedure (SEACE, published by OECE) by its OCDS id and return the full record: buyer, estimated value, items with their stage, bidding documents, awards with suppliers, and contracts. `found: false` when there is no procedure with that id. Served by Croma (`as_of` says how current the data is), covering procedures published from 2020. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # OECE Processes Search Source: https://docs.usecroma.com/api-reference/peru/oece-processes-search /api-reference/openapi.json post /pe/oece/processes-search/v1 Search Peru's public-procurement procedures (SEACE, published by OECE) by free text over title and description, buyer RUC, awarded supplier RUC, department, category (goods/services/works), procedure type, publication-date window and last-modified date. Newest first, pages of up to 50. Served by Croma (`as_of` says how current the data is), covering procedures published from 2020. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # RREE Foreigner Cards Source: https://docs.usecroma.com/api-reference/peru/rree-foreigner-cards /api-reference/openapi.json post /pe/rree/foreigner-cards/v1 Verify a Peruvian foreigner identity card (carné de extranjería) by its 8-digit card number: names, nationality, immigration status, and expiration. `found: false` when no card matches. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAT Lima Account Status Source: https://docs.usecroma.com/api-reference/peru/sat-lima-account-status /api-reference/openapi.json post /pe/sat-lima/account-status/v1 Look up outstanding debt owed to the SAT de Lima (Servicio de Administración Tributaria de Lima) for a person, company, or vehicle. Pass `document_type` (`dni`, `ruc`, `placa`, `papeleta`, `cod_administrado`, or `compromiso`; defaults to `dni`) plus `document_number`. Returns each outstanding item (taxes such as impuesto vehicular / predial / arbitrios, traffic tickets, administrative fines, and payment commitments) with its group, reference, amount, status, and relevant dates, plus the account total. `clear: true` means nothing is outstanding. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SAT Lima Vehicle Capture Orders Source: https://docs.usecroma.com/api-reference/peru/sat-lima-vehicle-capture-orders /api-reference/openapi.json post /pe/sat-lima/capturas/v1 Check whether a vehicle plate has an outstanding capture order (orden de captura) in the province of Lima, issued by the SAT de Lima (Servicio de Administración Tributaria de Lima) for unpaid tax debt or traffic tickets. `has_capture_order: false` means the plate has no capture order on record. When an order exists, `orders` lists each one with the fields the source reports. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SBS SOAT Report Source: https://docs.usecroma.com/api-reference/peru/sbs-soat-report /api-reference/openapi.json post /pe/sbs/soat/v1 Look up a vehicle plate's SOAT (mandatory traffic-accident insurance) report from SBS (Superintendencia de Banca, Seguros y AFP), Peru's banking and insurance regulator. Returns `accident_count` (accidents covered by SOAT in the last 5 years) and `policies`, the list of SOAT policies on record (issuing company, vehicle class/use, accidents per policy, policy/certificate number, coverage window, and status VIGENTE/VENCIDA/ANULADA). `has_active_soat: true` means a policy is currently in force, returned as `active`. `found: false` means no SOAT information is reported for the plate. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer by Document Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-by-document /api-reference/openapi.json post /pe/sunat/document/v1 Look up a Peruvian taxpayer's full record by identity document (DNI, carné de extranjería, passport, or diplomatic card). `found: false` when no taxpayer matches. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer by RUC Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-by-ruc /api-reference/openapi.json post /pe/sunat/ruc/v1 Look up a Peruvian taxpayer's full record by RUC (11 digits). `found: false` when the RUC is not registered. Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUNAT Taxpayer Search by Name Source: https://docs.usecroma.com/api-reference/peru/sunat-taxpayer-search-by-name /api-reference/openapi.json post /pe/sunat/name/v1 Search Peruvian taxpayers by name or razón social. Returns up to 30 matches (SUNAT's cap). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # SUTRAN Infraction Record Source: https://docs.usecroma.com/api-reference/peru/sutran-infraction-record /api-reference/openapi.json post /pe/sutran/infracciones/v1 Look up the infraction documents (papeletas and other actos) on record for a vehicle plate from SUTRAN (Superintendencia de Transporte Terrestre de Personas, Carga y Mercancías), Peru's national road-transport authority. `has_infractions: false` means the plate has no infractions on record. When infractions exist, `infractions` lists each one (document number, type, date, infraction code, classification). Supports async delivery: set `Prefer: wait=N` for an inline result, pass `callback_url` to receive a POST when ready, or poll `GET /jobs/{id}`. # Delaware Entities Search Source: https://docs.usecroma.com/api-reference/united-states/delaware-entities-search /api-reference/openapi.json post /us/delaware/entities-search/v1 Search the Delaware Division of Corporations registry of business entities by name: corporations, LLCs, limited partnerships, statutory trusts and partnerships, domestic and foreign, active and inactive. Returns up to 50 matches with their file numbers (`truncated` says whether more exist); `exact: true` matches the full name exactly. Pass a file number to `delaware_entity` for the record. # Delaware Entity by File Number Source: https://docs.usecroma.com/api-reference/united-states/delaware-entity-by-file-number /api-reference/openapi.json post /us/delaware/entity/v1 Look up one Delaware business entity by its file number and return the Division of Corporations' free record: name, incorporation or formation date, entity kind and type, residency, state of formation and the registered agent. `found: false` when the Division has no entity under that number. Live from the Division; not a statement of good standing. # SEC Form D Filing Source: https://docs.usecroma.com/api-reference/united-states/sec-form-d-filing /api-reference/openapi.json post /us/sec/form-d-filing/v1 Resolve one Form D filing by its EDGAR accession number and return the full record: issuer, executives and directors, industry, exemptions, securities, amounts offered and sold, investors, sales compensation and signature. `found: false` when EDGAR has no Form D under that number. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # SEC Form D Search Source: https://docs.usecroma.com/api-reference/united-states/sec-form-d-search /api-reference/openapi.json post /us/sec/form-d-search/v1 Search every Form D filed with the SEC since 2008 (the notice a US company or fund files when it raises money privately) by free text over the issuer and its executives, directors and promoters, by issuer CIK, state, jurisdiction of incorporation, industry group, fund type, funds in or out, form type (new or amendment), filing-date window and minimum amount sold. Newest first, pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Sunbiz Entities Search Source: https://docs.usecroma.com/api-reference/united-states/sunbiz-entities-search /api-reference/openapi.json post /us/sunbiz/entities-search/v1 Search Florida's registry of business entities (Sunbiz, the Division of Corporations) by free text over the entity name, its officers and its registered agent, by name prefix, status (active/inactive), filing type (LLC, corporation, partnership, trust...), city and state of the principal address, FEI number, formation-date window and last-published date. Pages of up to 50. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`. # Sunbiz Entity by Document Number Source: https://docs.usecroma.com/api-reference/united-states/sunbiz-entity-by-document-number /api-reference/openapi.json post /us/sunbiz/entity/v1 Resolve one Florida business entity (Sunbiz, the Division of Corporations) by its document number and return the full record: status, filing type, addresses, formation date, FEI, annual reports, registered agent and officers. `found: false` when the registry has no entity with that number. Served by Croma (`as_of` says how current the data is), brought up to date daily. **Dataset endpoint**: answers from the whole source in milliseconds and carries `as_of`.