@digdir/einnsyn-sdk

中文文档
1.7.0发布于 2026/11/05BSD-3-ClauseTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 8316

TypeScript client library for the eInnsyn API

原始使用文档
文档目录18 节
  1. Table of Contents
  2. Installation
  3. Testing
  4. Authentication
  5. Usage
  6. Creating a client instance
  7. Authenticating using JWT
  8. Authenticating using an eInnsyn username / password
  9. Authenticating using an API key
  10. Fetching content
  11. Iterating over paginated lists
  12. Expanding fields
  13. Adding / updating content
  14. Deleting content
  15. Search
  16. API Documentation
  17. License
  18. References

eInnsyn

TypeScript SDK for the eInnsyn API

Table of Contents

Installation

Install the package via npm:

npm install https://github.com/felleslosninger/einnsyn-sdk-typescript

Import and use it in your TypeScript project:

import { EInnsynClient } from 'einnsyn-sdk';

Testing

Run the test suite with:

npm test

Generate a coverage report with:

npm run test:coverage

Authentication

The SDK supports multiple authentication methods:

  • JWT
  • Username/Password
  • API Key

Usage

Creating a client instance

// Client set-up (all options are optional)
const client = new EInnsynClient({
  baseUrl: 'https://api.einnsyn.no',
  appInfo: 'My eInnsyn client',
  username: '[email protected]',
  password: 'myPassword',
  jwtToken: '...',
  apiKey: 'secret_apikey',
});

Authenticating using JWT

When authenticating as an organization through Ansattporten, you would supply your JWT like this:

const authenticatedClient = new EInnsynClient({
  jwt: '...',
});

Authenticating using an eInnsyn username / password

const authenticatedClient = new EInnsynClient({
  username: '[email protected]',
  password: '...',
});

Authenticating using an API key

const authenticatedClient = new EInnsynClient({
  apiKey: 'secret_...',
});

Fetching content

// Get a saksmappe
const saksmappe = await client.saksmappe.get('sm_...');
console.log(saksmappe.offentligTittel);

// Get all journalposts in the saksmappe
const journalpostList = await client.saksmappe.getJournalpost('sm_...');

// Iterate over all journalposts
for await (const journalpost of client.iterate(journalpostList)) {
  console.log(`${journalpost.offentligTittel}`);
}

Iterating over paginated lists

You can automatically iterate over paginates lists like this:

const journalpostList = await client.saksmappe.getJournalpost('sm_...');

// Iterate over all journalposts
for await (const journalpost of client.iterate(journalpostList)) {
  console.log(`${journalpost.offentligTittel}`);
}

Expanding fields

You can expand fields in your queries to include related entities:

// Non-expanded:
const saksmappe = await client.saksmappe.get('sm_...');
console.log(saksmappe);
// Example output:
// {
//   entity: 'Saksmappe',
//   id: 'sm_...',
//   offentligTittel: 'Saksmappe title',
//   offentligTittelSensitiv: 'Saksmappe title with sensitive data',
//   saksaar: 2025,
//   sakssekvensnummer: 1,
//   journalpost: ['jp_...'],
// }

// Expanded:
const expandedSaksmappe = await client.saksmappe.get('sm_...', { expand: ['journalpost'] });
console.log(expandedSaksmappe);
// Example output:
// {
//   entity: 'Saksmappe',
//   id: 'sm_...',
//   offentligTittel: 'Saksmappe title',
//   offentligTittelSensitiv: 'Saksmappe title with sensitive data',
//   saksaar: 2025,
//   sakssekvensnummer: 1,
//   journalpost: [{
//     offentligTittel: 'Journalpost title',
//     offentligTittelSensitiv: 'Journalpost title with sensitive data',
//     journalaar: 2025,
//     journalsekvensnummer: 1,
//     journalpostnummer: 1,
//     journalposttype: 'inngaaende_dokument',
//     journaldato: '2025-01-01',
//   }],
// }

Adding / updating content

// Create a containing Arkiv
const arkiv = await client.arkiv.add({
  tittel: 'Arkiv title',
});

// Create a containing Arkivdel
const arkivdel = await client.arkiv.addArkivdel(arkiv.id, {
  tittel: 'Arkivdel title'
});

// Create a saksmappe with a Journalpost
const saksmappe = await client.arkivdel.addSaksmappe(arkivdel.id, {
  offentligTittel: 'Saksmappe title',
  offentligTittelSensitiv: 'Saksmappe title with sensitive data',
  saksaar: 2025,
  sakssekvensnummer: 1,
  journalpost: [{
    offentligTittel: 'Journalpost title',
    offentligTittelSensitiv: 'Journalpost title with sensitive data',
    journalaar: 2025,
    journalsekvensnummer: 1,
    journalpostnummer: 1,
    journalposttype: 'inngaaende_dokument',
    journaldato: '2025-01-01',
  }]
});

// Add a Journalpost with a Dokumentbeskrivelse to an existing Saksmappe
const journalpost = await client.saksmappe.addJournalpost(saksmappe.id, {
    offentligTittel: 'Second Journalpost',
    offentligTittelSensitiv: 'Second Journalpost title with sensitive data',
    journalaar: 2025,
    journalsekvensnummer: 2,
    journalpostnummer: 2,
    journalposttype: 'inngaaende_dokument',
    journaldato: '2025-01-03',
    dokumentbeskrivelse: [{
      tittel: 'Dokumentbeskrivelse title',
      tittelSensitiv: 'Title with sensitive data',
      dokumentnummer: 1,
      tilknyttetRegistreringSom: 'vedlegg',
    }]
});

// Update an existing Saksmappe
const updatedSaksmappe = await client.saksmappe.update(saksmappe.id, {
  offentligTittel: 'Updated offentligTittel',
});

Deleting content

const deletedSaksmappe = client.saksmappe.delete(saksmappe.id);
// Search for "robot"
const searchResultList = client.search({
  query: 'robot',
});

// Iterate all results
for await (const searchResult of client.iterate(searchResultList)) {
    if (isSaksmappe(result)) {
      // This is a Saksmappe.
      console.log(`Saksmappe: ${result.offentligTittel}`);
    } else if (isJournalpost(result)) {
      // This is a Journalpost.
      console.log(`Journalpost - ${result.offentligTittel}`);
    } else if (isMoetemappe(result)) {
      // This is a Moetemappe.
      console.log(`Moetemappe - ${result.offentligTittel}`);
    } else if (isMoetesak(result)) {
      // This is a Moetesak.
      console.log(`Moetesak - ${result.offentligTittel}`);
    } else {
      // Unknown search result, should not happen.
      console.log(`Unknown result type`);
    }
}

// Search for "robot", in documents by a given enhet
const enhetsRobotList = client.search({
  query: 'robot',
  administrativEnhet: 'enh_...',
});

// Advanced search
const advancedSearch = client.search({
  query: 'advanced query',
  administrativEnhet: 'enh_...',
  excludeAdministrativEnhet: 'enh_...',
  sortBy: 'publisertDato',
  sortOrder: 'asc',
});

API Documentation

For detailed API documentation, please refer to the eInnsyn API Specification.

License

This project is licensed under the BSD 3-Clause License. See the LICENSE file for details.

References

版本与发布记录

@digdir/einnsyn-sdk 共发布 9 个版本,首次发布于 2025/06/26;过去 12 个月发布了 6 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.7.0latest2026/11/056 天前
1.6.02026/09/251 个月前
1.5.02026/08/262 个月前
1.4.02026/08/132 个月前
1.3.12026/04/156 个月前
1.3.02026/02/039 个月前

关于 @digdir/einnsyn-sdk 的常见问题

@digdir/einnsyn-sdk 是什么?

TypeScript client library for the eInnsyn API

如何安装 @digdir/einnsyn-sdk?

在项目目录运行 npm install @digdir/einnsyn-sdk,或使用 pnpm add / yarn add / bun add。

@digdir/einnsyn-sdk 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@digdir/einnsyn-sdk 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@digdir/einnsyn-sdk 可以商用吗?

@digdir/einnsyn-sdk 使用 BSD-3-Clause 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。另外不得用原作者名义为衍生产品背书。以上为概括,不构成法律意见,请以许可原文为准。

@digdir/einnsyn-sdk 的下载量有多少?

根据 npm 官方下载统计,@digdir/einnsyn-sdk 在 2026/10/12 – 2026/11/10 这 30 天内被下载 8,316 次,日均约 277 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@digdir/einnsyn-sdk 还在维护吗?

最新版本 1.7.0 发布于 2026/11/05(6 天前);至今共发布 9 个版本,其中过去 12 个月发布了 6 个;首次发布于 2025/06/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。