@firmenakte/api-client 2.11.8 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +27 -0
  2. package/client.d.ts +1256 -1084
  3. package/client.d.ts.map +1 -1
  4. package/client.js +247 -224
  5. package/index.d.ts +82 -79
  6. package/index.d.ts.map +1 -1
  7. package/keyfigure-labels.d.ts +10 -6
  8. package/keyfigure-labels.d.ts.map +1 -1
  9. package/keyfigure-labels.js +10 -6
  10. package/package.json +13 -2
  11. package/v2/generated/client/client.gen.d.ts +3 -0
  12. package/v2/generated/client/client.gen.d.ts.map +1 -0
  13. package/v2/generated/client/client.gen.js +220 -0
  14. package/v2/generated/client/index.d.ts +11 -0
  15. package/v2/generated/client/index.d.ts.map +1 -0
  16. package/v2/generated/client/index.js +17 -0
  17. package/v2/generated/client/types.gen.d.ts +121 -0
  18. package/v2/generated/client/types.gen.d.ts.map +1 -0
  19. package/v2/generated/client/types.gen.js +3 -0
  20. package/v2/generated/client/utils.gen.d.ts +38 -0
  21. package/v2/generated/client/utils.gen.d.ts.map +1 -0
  22. package/v2/generated/client/utils.gen.js +241 -0
  23. package/v2/generated/client.gen.d.ts +13 -0
  24. package/v2/generated/client.gen.d.ts.map +1 -0
  25. package/v2/generated/client.gen.js +6 -0
  26. package/v2/generated/core/auth.gen.d.ts +26 -0
  27. package/v2/generated/core/auth.gen.d.ts.map +1 -0
  28. package/v2/generated/core/auth.gen.js +18 -0
  29. package/v2/generated/core/bodySerializer.gen.d.ts +26 -0
  30. package/v2/generated/core/bodySerializer.gen.d.ts.map +1 -0
  31. package/v2/generated/core/bodySerializer.gen.js +60 -0
  32. package/v2/generated/core/params.gen.d.ts +44 -0
  33. package/v2/generated/core/params.gen.d.ts.map +1 -0
  34. package/v2/generated/core/params.gen.js +112 -0
  35. package/v2/generated/core/pathSerializer.gen.d.ts +34 -0
  36. package/v2/generated/core/pathSerializer.gen.d.ts.map +1 -0
  37. package/v2/generated/core/pathSerializer.gen.js +115 -0
  38. package/v2/generated/core/queryKeySerializer.gen.d.ts +19 -0
  39. package/v2/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  40. package/v2/generated/core/queryKeySerializer.gen.js +98 -0
  41. package/v2/generated/core/serverSentEvents.gen.d.ts +72 -0
  42. package/v2/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  43. package/v2/generated/core/serverSentEvents.gen.js +135 -0
  44. package/v2/generated/core/types.gen.d.ts +84 -0
  45. package/v2/generated/core/types.gen.d.ts.map +1 -0
  46. package/v2/generated/core/types.gen.js +3 -0
  47. package/v2/generated/core/utils.gen.d.ts +20 -0
  48. package/v2/generated/core/utils.gen.d.ts.map +1 -0
  49. package/v2/generated/core/utils.gen.js +93 -0
  50. package/v2/generated/index.d.ts +3 -0
  51. package/v2/generated/index.d.ts.map +1 -0
  52. package/v2/generated/index.js +6 -0
  53. package/v2/generated/sdk.gen.d.ts +674 -0
  54. package/v2/generated/sdk.gen.d.ts.map +1 -0
  55. package/v2/generated/sdk.gen.js +1433 -0
  56. package/v2/generated/types.gen.d.ts +9439 -0
  57. package/v2/generated/types.gen.d.ts.map +1 -0
  58. package/v2/generated/types.gen.js +3 -0
  59. package/v2/index.d.ts +46 -0
  60. package/v2/index.d.ts.map +1 -0
  61. package/v2/index.js +80 -0
package/client.js CHANGED
@@ -11,7 +11,14 @@
11
11
  * ---------------------------------------------------------------
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.Api = exports.HttpClient = exports.ContentType = exports.BusinessExportFormat = exports.ChangeType = exports.InsolvencyCourtEventType = exports.InsolvencyEvidenceStatus = void 0;
14
+ exports.Api = exports.HttpClient = exports.ContentType = exports.BusinessExportFormat = exports.ChangeType = exports.InsolvencyCourtEventType = exports.InsolvencyEvidenceStatus = exports.PassivpostenNach = void 0;
15
+ /** The standard Passiva position a WeitererPassivposten follows in the filing. */
16
+ var PassivpostenNach;
17
+ (function (PassivpostenNach) {
18
+ PassivpostenNach["Eigenkapital"] = "eigenkapital";
19
+ PassivpostenNach["Rueckstellungen"] = "rueckstellungen";
20
+ PassivpostenNach["Verbindlichkeiten"] = "verbindlichkeiten";
21
+ })(PassivpostenNach || (exports.PassivpostenNach = PassivpostenNach = {}));
15
22
  /** Conservative Firmenbuch evidence state: open, closed, absent, uncertain or conflicting. Conflicting means a known court closure and an active administrator role coexist. Absent means no classified court event and no active role, not certified solvency. */
16
23
  var InsolvencyEvidenceStatus;
17
24
  (function (InsolvencyEvidenceStatus) {
@@ -207,7 +214,7 @@ class HttpClient {
207
214
  }
208
215
  exports.HttpClient = HttpClient;
209
216
  /**
210
- * @title UnternehmensScreener API
217
+ * @title Firmenakte API
211
218
  * @version v1
212
219
  * @baseUrl https://api.firmenakte.at
213
220
  */
@@ -530,173 +537,6 @@ class Api extends HttpClient {
530
537
  format: "json",
531
538
  ...params,
532
539
  }),
533
- /**
534
- * @description The autocomplete read: /businesses and /people for one term, ranked together, so a search field costs one request per keystroke rather than two and does not have to merge two orders itself. Each row carries either business or person, whichever type names. Ordered by where the term sits in the name, then by the shorter name, then companies before people. pageSize is per side, so the answer holds up to twice as many rows. An empty search answers an empty list; use /businesses to page through the whole dataset. Kostet 1 Credit.
535
- *
536
- * @tags Search
537
- * @name V1SearchList
538
- * @summary Companies and people in one ranked list
539
- * @request GET:/api/v1/search
540
- * @secure
541
- */
542
- v1SearchList: (query, params = {}) => this.request({
543
- path: `/api/v1/search`,
544
- method: "GET",
545
- query: query,
546
- secure: true,
547
- format: "json",
548
- ...params,
549
- }),
550
- /**
551
- * @description Returns (id, name) pairs for all people with at least one business assignment. For client-side name index. Kostet 1 Credit.
552
- *
553
- * @tags People
554
- * @name V1PeopleNamesList
555
- * @summary Person name index
556
- * @request GET:/api/v1/people/names
557
- * @secure
558
- */
559
- v1PeopleNamesList: (params = {}) => this.request({
560
- path: `/api/v1/people/names`,
561
- method: "GET",
562
- secure: true,
563
- format: "json",
564
- ...params,
565
- }),
566
- /**
567
- * @description Lists people who hold a function in, or a GISA licence for, an Austrian company. name and search behave identically here — both split the term on spaces and keep people whose "firstName lastName" contains every token, case-insensitively — except that search wins when both are given. Ordered by last name, then first name unless orderBy says otherwise. Combine with fnr or businessName to get the officers of one company, or with functionCode for one role. fnr, functionCode, businessName, businessCity and businessRegisteredSince_gte all describe one and the same assignment: a person comes back only if a single company of theirs satisfies every one of them. So the youngest owners of this year's new Viennese companies are one page: ?businessCity=Wien&businessRegisteredSince_gte=2026-01-01&functionCode=IN&functionCode=KP&functionCode=GS&functionCode=PG&orderBy=birthDate&orderByDescending=true&pageSize=3 A row's assignments are a sample, not the person's whole collection: at most 25, and only the ones matching the fnr, functionCode, businessName, businessCity and businessRegisteredSince_gte you sent, so ?fnr=34853f gives you that company's row and nothing else. Ask GET /people/{personId} for all of them. Kostet 1 Credit.
568
- *
569
- * @tags People
570
- * @name V1PeopleList
571
- * @summary People search
572
- * @request GET:/api/v1/people
573
- * @secure
574
- */
575
- v1PeopleList: (query, params = {}) => this.request({
576
- path: `/api/v1/people`,
577
- method: "GET",
578
- query: query,
579
- secure: true,
580
- format: "json",
581
- ...params,
582
- }),
583
- /**
584
- * @description Returns one person with every company function, GISA licence and Edikt attached to them. personId is the synthetic id described in the glossary — "firstname-lastname-birthdate", lower case, inner spaces replaced by hyphens and "x" for a part the register does not give, e.g. "max-mustermann-1970-01-01". It is matched exactly. Take it from a list row or from an assignment on a company rather than composing it yourself. An id beginning with "--" carries neither first nor last name, and that is not a person but the bucket every nameless assignment in the register lands in. It answers 404 like any id nobody holds, and it is left out of GET /people for the same reason. Kostet 1 Credit.
585
- *
586
- * @tags People
587
- * @name V1PeopleDetail
588
- * @summary Person detail
589
- * @request GET:/api/v1/people/{personId}
590
- * @secure
591
- */
592
- v1PeopleDetail: (personId, params = {}) => this.request({
593
- path: `/api/v1/people/${personId}`,
594
- method: "GET",
595
- secure: true,
596
- format: "json",
597
- ...params,
598
- }),
599
- /**
600
- * @description Returns the OeNACE classification catalog with company counts. Results are ordered by company count descending — most used first. Kostet 1 Credit.
601
- *
602
- * @tags Oenace
603
- * @name V1OenaceList
604
- * @summary OeNACE classification catalog
605
- * @request GET:/api/v1/oenace
606
- * @secure
607
- */
608
- v1OenaceList: (query, params = {}) => this.request({
609
- path: `/api/v1/oenace`,
610
- method: "GET",
611
- query: query,
612
- secure: true,
613
- format: "json",
614
- ...params,
615
- }),
616
- /**
617
- * @description Returns all legal forms with pagination and optional search, sorted by business count descending. Kostet 1 Credit.
618
- *
619
- * @tags LegalForms
620
- * @name V1LegalformsList
621
- * @summary Legal form catalog
622
- * @request GET:/api/v1/legalforms
623
- * @secure
624
- */
625
- v1LegalformsList: (query, params = {}) => this.request({
626
- path: `/api/v1/legalforms`,
627
- method: "GET",
628
- query: query,
629
- secure: true,
630
- format: "json",
631
- ...params,
632
- }),
633
- /**
634
- * @description Returns the graph (nodes and edges) within 2 hops of the start entity. Exactly one of personId or fnr must be provided. The network of people and companies around one starting point — who sits on which board with whom. nodes are people ("person") and companies ("business"), each carrying the id you would pass to /people/{personId} or /businesses/{fnr}; edges are source/target pairs of those ids whose relationshipType is "assignment", a person holding a function in a company. Two further edge types the deployment can enable: "address", two companies registered at the same street address, and "ownership", a company holding shares in another — source is the shareholder, target the company it holds, and capitalAmount, currency and sharePercent carry the stake where the register gives one. Ownership edges are drawn only for companies crawled since the shareholder mapping went live, so a company not yet re-crawled reports none rather than implying it has none. The traversal depth is fixed at 2 hops and is not a parameter — a node with further connections outside that boundary carries hasMore=true, and isCentralNode marks the entity you started from. personId and fnr are mutually exclusive, not combinable: supplying both, or neither, is a 400, and an id that exists in neither register is a 404. Kostet 3 Credits.
635
- *
636
- * @tags Graph
637
- * @name V1GraphList
638
- * @summary Relationship graph
639
- * @request GET:/api/v1/graph
640
- * @secure
641
- */
642
- v1GraphList: (query, params = {}) => this.request({
643
- path: `/api/v1/graph`,
644
- method: "GET",
645
- query: query,
646
- secure: true,
647
- format: "json",
648
- ...params,
649
- }),
650
- /**
651
- * @description The single feed of every change across all registers — Firmenbuch, GISA, Ediktsdatei and the BMF Scheinunternehmen list — as lightweight reference rows. Each row carries only id, fnr, changeType and the dates; fetch the payload with GET /globalchanges/{id}, or poll one register's typed feed instead (/businesses/changes, /documents/changes, /edikte/changes, /trades/changes). Ordered by ascending id, and that id is the cursor: request with sinceId set to the highest id you have stored, walk page=1,2,… at a fixed pageSize until a page comes back with fewer than pageSize rows, keep the highest id you saw, and start the next poll from it. sinceId is exclusive, so nothing is delivered twice, and a new change always takes a higher id than every change already in the feed, so it appends to the end and never shifts a page you have already read. since is inclusive, filters on when we recorded the change rather than on changedDate, and applies together with sinceId when both are sent. Paging without sinceId is not a reliable feed: an offset is not a watermark, and page stops at 1000. totalRecords stops there too — it is counted only as far as page 1000 reaches, so it caps at 1000 × pageSize and means "at least this many" once it is that; stop on a short page, not on a count. Under concurrent writes a change can become visible just after a higher id, so a consumer that must not miss one resumes from the previous poll's watermark and de-duplicates by id. Kostet 1 Credit.
652
- *
653
- * @tags GlobalChanges
654
- * @name V1GlobalchangesList
655
- * @summary All-register change feed
656
- * @request GET:/api/v1/globalchanges
657
- * @secure
658
- */
659
- v1GlobalchangesList: (query, params = {}) => this.request({
660
- path: `/api/v1/globalchanges`,
661
- method: "GET",
662
- query: query,
663
- secure: true,
664
- format: "json",
665
- ...params,
666
- }),
667
- /**
668
- * @description Changes for a watchlist of companies, all four change types in one unpaged response. Built for watchlist polling: pass up to 1000 fnr values (repeat the parameter) and one cursor, and get back four arrays — businessChanges, documentChanges, ediktChanges, globalChanges — each ordered by ascending id and capped at maxResultsPerType. Not paged: raise maxResultsPerType or advance sinceId instead. sinceId is exclusive and since is inclusive, exactly as on the paged feeds, but one sinceId covers all four arrays: an array that comes back full at maxResultsPerType has more behind it and bounds the cursor, so advance sinceId only to the lowest of the full arrays' highest ids, and to the highest id of all four once none comes back full. Passing no fnr returns four empty arrays, not the whole feed. Kostet 3 Credits.
669
- *
670
- * @tags GlobalChanges
671
- * @name V1GlobalchangesAggregatedList
672
- * @summary Aggregated watchlist changes
673
- * @request GET:/api/v1/globalchanges/aggregated
674
- * @secure
675
- */
676
- v1GlobalchangesAggregatedList: (query, params = {}) => this.request({
677
- path: `/api/v1/globalchanges/aggregated`,
678
- method: "GET",
679
- query: query,
680
- secure: true,
681
- format: "json",
682
- ...params,
683
- }),
684
- /**
685
- * @description Returns one change with its typed payload, whichever register it came from. The envelope is a discriminator plus the payload: changeType says which register, and data is the matching object — a BusinessChange, DocumentChange, EdiktChange, GisaChange, FoerderungChange or ScheinunternehmenChange. Since data is a union, read changeType before it. Kostet 1 Credit.
686
- *
687
- * @tags GlobalChanges
688
- * @name V1GlobalchangesDetail
689
- * @summary Change by id
690
- * @request GET:/api/v1/globalchanges/{id}
691
- * @secure
692
- */
693
- v1GlobalchangesDetail: (id, params = {}) => this.request({
694
- path: `/api/v1/globalchanges/${id}`,
695
- method: "GET",
696
- secure: true,
697
- format: "json",
698
- ...params,
699
- }),
700
540
  /**
701
541
  * @description Kostet 1 Credit.
702
542
  *
@@ -764,47 +604,32 @@ class Api extends HttpClient {
764
604
  ...params,
765
605
  }),
766
606
  /**
767
- * @description Downloads a Firmenbuch document (PDF/XML) by its document key. Kostet 3 Credits.
768
- *
769
- * @tags Documents
770
- * @name V1DocumentsDownloadDetail
771
- * @summary Firmenbuch document download
772
- * @request GET:/api/v1/documents/download/{documentKey}
773
- * @secure
774
- */
775
- v1DocumentsDownloadDetail: (documentKey, params = {}) => this.request({
776
- path: `/api/v1/documents/download/${documentKey}`,
777
- method: "GET",
778
- secure: true,
779
- ...params,
780
- }),
781
- /**
782
- * @description Returns one document change by id, with the document's metadata. The id is the shared change id from GET /globalchanges, so an id that exists but whose changeType is not "document" answers 404 here. Kostet 1 Credit.
607
+ * @description Returns (id, name) pairs for all people with at least one business assignment. For client-side name index. id is the person's Firmenakte-ID, e.g. "P-7K3M-QX91". Kostet 1 Credit.
783
608
  *
784
- * @tags Documents
785
- * @name V1DocumentsChangesDetail
786
- * @summary Document change by id
787
- * @request GET:/api/v1/documents/changes/{id}
609
+ * @tags People
610
+ * @name V1PeopleNamesList
611
+ * @summary Person name index
612
+ * @request GET:/api/v1/people/names
788
613
  * @secure
789
614
  */
790
- v1DocumentsChangesDetail: (id, params = {}) => this.request({
791
- path: `/api/v1/documents/changes/${id}`,
615
+ v1PeopleNamesList: (params = {}) => this.request({
616
+ path: `/api/v1/people/names`,
792
617
  method: "GET",
793
618
  secure: true,
794
619
  format: "json",
795
620
  ...params,
796
621
  }),
797
622
  /**
798
- * @description Feed of newly filed Firmenbuch documents — this is how you learn that a company has published a new Jahresabschluss. Each entry names a documentKey; fetch the file itself with GET /documents/download/{documentKey}. Ordered by ascending id, and that id is the cursor: request with sinceId set to the highest id you have stored, walk page=1,2,… at a fixed pageSize until a page comes back with fewer than pageSize rows, keep the highest id you saw, and start the next poll from it. sinceId is exclusive, so nothing is delivered twice, and a new change always takes a higher id than every change already in the feed, so it appends to the end and never shifts a page you have already read. since is inclusive, filters on when we recorded the change rather than on the document date, and applies together with sinceId when both are sent. Paging without sinceId is not a reliable feed: an offset is not a watermark, and page stops at 1000. totalRecords stops there too — it is counted only as far as page 1000 reaches, so it caps at 1000 × pageSize and means "at least this many" once it is that; stop on a short page, not on a count. Under concurrent writes a change can become visible just after a higher id, so a consumer that must not miss one resumes from the previous poll's watermark and de-duplicates by id. fnr is normalised before matching — trimmed, spaces and leading zeros removed, case left alone — so 034853 f and 34853f are the same company, exactly as on GET /businesses. Kostet 1 Credit.
623
+ * @description Lists people who hold a function in, or a GISA licence for, an Austrian company. name and search behave identically here — both split the term on spaces and keep people whose "firstName lastName" contains every token, case-insensitively — except that search wins when both are given. Ordered by last name, then first name. Combine with fnr or businessName to get the officers of one company, or with functionCode for one role. Each row's id is the person's Firmenakte-ID, the id GET /people/{personId} takes. fnr, functionCode, businessName, businessCity and businessRegisteredSince_gte all describe one and the same assignment: a person comes back only if a single company of theirs satisfies every one of them. So the owners of this year's new Viennese companies are one query: ?businessCity=Wien&businessRegisteredSince_gte=2026-01-01&functionCode=IN&functionCode=KP&functionCode=GS&functionCode=PG A row's assignments are a sample, not the person's whole collection: at most 25, and only the ones matching the fnr, functionCode, businessName, businessCity and businessRegisteredSince_gte you sent, so ?fnr=34853f gives you that company's row and nothing else. Ask GET /people/{personId} for all of them. Kostet 1 Credit.
799
624
  *
800
- * @tags Documents
801
- * @name V1DocumentsChangesList
802
- * @summary Document change feed
803
- * @request GET:/api/v1/documents/changes
625
+ * @tags People
626
+ * @name V1PeopleList
627
+ * @summary People search
628
+ * @request GET:/api/v1/people
804
629
  * @secure
805
630
  */
806
- v1DocumentsChangesList: (query, params = {}) => this.request({
807
- path: `/api/v1/documents/changes`,
631
+ v1PeopleList: (query, params = {}) => this.request({
632
+ path: `/api/v1/people`,
808
633
  method: "GET",
809
634
  query: query,
810
635
  secure: true,
@@ -812,18 +637,17 @@ class Api extends HttpClient {
812
637
  ...params,
813
638
  }),
814
639
  /**
815
- * @description Returns all courts with pagination and optional search, sorted by business count descending. Kostet 1 Credit.
640
+ * @description Returns one person with every company function, GISA licence and Edikt attached to them. personId is the person's Firmenakte-ID as the glossary describes it, e.g. "P-7K3M-QX91", the id every list row, assignment and graph node carries. Take it from there rather than composing it yourself. Only that spelling answers. Any other spelling of the same Firmenakte-ID ("p7k3mqx91"), and the "vorname-nachname-…" id people carried before, answer one 308 whose relative Location is the canonical form. A Firmenakte-ID with a wrong check character, and an id nobody holds, answer 404; so does the bucket every nameless assignment in the register lands in, which is not a person. Kostet 1 Credit.
816
641
  *
817
- * @tags Courts
818
- * @name V1CourtsList
819
- * @summary Court catalog
820
- * @request GET:/api/v1/courts
642
+ * @tags People
643
+ * @name V1PeopleDetail
644
+ * @summary Person detail
645
+ * @request GET:/api/v1/people/{personId}
821
646
  * @secure
822
647
  */
823
- v1CourtsList: (query, params = {}) => this.request({
824
- path: `/api/v1/courts`,
648
+ v1PeopleDetail: (personId, params = {}) => this.request({
649
+ path: `/api/v1/people/${personId}`,
825
650
  method: "GET",
826
- query: query,
827
651
  secure: true,
828
652
  format: "json",
829
653
  ...params,
@@ -847,7 +671,7 @@ class Api extends HttpClient {
847
671
  ...params,
848
672
  }),
849
673
  /**
850
- * @description Lists companies matching the filters, one page of list rows per call. name and search are different tools. name is a case-insensitive substring match on the company name and nothing else. search splits the term on spaces and keeps only companies matching every token, where a token matches the name, the fnr, or — when the whole term is a number — a GISA licence key or GISA-Zahl; it additionally lifts companies whose name starts with the term to the top of the default (name) ordering. So name narrows a known name, search finds an unknown one. Inactive companies always sort after active ones, whatever orderBy says. inInsolvency is a Firmenbuch evidence filter, not an Ediktsdatei or Insolvenzdatei one. True matches a classified open court record or an active administrator role (MW, IW, AW, VW). False includes closed evidence without an active role, missing evidence and unclassified or uncertain evidence without another opening or role. Omit the parameter to leave this state unfiltered. A false value means no current positive evidence in this dataset, not verified legal assurance that no proceeding exists. The proceedings are published in the Insolvenzdatei, which this API does not read. Examples: ?inInsolvency=true; ?inInsolvency=false&name=Graf; ?inInsolvency=true&countOnly=true. The same values combine with every other filter. Pass countOnly=true for totalRecords without the rows, and use /businesses/aggregate to group the same filter set instead of paging through it. Kostet 1 Credit.
674
+ * @description Lists companies matching the filters, one page of list rows per call. name and search are different tools. name is a case-insensitive substring match on the company name and nothing else. search splits the term on spaces and keeps only companies matching every token, where a token matches the name, the fnr, or — when the whole term is a number — a GISA licence key or GISA-Zahl; it additionally lifts companies whose name starts with the term to the top of the default (name) ordering. So name narrows a known name, search finds an unknown one. Inactive companies always sort after active ones, whatever orderBy says. inInsolvency is a Firmenbuch evidence filter, not an Ediktsdatei or Insolvenzdatei one. True matches a classified open court record or an active administrator role (MW, IW, AW, VW). False includes closed evidence without an active role, missing evidence and unclassified or uncertain evidence without another opening or role. Omit the parameter to leave this state unfiltered. A false value means no current positive evidence in this dataset, not verified legal assurance that no proceeding exists. The proceedings are published in the Insolvenzdatei, which this API does not read. Examples: ?inInsolvency=true; ?inInsolvency=false&name=Graf; ?inInsolvency=true&countOnly=true. The same values combine with every other filter. Pass countOnly=true for totalRecords without the rows, and use /businesses/aggregate to group the same filter set instead of paging through it. Place filters: the Firmenbuch records no Bundesland and no Gemeinde, only the Sitzgericht, so both state and gemeinde are derived from the PLZ of the Geschäftsanschrift: the PLZ names a Gemeinde, and state is that Gemeinde's Land, so the Innviertel PLZ 5120–5399 are in Oberösterreich. gemeinde takes the slug of a Gemeinde, and because it reads the PLZ it answers every spelling of a place at once — "Klagenfurt am Wörthersee", "Klagenfurt" and "Klagenfurt-Viktring" are one Gemeinde, where city= would be three separate filters over free text. GET /addresses/gemeinden is the catalogue of the slugs, their aliases, their Bundesland and their PLZ; a company with a foreign or unusable PLZ is in no Gemeinde and no gemeinde= filter finds it. Kostet 1 Credit.
851
675
  *
852
676
  * @tags Businesses
853
677
  * @name V1BusinessesList
@@ -979,7 +803,7 @@ class Api extends HttpClient {
979
803
  ...params,
980
804
  }),
981
805
  /**
982
- * @description Every parsed Jahresabschluss of one company, one entry per calendar year, newest first. The Firmenakte itself (GET /businesses/{fnr}) carries only the last five years. 404 only where the company itself is unknown, exactly as on GET /businesses/{fnr}. Kostet 1 Credit.
806
+ * @description Every parsed Jahresabschluss of one company, one entry per fiscal closing date, newest first. The Firmenakte itself (GET /businesses/{fnr}) carries only the last five periods. 404 only where the company itself is unknown, exactly as on GET /businesses/{fnr}. Kostet 1 Credit.
983
807
  *
984
808
  * @tags Businesses
985
809
  * @name V1BusinessesJahresabschluesseList
@@ -1043,22 +867,6 @@ class Api extends HttpClient {
1043
867
  format: "json",
1044
868
  ...params,
1045
869
  }),
1046
- /**
1047
- * @description Returns all assignment functions (code/text lookup) for display. Cached 24h. Kostet 1 Credit.
1048
- *
1049
- * @tags AssignmentFunctions
1050
- * @name V1AssignmentfunctionsList
1051
- * @summary Assignment function catalog
1052
- * @request GET:/api/v1/assignmentfunctions
1053
- * @secure
1054
- */
1055
- v1AssignmentfunctionsList: (params = {}) => this.request({
1056
- path: `/api/v1/assignmentfunctions`,
1057
- method: "GET",
1058
- secure: true,
1059
- format: "json",
1060
- ...params,
1061
- }),
1062
870
  /**
1063
871
  * @description Returns unique City+ZipCode combinations from addresses with pagination and optional search. Kostet 1 Credit.
1064
872
  *
@@ -1127,6 +935,221 @@ class Api extends HttpClient {
1127
935
  format: "json",
1128
936
  ...params,
1129
937
  }),
938
+ /**
939
+ * @description The Gemeinde catalogue: one row per Austrian Gemeinde the register can address, with its official name, its URL slug, its Bundesland and that Land's slug, the PLZ that resolve to it, the alias slugs that name it and, for Wien, its Bezirke. This is the one source for a place's identity. The city column of an address is Firmenbuch free text and carries "Klagenfurt am Wörthersee", "Klagenfurt", "Klagenfurt-Viktring" and "Klagenfurt-Wölfnitz" side by side, so it cannot be a key; a Gemeinde is derived from the PLZ of the Geschäftsanschrift instead, and GET /businesses?gemeinde=<slug> answers every one of those spellings at once. Fold the zipCode buckets of GET /businesses/aggregate through zipCodes to count companies per Gemeinde. Unpaged and without a filter on purpose: 1.893 rows that change only with a new Gebietsstand, so one cacheable answer is cheaper for every caller than paging a list they all want whole. Companies with a foreign or unusable PLZ resolve to no Gemeinde and appear under none. Kostet 1 Credit.
940
+ *
941
+ * @tags Addresses
942
+ * @name V1AddressesGemeindenList
943
+ * @summary Gemeinden
944
+ * @request GET:/api/v1/addresses/gemeinden
945
+ * @secure
946
+ */
947
+ v1AddressesGemeindenList: (params = {}) => this.request({
948
+ path: `/api/v1/addresses/gemeinden`,
949
+ method: "GET",
950
+ secure: true,
951
+ format: "json",
952
+ ...params,
953
+ }),
954
+ /**
955
+ * @description Downloads a Firmenbuch document (PDF/XML) by its document key. Kostet 3 Credits.
956
+ *
957
+ * @tags Documents
958
+ * @name V1DocumentsDownloadDetail
959
+ * @summary Firmenbuch document download
960
+ * @request GET:/api/v1/documents/download/{documentKey}
961
+ * @secure
962
+ */
963
+ v1DocumentsDownloadDetail: (documentKey, params = {}) => this.request({
964
+ path: `/api/v1/documents/download/${documentKey}`,
965
+ method: "GET",
966
+ secure: true,
967
+ ...params,
968
+ }),
969
+ /**
970
+ * @description Returns one document change by id, with the document's metadata. The id is the shared change id from GET /globalchanges, so an id that exists but whose changeType is not "document" answers 404 here. Kostet 1 Credit.
971
+ *
972
+ * @tags Documents
973
+ * @name V1DocumentsChangesDetail
974
+ * @summary Document change by id
975
+ * @request GET:/api/v1/documents/changes/{id}
976
+ * @secure
977
+ */
978
+ v1DocumentsChangesDetail: (id, params = {}) => this.request({
979
+ path: `/api/v1/documents/changes/${id}`,
980
+ method: "GET",
981
+ secure: true,
982
+ format: "json",
983
+ ...params,
984
+ }),
985
+ /**
986
+ * @description Feed of newly filed Firmenbuch documents — this is how you learn that a company has published a new Jahresabschluss. Each entry names a documentKey; fetch the file itself with GET /documents/download/{documentKey}. Ordered by ascending id, and that id is the cursor: request with sinceId set to the highest id you have stored, walk page=1,2,… at a fixed pageSize until a page comes back with fewer than pageSize rows, keep the highest id you saw, and start the next poll from it. sinceId is exclusive, so nothing is delivered twice, and a new change always takes a higher id than every change already in the feed, so it appends to the end and never shifts a page you have already read. since is inclusive, filters on when we recorded the change rather than on the document date, and applies together with sinceId when both are sent. Paging without sinceId is not a reliable feed: an offset is not a watermark, and page stops at 1000. totalRecords stops there too — it is counted only as far as page 1000 reaches, so it caps at 1000 × pageSize and means "at least this many" once it is that; stop on a short page, not on a count. Under concurrent writes a change can become visible just after a higher id, so a consumer that must not miss one resumes from the previous poll's watermark and de-duplicates by id. fnr is normalised before matching — trimmed, spaces and leading zeros removed, case left alone — so 034853 f and 34853f are the same company, exactly as on GET /businesses. Kostet 1 Credit.
987
+ *
988
+ * @tags Documents
989
+ * @name V1DocumentsChangesList
990
+ * @summary Document change feed
991
+ * @request GET:/api/v1/documents/changes
992
+ * @secure
993
+ */
994
+ v1DocumentsChangesList: (query, params = {}) => this.request({
995
+ path: `/api/v1/documents/changes`,
996
+ method: "GET",
997
+ query: query,
998
+ secure: true,
999
+ format: "json",
1000
+ ...params,
1001
+ }),
1002
+ /**
1003
+ * @description The autocomplete read: /businesses and /people for one term, ranked together, so a search field costs one request per keystroke rather than two and does not have to merge two orders itself. Each row carries either business or person, whichever type names. Ordered by where the term sits in the name, then by the shorter name, then companies before people. pageSize is per side, so the answer holds up to twice as many rows. An empty search answers an empty list; use /businesses to page through the whole dataset. Kostet 1 Credit.
1004
+ *
1005
+ * @tags Search
1006
+ * @name V1SearchList
1007
+ * @summary Companies and people in one ranked list
1008
+ * @request GET:/api/v1/search
1009
+ * @secure
1010
+ */
1011
+ v1SearchList: (query, params = {}) => this.request({
1012
+ path: `/api/v1/search`,
1013
+ method: "GET",
1014
+ query: query,
1015
+ secure: true,
1016
+ format: "json",
1017
+ ...params,
1018
+ }),
1019
+ /**
1020
+ * @description Returns the graph (nodes and edges) within 2 hops of the start entity. Exactly one of personId or fnr must be provided. The network of people and companies around one starting point — who sits on which board with whom. nodes are people ("person") and companies ("business"), each carrying the id you would pass to /people/{personId} or /businesses/{fnr} — a person's is the Firmenakte-ID, e.g. "P-7K3M-QX91"; edges are source/target pairs of those ids whose relationshipType is "assignment", a person holding a function in a company. Two further edge types the deployment can enable: "address", two companies registered at the same street address, and "ownership", a company holding shares in another — source is the shareholder, target the company it holds, and capitalAmount, currency and sharePercent carry the stake where the register gives one. Ownership edges are drawn only for companies crawled since the shareholder mapping went live, so a company not yet re-crawled reports none rather than implying it has none. The traversal depth is fixed at 2 hops and is not a parameter — a node with further connections outside that boundary carries hasMore=true, and isCentralNode marks the entity you started from. personId and fnr are mutually exclusive, not combinable: supplying both, or neither, is a 400, and an id that exists in neither register is a 404. personId answers on the canonical Firmenakte-ID; another spelling of it and a person's old "vorname-nachname-…" id answer one 308 whose relative Location carries the canonical form. Kostet 3 Credits.
1021
+ *
1022
+ * @tags Graph
1023
+ * @name V1GraphList
1024
+ * @summary Relationship graph
1025
+ * @request GET:/api/v1/graph
1026
+ * @secure
1027
+ */
1028
+ v1GraphList: (query, params = {}) => this.request({
1029
+ path: `/api/v1/graph`,
1030
+ method: "GET",
1031
+ query: query,
1032
+ secure: true,
1033
+ format: "json",
1034
+ ...params,
1035
+ }),
1036
+ /**
1037
+ * @description The single feed of every change across all registers — Firmenbuch, GISA, Ediktsdatei and the BMF Scheinunternehmen list — as lightweight reference rows. Each row carries only id, fnr, changeType and the dates; fetch the payload with GET /globalchanges/{id}, or poll one register's typed feed instead (/businesses/changes, /documents/changes, /edikte/changes, /trades/changes). Ordered by ascending id, and that id is the cursor: request with sinceId set to the highest id you have stored, walk page=1,2,… at a fixed pageSize until a page comes back with fewer than pageSize rows, keep the highest id you saw, and start the next poll from it. sinceId is exclusive, so nothing is delivered twice, and a new change always takes a higher id than every change already in the feed, so it appends to the end and never shifts a page you have already read. since is inclusive, filters on when we recorded the change rather than on changedDate, and applies together with sinceId when both are sent. Paging without sinceId is not a reliable feed: an offset is not a watermark, and page stops at 1000. totalRecords stops there too — it is counted only as far as page 1000 reaches, so it caps at 1000 × pageSize and means "at least this many" once it is that; stop on a short page, not on a count. Under concurrent writes a change can become visible just after a higher id, so a consumer that must not miss one resumes from the previous poll's watermark and de-duplicates by id. Kostet 1 Credit.
1038
+ *
1039
+ * @tags GlobalChanges
1040
+ * @name V1GlobalchangesList
1041
+ * @summary All-register change feed
1042
+ * @request GET:/api/v1/globalchanges
1043
+ * @secure
1044
+ */
1045
+ v1GlobalchangesList: (query, params = {}) => this.request({
1046
+ path: `/api/v1/globalchanges`,
1047
+ method: "GET",
1048
+ query: query,
1049
+ secure: true,
1050
+ format: "json",
1051
+ ...params,
1052
+ }),
1053
+ /**
1054
+ * @description Changes for a watchlist of companies, all four change types in one unpaged response. Built for watchlist polling: pass up to 1000 fnr values (repeat the parameter) and one cursor, and get back four arrays — businessChanges, documentChanges, ediktChanges, globalChanges — each ordered by ascending id and capped at maxResultsPerType. Not paged: raise maxResultsPerType or advance sinceId instead. sinceId is exclusive and since is inclusive, exactly as on the paged feeds, but one sinceId covers all four arrays: an array that comes back full at maxResultsPerType has more behind it and bounds the cursor, so advance sinceId only to the lowest of the full arrays' highest ids, and to the highest id of all four once none comes back full. Passing no fnr returns four empty arrays, not the whole feed. Kostet 3 Credits.
1055
+ *
1056
+ * @tags GlobalChanges
1057
+ * @name V1GlobalchangesAggregatedList
1058
+ * @summary Aggregated watchlist changes
1059
+ * @request GET:/api/v1/globalchanges/aggregated
1060
+ * @secure
1061
+ */
1062
+ v1GlobalchangesAggregatedList: (query, params = {}) => this.request({
1063
+ path: `/api/v1/globalchanges/aggregated`,
1064
+ method: "GET",
1065
+ query: query,
1066
+ secure: true,
1067
+ format: "json",
1068
+ ...params,
1069
+ }),
1070
+ /**
1071
+ * @description Returns one change with its typed payload, whichever register it came from. The envelope is a discriminator plus the payload: changeType says which register, and data is the matching object — a BusinessChange, DocumentChange, EdiktChange, GisaChange, FoerderungChange or ScheinunternehmenChange. Since data is a union, read changeType before it. Kostet 1 Credit.
1072
+ *
1073
+ * @tags GlobalChanges
1074
+ * @name V1GlobalchangesDetail
1075
+ * @summary Change by id
1076
+ * @request GET:/api/v1/globalchanges/{id}
1077
+ * @secure
1078
+ */
1079
+ v1GlobalchangesDetail: (id, params = {}) => this.request({
1080
+ path: `/api/v1/globalchanges/${id}`,
1081
+ method: "GET",
1082
+ secure: true,
1083
+ format: "json",
1084
+ ...params,
1085
+ }),
1086
+ /**
1087
+ * @description Returns the OeNACE classification catalog with company counts. Results are ordered by company count descending — most used first. Kostet 1 Credit.
1088
+ *
1089
+ * @tags Oenace
1090
+ * @name V1OenaceList
1091
+ * @summary OeNACE classification catalog
1092
+ * @request GET:/api/v1/oenace
1093
+ * @secure
1094
+ */
1095
+ v1OenaceList: (query, params = {}) => this.request({
1096
+ path: `/api/v1/oenace`,
1097
+ method: "GET",
1098
+ query: query,
1099
+ secure: true,
1100
+ format: "json",
1101
+ ...params,
1102
+ }),
1103
+ /**
1104
+ * @description Returns all legal forms with pagination and optional search, sorted by business count descending. Kostet 1 Credit.
1105
+ *
1106
+ * @tags LegalForms
1107
+ * @name V1LegalformsList
1108
+ * @summary Legal form catalog
1109
+ * @request GET:/api/v1/legalforms
1110
+ * @secure
1111
+ */
1112
+ v1LegalformsList: (query, params = {}) => this.request({
1113
+ path: `/api/v1/legalforms`,
1114
+ method: "GET",
1115
+ query: query,
1116
+ secure: true,
1117
+ format: "json",
1118
+ ...params,
1119
+ }),
1120
+ /**
1121
+ * @description Returns all courts with pagination and optional search, sorted by business count descending. Kostet 1 Credit.
1122
+ *
1123
+ * @tags Courts
1124
+ * @name V1CourtsList
1125
+ * @summary Court catalog
1126
+ * @request GET:/api/v1/courts
1127
+ * @secure
1128
+ */
1129
+ v1CourtsList: (query, params = {}) => this.request({
1130
+ path: `/api/v1/courts`,
1131
+ method: "GET",
1132
+ query: query,
1133
+ secure: true,
1134
+ format: "json",
1135
+ ...params,
1136
+ }),
1137
+ /**
1138
+ * @description Returns all assignment functions (code/text lookup) for display. Cached 24h. Kostet 1 Credit.
1139
+ *
1140
+ * @tags AssignmentFunctions
1141
+ * @name V1AssignmentfunctionsList
1142
+ * @summary Assignment function catalog
1143
+ * @request GET:/api/v1/assignmentfunctions
1144
+ * @secure
1145
+ */
1146
+ v1AssignmentfunctionsList: (params = {}) => this.request({
1147
+ path: `/api/v1/assignmentfunctions`,
1148
+ method: "GET",
1149
+ secure: true,
1150
+ format: "json",
1151
+ ...params,
1152
+ }),
1130
1153
  };
1131
1154
  }
1132
1155
  }