Conceptos básicos
Lo que necesitas entender una vez para manejar cualquier respuesta con seguridad.
Ocho conceptos sostienen toda la API. Cuando los conoces, lees bien cada respuesta y sabes de antemano lo que cuesta una solicitud.
Encontrar empresas sin ambigüedad
El parámetro q de fetch-organization acepta tres tipos de entrada. Los ejemplos de esta página son solicitudes para Hetzner Online GmbH, Ansbach HRB 6089:
| Entrada | Ejemplo | Cuándo encaja |
|---|---|---|
| Nombre de la empresa |
Hetzner Online GmbH |
Para empezar. Escribe el nombre tan completo como figura en el registro. |
| Tribunal registral y número de registro |
Ansbach HRB 6089 |
Único para cada empresa inscrita. Tribunal, tipo de registro y número van juntos. |
| entity_id |
94eb910fef13f94585c48c263fa446d4 |
Para solicitudes posteriores. La recibes en cada respuesta. |
El número de registro solo no basta, porque cada tribunal registral asigna sus propios números. El orden, en cambio, es libre: en el ejemplo, HRB 6089 Ansbach encuentra la misma empresa.
curl -G "https://handelsregister.ai/api/v1/fetch-organization" \ -H "x-api-key: TU_CLAVE_API" \ --data-urlencode 'q=Ansbach HRB 6089'
import requests response = requests.get( "https://handelsregister.ai/api/v1/fetch-organization", headers={"x-api-key": "TU_CLAVE_API"}, params={ "q": "Ansbach HRB 6089", }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/fetch-organization"); url.searchParams.append("q", "Ansbach HRB 6089"); const response = await fetch(url, { headers: { "x-api-key": "TU_CLAVE_API" }, }); const data = await response.json();
entity_id.
Si la API no encuentra ninguna empresa, responde con 404 y no cobra nada. Para entradas imprecisas está el modo IA (ai_search=on-default): encuentra la empresa también a partir de partes del nombre y la investiga en la web. Cuesta 20 créditos adicionales, aunque no encuentre ninguna empresa. Para obtener varios candidatos a la vez, usa Búsqueda y exportación.
Funciones
Cada perfil de empresa contiene los datos básicos, entre ellos nombre, forma jurídica, estado, inscripción registral, dirección, objeto social, sector, capital y reglas de representación. Todo lo demás lo pides como función (feature), por ejemplo related_persons para los administradores o financial_kpi para los KPI financieros.
Pasas varias funciones con un feature repetido o como lista: features=related_persons,financial_kpi. Cada función aparece en la respuesta bajo su propia clave. Solo publications se llama allí history.
curl -G "https://handelsregister.ai/api/v1/fetch-organization" \ -H "x-api-key: TU_CLAVE_API" \ --data-urlencode 'q=Hetzner Online GmbH' \ --data-urlencode 'feature=related_persons' \ --data-urlencode 'feature=financial_kpi'
import requests response = requests.get( "https://handelsregister.ai/api/v1/fetch-organization", headers={"x-api-key": "TU_CLAVE_API"}, params={ "q": "Hetzner Online GmbH", "feature": ["related_persons", "financial_kpi"], }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/fetch-organization"); url.searchParams.append("q", "Hetzner Online GmbH"); url.searchParams.append("feature", "related_persons"); url.searchParams.append("feature", "financial_kpi"); const response = await fetch(url, { headers: { "x-api-key": "TU_CLAVE_API" }, }); const data = await response.json();
La API ignora los nombres desconocidos sin mensaje de error, así que revisa la ortografía. Las funciones que tu plan no incluye se omiten y no se cobran.
Todas las funciones con sus precios están en fetch-organization, cada campo en el Catálogo de datos.
Créditos
Las solicitudes de datos cuestan créditos. Para un perfil de empresa rigen estas reglas:
- El precio base de 5 créditos se aplica cuando la API devuelve una empresa.
- Una función solo cuesta créditos cuando devuelve datos en la respuesta. Una función vacía es gratis, también
insolvency_publicationssin entradas. - Tiempo real y el modo IA no son funciones, sino recargos con reglas propias:
- Tiempo real cuesta 10 créditos adicionales en cuanto la consulta en directo tiene éxito. También cuando no muestra nada nuevo.
- El modo IA cuesta 20 créditos adicionales, aunque no encuentre ninguna empresa. El recargo solo se omite cuando la API interrumpe la solicitud con 408 porque tarda demasiado.
- Todos los demás errores no cuestan nada.
La regla de cada función está en Facturación, los precios en fetch-organization.
Un ejemplo: los datos básicos con related_persons y financial_kpi cuestan 5 + 2 + 1 = 8 créditos si ambas funciones devuelven datos.
Antes de cada solicitud, la API comprueba si tu saldo cubre el precio más alto posible. Si no, responde con 402 y no cobra nada. Lo que se cobró realmente está en meta.request_credit_cost, tu saldo después en meta.credits_remaining.
1{2 "meta": {3 "request_credit_cost": 5,4 "credits_remaining": 1455 }6}
Recibes créditos como créditos iniciales, cada mes con una suscripción de créditos o una vez como créditos de recarga. Sin suscripción de créditos, los créditos iniciales y de recarga son válidos durante 30 días; con una suscripción activa no caducan. Todo lo demás está en Facturación.
Datos actuales y Tiempo real
Por defecto, el perfil de empresa viene de nuestra base de datos. Lo actual que es un dato depende de su fuente.
Handelsregister
Mantenemos actualizados en nuestra base de datos los datos básicos, las personas y los anuncios registrales a partir del registro. Es rápido y basta para la mayoría de los usos.
Con Tiempo real (realtime_mode=handelsregister-default), la API obtiene en directo el Aktueller Abdruck (AD, extracto actual) del Handelsregister (Registro Mercantil) en el momento de tu solicitud y lo devuelve como JSON. Además recibes las personas inscritas actualmente en related_persons.current, sin pagar la función.
Si la consulta en directo funcionó lo indica _realtime_mode.status. Solo cobramos los 10 créditos de Tiempo real con success.
curl -G "https://handelsregister.ai/api/v1/fetch-organization" \ -H "x-api-key: TU_CLAVE_API" \ --data-urlencode 'q=Hetzner Online GmbH' \ --data-urlencode 'realtime_mode=handelsregister-default'
import requests response = requests.get( "https://handelsregister.ai/api/v1/fetch-organization", headers={"x-api-key": "TU_CLAVE_API"}, params={ "q": "Hetzner Online GmbH", "realtime_mode": "handelsregister-default", }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/fetch-organization"); url.searchParams.append("q", "Hetzner Online GmbH"); url.searchParams.append("realtime_mode", "handelsregister-default"); const response = await fetch(url, { headers: { "x-api-key": "TU_CLAVE_API" }, }); const data = await response.json();
1{2 "name": "Hetzner Online GmbH",3 "_realtime_mode": {4 "mode": "handelsregister-default",5 "status": "success"6 },7 "related_persons": {8 "current": [9 {10 "entity_id": "78ad32e16ff779f589a9e88d23356f74",11 "label": "MANAGING_DIRECTOR",12 "role": {13 "en": {14 "long": "Managing Director",15 "short": "MD"16 },17 "de": {18 "long": "Geschäftsführer",19 "short": "GF"20 }21 },22 "name": "Max Mustermann",23 "name_parts": {24 "given": "Max",25 "family": "Mustermann",26 "maiden": null,27 "canonical_name": "Mustermann, Max",28 "aliases": [29 "Mustermann, Max"30 ],31 "previous_names": null32 },33 "start_date": null,34 "end_date": null,35 "birth_date": "1976-01-15",36 "location": {37 "home": {38 "city": "Musterheim"39 }40 },41 "organization_representation_scheme": {42 "current": [43 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."44 ],45 "history": []46 },47 "role_representation_scheme": {48 "current": [49 "einzelvertretungsberechtigt",50 "mit der Befugnis, im Namen der Gesellschaft mit sich im eigenen Namen oder als Vertreter eines Dritten Rechtsgeschäfte abzuschließen"51 ],52 "history": []53 }54 },55 {56 "entity_id": "73549375ff7d709b9e7e2941ad1ffaa3",57 "label": "MANAGING_DIRECTOR",58 "role": {59 "en": {60 "long": "Managing Director",61 "short": "MD"62 },63 "de": {64 "long": "Geschäftsführer",65 "short": "GF"66 }67 },68 "name": "Paul Musterwald",69 "name_parts": {70 "given": "Paul",71 "family": "Musterwald",72 "maiden": null,73 "canonical_name": "Musterwald, Paul",74 "aliases": [75 "Musterwald, Paul"76 ],77 "previous_names": null78 },79 "start_date": null,80 "end_date": null,81 "birth_date": "1989-07-18",82 "location": {83 "home": {84 "city": "Probebrück"85 }86 },87 "organization_representation_scheme": {88 "current": [89 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."90 ],91 "history": []92 },93 "role_representation_scheme": {94 "current": [95 "einzelvertretungsberechtigt"96 ],97 "history": []98 }99 },100 {101 "entity_id": "cfecded2c1d17946c8ab0379aa786eed",102 "label": "MANAGING_DIRECTOR",103 "role": {104 "en": {105 "long": "Managing Director",106 "short": "MD"107 },108 "de": {109 "long": "Geschäftsführer",110 "short": "GF"111 }112 },113 "name": "Jan Musterhuber",114 "name_parts": {115 "given": "Jan",116 "family": "Musterhuber",117 "maiden": null,118 "canonical_name": "Musterhuber, Jan",119 "aliases": [120 "Musterhuber, Jan"121 ],122 "previous_names": null123 },124 "start_date": null,125 "end_date": null,126 "birth_date": "1955-11-06",127 "location": {128 "home": {129 "city": "Probeingen"130 }131 },132 "organization_representation_scheme": {133 "current": [134 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."135 ],136 "history": []137 },138 "role_representation_scheme": {139 "current": [140 "einzelvertretungsberechtigt"141 ],142 "history": []143 }144 }145 ]146 },147 "meta": {148 "request_credit_cost": 15,149 "credits_remaining": 145150 }151}
Si la consulta en directo falla, la API devuelve los datos guardados en nuestra base de datos. Lo reconoces en _realtime_mode.status, que entonces no es success. Tiempo real no se cobra en ese caso, como muestra también meta.request_credit_cost.
Tiempo real compensa cuando importa el estado de hoy. Por ejemplo, compruebas nuevos socios comerciales antes de firmar o ves quién puede representar a la empresa ahora mismo.
Cuentas anuales
Buscamos cada día cuentas anuales recién publicadas. Sin embargo, las empresas tienen hasta doce meses después del cierre del ejercicio para publicarlas (§ 325 HGB), y muchas agotan el plazo. Algunas incumplen deliberadamente el plazo legal y publican aún más tarde.
Por eso, las cuentas más recientes suelen ser las del penúltimo año. Más en Actualidad.
Publicaciones de insolvencia
Los tribunales de insolvencia suelen publicar sus anuncios el día de la resolución o poco después. Los obtienes con la función insolvency_publications, cada uno con tribunal, número de expediente y fecha.
Noticias
La función news devuelve noticias de la web sobre la empresa, con título, fuente, fecha y enlace. Lo actuales que sean depende de cuándo se informó por última vez sobre la empresa. Para empresas pequeñas suele haber pocas noticias que encajen.
Historial y vigencia
Muchos datos cambian con el tiempo. Por eso la API devuelve el estado actual y el historial uno junto a otro:
currentes el estado a día de hoy.historyenumera cada estado inscrito coneffective_fromyeffective_to. Sieffective_toesnull, el estado sigue vigente hoy.- Las personas están en
related_persons.currentyrelated_persons.past, cada una constart_dateyend_date.
Cada dato con historial procede de los registros y las publicaciones, por ejemplo del Chronologischer Abdruck (CD, extracto cronológico) del Handelsregister o de todas las cuentas anuales publicadas.
Así se ve en nuestro ejemplo para las reglas de representación de Hetzner Online GmbH. En la respuesta de ejemplo nombran al consejo de dirección hasta el 28 de julio de 2015 y a los administradores desde entonces:
1{2 "representation_scheme": {3 "current": [4 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."5 ],6 "history": [7 {8 "value": [9 "Ist nur ein Vorstandsmitglied bestellt, so vertritt es die Gesellschaft allein. Sind mehrere Vorstandsmitglieder bestellt, so wird die Gesellschaft durch zwei Vorstandsmitglieder oder durch ein Vorstandsmitglied gemeinsam mit einem Prokuristen vertreten."10 ],11 "effective_from": "2002-10-15",12 "effective_to": "2015-07-28"13 },14 {15 "value": [16 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."17 ],18 "effective_from": "2015-07-28",19 "effective_to": null20 }21 ]22 }23}
La mayoría de las fechas vienen en el formato YYYY-MM-DD. Hasta dónde se remonta el historial se describe en Antigüedad e historial.
Valores vacíos
No todas las empresas tienen un valor para cada campo. La API lo muestra de dos maneras:
null: no hay valor para este campo.[]: la lista no tiene entradas, por ejemplo ningún anuncio de insolvencia.
Una función solicitada sin datos llega como null o [] y no cuesta nada.
1{2 "name": "dm-drogerie markt GmbH + Co. KG",3 "legal_form": "GmbH & Co. KG",4 "contact_data": {5 "website": "https://www.dm.de",6 "phone_number": "+49 721 55920",7 "email": null8 },9 "capital": {10 "current": null,11 "history": []12 },13 "mergers_and_acquisitions": null,14 "insolvency_publications": []15}
En tu código, trata igual una clave ausente, null y [], porque algunos objetos vacíos llegan como []. Lee además los campos por su nombre, porque el orden de las claves no es fijo.
Si falta un valor, normalmente la empresa ni siquiera está obligada a publicarlo. Lo que exige la ley según forma jurídica y tamaño se describe en Disponibilidad de datos. Algunos datos los retenemos deliberadamente; llevan entonces redacted: true.
Estabilidad y versiones
La API crece de forma aditiva. Los nuevos datos y funciones llegan como campos nuevos. Nunca eliminamos campos existentes, no los renombramos y no cambiamos ni su tipo ni su significado. Así cada versión sigue siendo compatible con la anterior.
Los cambios que romperían código existente solo llegan en una nueva versión de la API, por ejemplo en /v2. La versión actual funciona en /v1.
Por eso, haz que tu cliente ignore los campos desconocidos y trate los valores desconocidos como un caso general. Los campos y funciones nuevos aparecen en el Changelog.
Planes
Puedes usar Perfil de empresa, Documentos, Búsqueda y exportación y Signals con cualquier cuenta, incluso sin suscripción de créditos. Una suscripción de créditos trae créditos nuevos cada mes y desbloquea más datos:
| Qué obtienes además | Plus | Pro | Max |
|---|---|---|---|
| Perfil de persona: Cargos y participaciones de personas | incluido | incluido | incluido |
| Búsqueda y exportación: Filtros por propiedad, dirección e insolvencia | no incluido | incluido | incluido |
| Perfil de empresa: Más de 90 cifras financieras ampliadas | no incluido | incluido | incluido |
| Perfil de empresa: Cuentas por actividad de empresas energéticas (§ 6b EnWG) | no incluido | no incluido | incluido |
Perfil de empresa: Socios en profundidad (shareholders_deep) |
no incluido | no incluido | incluido |
Red de empresas (network) |
no incluido | incluido | incluido |
| Signals: Insolvencias | no incluido | incluido | incluido |
| Signals: Transformaciones y M&A | no incluido | no incluido | incluido |
La API omite sin error las funciones fuera de tu plan y no las cobra. Rechaza con 403 los perfiles de persona y los filtros de búsqueda fuera de tu plan, también sin coste. En Signals esto aplica a los temas que pides explícitamente; sin ellos, simplemente recibes todos los temas de tu plan.
Los precios y créditos de los planes están en la página de precios.