# @flexbase/persona-node-client 中文文档

规范地址：https://npmcn.com/package/%40flexbase/persona-node-client/

版本：0\.4\.2
npm 元数据更新时间：2025-08-10T12:20:17.930Z
中文译文更新时间：2026-11-14T22:27:37.067Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40flexbase/persona-node-client
原文对照：https://npmcn.com/package/%40flexbase/persona-node-client/?lang=original
项目主页：https://github.com/flexbase-eng/persona-node-client#readme
源码仓库：https://github.com/flexbase-eng/persona-node-client

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：179 kB，20 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=12\.\*
- 运行依赖：7 个
- 首次发布：2022-07-02T15:44:32.803Z
- 最新版本发布：2023-07-19T19:24:58.531Z
- 近 30 天下载量：186555（2026-10-15 至 2026-11-13，npm 官方下载统计）
- 已发布版本数：10（近 12 个月 0 个）

## 中文简介

API 客户端

## 安装

```sh
npm install @flexbase/persona-node-client
```

也可以使用：`pnpm add @flexbase/persona-node-client`、`yarn add @flexbase/persona-node-client`、`bun add @flexbase/persona-node-client`

## README

# 客户端

`persona-node-client` 是节点/ JS 和 TypeScript 客户端 [个人a](https://docs.withpersona.com/) 允许您使用普通节点 查询、核查、报告、账户和其他数据的语法 从人a [API 密码](https://docs.withpersona.com/reference/inquiries-api)。 。 。 .

## 安装

```bash
# with npm
$ npm install @flexbase/persona-node-client
```

## 使用量

这个读取器不会涵盖Persona是什么的所有细节, 和如何使用它 - 它的目标作为一个 _伴侣_ 致 Persona 开发者 [文档](https://docs.withpersona.com/reference/) 解释每个终点和一般人物如何 [API 密码](https://docs.withpersona.com/reference/) 工作时.

不过,我们会举出很多例子 这样就可以清楚如何使用这个 库与 OPersona 互动.

### 获取您的 API 密钥

这个客户端使用相同的 API 密钥, 当你访问 docs about [获取](https://docs.withpersona.com/docs/getting-an-api-key) 您的 API 键 . 不管是沙盒钥匙 还是生产钥匙 文件和Persona Dashboard都是 相当清楚如何得到你的API密钥.

### 创建客户端

目前,有针对性地提供一组职能 客户端。 这些目前涉及账户和核查领域,例如: 以及详细的数据库核查领域。 随着我们增加更多的特征, 这个客户会大吃一惊的 但现在,我们需要它来做这个.

客户的基本构造是:

```typescript
import { Persona } from 'persona-node-client'
const client = new Persona(apiKey)
```

如果您想提供 Persona 版本来使用, 或密钥插入, 这些也可以在构造器中提供:

```typescript
const client = new Persona(apiKey, {
  personaVersion: '2021-07-05',
  keyInflection: 'camel',
})
```

备选办法可包括:

-   `host` - 发送所有 Persona 呼叫的主机名
-   `apiKey` - API 键,如果你想把它放在选项中
-   `keyInflection` - 答复的外壳: `camel`, (中文(简体) ), `snake`等 (中文(简体) ).
-   `personaVersion` - 您想拨打的Persona API版本

### 账户呼叫

如《人物》所述a [文档](https://docs.withpersona.com/reference/accounts-1)数字 :

> 该账户代表一个经核实的个人,其中包含一名或一名 更多的查询。 账户终点的主要用途是: 获取个人先前提交的信息.

#### [列出全部账户](https://docs.withpersona.com/reference/list-all-accounts)

您可以使用单调获取所有已存在的账户列表 :

```typescript
const resp = await client.account.list()
```

如果默认为显示该组织的前10个账户, 反应是:

```javascript
{
  success: true,
  accounts: [
    {
      type: 'account',
      id: 'act_ivNy2ZA8HHazkkPDZUWDmo2K',
      attributes: [Object]
    },
    {
      type: 'account',
      id: 'act_S62jF245bU8pvPKvv9ALYKHM',
      attributes: [Object]
    },
    {
      type: 'account',
      id: 'act_e9ZNggooRhGywARBeRLo2e4Q',
      attributes: [Object]
    },
    {
      type: 'account',
      id: 'act_2mqkNU3uPecc3vrTf2xDnwkF',
      attributes: [Object]
    },
    {
      type: 'account',
      id: 'act_smwy9CMVW5TzNMH1booyF9W6',
      attributes: [Object]
    },
    ...
  ],
  details: {
    requestId: '48b9dda8-083b-4db7-8fdb-74467748db5f',
    runtime: 0.713731
  }
}
```

其中每个 `[Object]` 数值 `attributes` 看起来像:

```javascript
{
  referenceId: '03f1a8f1-75ad-435a-8b9e-05dc77f2f61a',
  createdAt: '2022-06-30T16:25:26.000Z',
  updatedAt: '2022-06-30T16:25:27.000Z',
  nameFirst: 'Tralisha',
  nameMiddle: null,
  nameLast: 'Fenton',
  phoneNumber: '903-991-3776',
  emailAddress: '3hwx94mq@smuggroup.com',
  addressStreet1: '327 Briarbend Rd',
  addressStreet2: null,
  addressCity: 'Goose Creek',
  addressSubdivision: 'South Carolina',
  addressPostalCode: '294457778',
  countryCode: 'US',
  birthdate: '1998-01-11',
  socialSecurityNumber: '111-22-3333',
  tags: [],
  id: 'act_smwy9CMVW5TzNMH1booyF9W6'
}
```

许多Persona的电话有几种可选的参数, 并且他们都以这种形式被列入呼吁中:

```typescript
const resp = await client.account.list({
  size: 20,
})
```

对这一呼吁,可选择如下:

-   `beforeId` - 账户的编号,即终端账户 用于列表
-   `afterId` - 该账户的ID,不会出现在名单上,和 经常是 _最后一个_ 代码来自之前的求取列表 .
-   `size` - 要返回的元素数量
-   `filterRefId` - 那个 `referenceId` 以该值为基础过滤 账户创建时由用户提供.

如果出现错误,反应可能是:

```javascript
{
  "success": false,
  "error": {
    "type": "persona",
    "causes": [
      { "title": "Record not found" },
      ...
    ]
  }
}
```

所以看着 `success` 反应的价值将很快通知您呼叫的结果.

#### [获取账户](https://docs.withpersona.com/reference/apiv1accountsaccount-id-1)

您可以撤回一个以前创建的账户:

```typescript
const resp = await client.account.byId('act_GSzquZ2gyBXsJ9yKB7HJuhW7')
```

唯一的论据是账号,结果会看 比如说:

```javascript
{
  success: true,
  account: {
    type: 'account',
    id: 'act_GSzquZ2gyBXsJ9yKB7HJuhW7',
    attributes: {
      referenceId: 'ec9ff3f2-d49f-4cf5-9a3a-66bc628c47d1',
      createdAt: '2022-06-25T11:12:22.000Z',
      updatedAt: '2022-07-06T09:00:28.000Z',
      nameFirst: 'Jacob',
      nameMiddle: null,
      nameLast: 'Woods',
      phoneNumber: '680-206-6197',
      emailAddress: 'yumyum@google.com',
      addressStreet1: '8601 Sugarlimb Rd',
      addressStreet2: null,
      addressCity: 'Loudon',
      addressSubdivision: 'Tennessee',
      addressPostalCode: '377746323',
      countryCode: 'US',
      birthdate: '1998-01-11',
      socialSecurityNumber: '111-22-3333',
      tags: [Array]
    }
  },
  details: {
    requestId: 'be396edb-1999-49ac-acbf-b6694ed56feb',
    runtime: 0.085191
  }
}
```

#### [创建账户](https://docs.withpersona.com/reference/create-an-account)

您可以通过至少输入其中的某些部分来创建账户 `AccountAttributes` 对象 :

```typescript
const resp = await client.account.create({
  referenceId: '7ab50553-67ee-4b59-9adb-dbce7f37af0a',
  nameFirst: 'Jacob',
  nameLast: 'Woods',
  birthdate: '1998-01-11',
  addressStreet1: '8601 Sugarlimb Ave',
  addressCity: 'Loudon',
  addressSubdivision: 'TN',
  addressPostalCode: '37774',
  countryCode: 'US',
  emailAddress: 'jwoods@gmail.com',
  phoneNumber: '312-555-1212',
  socialSecurityNumber: '111-22-3333',
  tags: ['bad-actor', 'trouble'],
})
```

结果会是:

```javascript
{
  success: true,
  account: {
    type: 'account',
    id: 'act_GSzquZ2gyBXsJ9yKB7HJuhW7',
    attributes: {
      referenceId: '7ab50553-67ee-4b59-9adb-dbce7f37af0a',
      nameFirst: 'Jacob',
      nameLast: 'Woods',
      birthdate: '1998-01-11',
      addressStreet1: '8601 Sugarlimb Rd',
      addressCity: 'Loudon',
      addressSubdivision: 'Tennessee',
      addressPostalCode: '377746323',
      countryCode: 'US',
      emailAddress: 'jwoods@gmail.com',
      phoneNumber: '312-555-1212',
      socialSecurityNumber: '111-22-3333',
      tags: [ 'BAD-ACTOR', 'TROUBLE' ],
      createdAt: '2022-07-01T10:58:46.000Z',
      updatedAt: '2022-07-01T10:58:46.000Z',
      nameMiddle: null,
      addressStreet2: null,
    },
  },
  details: {
    requestId: 'efc22741-5d7e-40e5-92b4-7607e841ee57',
    runtime: 0.41911
  }
}
```

#### [编辑账户](https://docs.withpersona.com/reference/redact-an-account)

你可以软地删除Accout, 正如Persona所说:

> 永久删除账户中个人可识别信息(PII) 以及所有相关的调查、核查和报告。 此动作不能 被撤销.
> 
> 这个终点可用于遵守隐私条例,例如: GDPR / CCPA 或强制数据隐私.
> 
> 注:一个账户在编辑后仍可更新。 如果你想删除 数据持续,请联系我们 帮助你设置保留 政策.

```typescript
const resp = await client.account.delete('act_e9ZNggooRhGywARBeRLo2e4Q')
```

结果会是:

```javascript
{
  success: true,
  account: {
    type: 'account',
    id: 'act_e9ZNggooRhGywARBeRLo2e4Q',
    attributes: {
      referenceId: '7ab50553-67ee-4b59-9adb-dbce7f37af0a',
      createdAt: '2022-07-01T10:58:46.000Z',
      updatedAt: '2022-07-01T11:06:53.000Z',
      nameFirst: null,
      nameMiddle: null,
      nameLast: null,
      phoneNumber: null,
      emailAddress: null,
      addressStreet1: null,
      addressStreet2: null,
      addressCity: null,
      addressSubdivision: null,
      addressPostalCode: null,
      countryCode: null,
      birthdate: null,
      socialSecurityNumber: null,
      tags: [ 'BAD-ACTOR', 'TROUBLE' ],
    },
  },
  details: {
    requestId: 'e988f99c-efe1-4727-af44-ae00d6e870e0',
    runtime: 0.187149
  }
}
```

#### [更新账户](https://docs.withpersona.com/reference/update-an-account)

您可以以 :

```typescript
const resp = await client.account.update('act_e9ZNggooRhGywARBeRLo2e4Q', {
  emailAddress: 'yumyum@google.com',
})
```

且结果看起来与 `byId()`页:1.

#### [添加标签](https://docs.withpersona.com/reference/add-a-tag-1)

您可以使用简单的调用, 在已有的账户中添加标签 :

```typescript
const resp = await client.account.addTag('act_e9ZNggooRhGywARBeRLo2e4Q', 'bad')
```

且结果看起来与 `byId()`页:1 这个 标记都由Persona大写, 和独有的,再次由Persona,所以 在添加标记时,您不必担心案件或独有性.

#### [删除标记](https://docs.withpersona.com/reference/remove-a-tag-1)

您可以用简单的调用从已有账户中删除标签 :

```typescript
const resp = await client.account.removeTag('act_e9ZNggooRhGywARBeRLo2e4Q', 'good')
```

且结果看起来与 `byId()`页:1 这个 标记都由Persona大写, 和独有的,再次由Persona,所以 在删除标记时,您不必担心案件或独有性. 另外,去除不存在的标签也没有处罚.

#### [设置全部标记](https://docs.withpersona.com/reference/set-all-tags-1)

您可以为已有账户设置完整的标签集 简单的调用 :

```typescript
const resp = await client.account.setTags('act_e9ZNggooRhGywARBeRLo2e4Q',
 ['bad', 'iffy']
)
```

且结果看起来与 `byId()`页:1 这个 标记将全部由Persona大写, 和独有,再次由Persona, 这样你就可以不用担心标签中的情况或独特性.

#### [合并账户](https://docs.withpersona.com/reference/consolidate-into-an-account)

您可以合并所有与不同账户相关的资产 这其实是同一个身份 一个电话。 人形容这个 作为:

> 将多个源代码信息合并为一个目标 账号 任何调查、核查、报告和文件 账户将转移到目的地 账号 然而,账户的属性将不会被转移. 合并后,您可以更新目的地账户 属性.
> 
> 此端点可用于清理重复的账号.
> 
> 注:一个源账户只能被合并一次. 后来, 源账户将存档.

```typescript
const resp = await client.account.consolidate(destAcctId,
  [srcAcctId1, srcAcctId2, srcAcctId3]
)
```

第一个论点就是 _目标_ `accountId`,第二个 是一组 `accountId` 值为 _合并_ 到达目的地。 这个 结果看起来类似于 `byId()`页:1.

### 调查呼吁

如《人物》所述a [文档](https://docs.withpersona.com/reference/inquiries-api)数字 :

> 调查是个人试图 核实他们的身份。 调查终点的主要用途是: 从流中获取提交的信息 .
> 
> 当个人开始核实其 身份证明 检查以下状态以确定是否 个人已完成流量。 见 [模型和寿命周期](https://docs.withpersona.com/docs/models-lifecycle#lifecycle) 详细内容 概述个人如何验证其身份.

#### [列出所有查询](https://docs.withpersona.com/reference/list-all-inquiries)

您可以在Persona获得一份没有争议的所有询问列表:

```typescript
const resp = await client.inquiry.list()
```

结果会是:

```javascript
{
  success: true,
  inquiries: [
    {
      type: 'inquiry',
      id: 'inq_i8EnS9TdG2NqZcXbEQcaPSo9',
      attributes: [Object],
      relationships: [Object]
    },
    {
      type: 'inquiry',
      id: 'inq_y8Bqa4JpKFtxdWGkgEEdRtcC',
      attributes: [Object],
      relationships: [Object]
    },
    {
      type: 'inquiry',
      id: 'inq_QsYJm8yq8yjKdHqyAwKBFb64',
      attributes: [Object],
      relationships: [Object]
    },
    {
      type: 'inquiry',
      id: 'inq_2dB7wPwdUJYmf3ytKaxoXZRF',
      attributes: [Object],
      relationships: [Object]
    },
    ...
  ],
  details: {
    requestId: '86f6aed9-c170-44dd-963d-4cb870fcad66',
    runtime: 0.225322
  }
}
```

地点 `[Object]` 数值 `attributes` 键会显示一些东西 例如:

```javascript
{
  status: 'completed',
  referenceId: '7f2ca97f-a110-4f2d-b00e-0d648857db69',
  note: null,
  behaviors: [Object],
  tags: [],
  creator: 'API',
  reviewerComment: null,
  createdAt: '2022-07-01T10:36:59.000Z',
  startedAt: '2022-07-01T10:36:59.000Z',
  completedAt: '2022-07-01T10:37:00.000Z',
  failedAt: null,
  decisionedAt: null,
  expiredAt: null,
  redactedAt: null,
  previousStepName: null,
  nextStepName: null,
  nameFirst: 'Tralisha',
  nameMiddle: null,
  nameLast: 'Fenton',
  birthdate: '1998-01-11',
  addressStreet1: '327 Briarbend Rd',
  addressStreet2: null,
  addressCity: 'Goose Creek',
  addressSubdivision: 'South Carolina',
  addressSubdivisionAbbr: 'SC',
  addressPostalCode: '294457778',
  addressPostalCodeAbbr: '29445',
  socialSecurityNumber: '111-22-3333',
  emailAddress: '3hwx94mq@smuggroup.com',
  phoneNumber: '903-991-3776',
  fields: [Object],
}

```

编辑 `[Object]` 数值 `relationships` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}会看起来有些东西 例如:

```javascript
{
  account: { data: { type: 'account', id: 'act_wUWs7RWHpvWy9gnw4uqqnS3B' } },
  template: { data: { type: 'template', id: 'tmpl_PPDFW92MxhJLomjh4gC2tb5x' } },
  inquiryTemplate: { data: null },
  inquiryTemplateVersion: { data: null },
  reviewer: { data: null },
  reports: { data: [] },
  verifications: { data: [] },
  sessions: { data: [ [Object] ] },
  documents: { data: [] },
  selfies: { data: [] }
}
```

许多Persona的电话有几种可选的参数, 并且他们都以这种形式被列入呼吁中:

```typescript
const resp = await client.inquiry.list({
  size: 20,
})
```

对这一呼吁,可选择如下:

-   `beforeId` - 作为终审调查的调查文件 用于列表
-   `afterId` - 调查的ID,不会出现在名单上,和 经常是 _最后一个_ 代码来自之前的求取列表 .
-   `size` - 要返回的元素数量
-   `filterRefId` - 那个 `referenceId` 以该值为基础过滤 由用户在创建调查时提供.
-   `filterAcctId` - 那个 `accountId` 以账户 id 为基础过滤 作为本调查的基础.

#### [获取调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-id)

你可以得到一个具体的调查 人与仅仅 `inquiryId`数字 :

```typescript
const resp = await client.inquiry.byId('inq_hckCfzvWeT3YEkkmVGzAuxKn')
```

结果会是:

```javascript
{
  success: true,
  inquiry: {
    type: 'inquiry',
    id: 'inq_hckCfzvWeT3YEkkmVGzAuxKn',
    attributes: {
      status: 'expired',
      referenceId: null,
      note: null,
      behaviors: {
        requestSpoofAttempts: null,
        userAgentSpoofAttempts: null,
        distractionEvents: null,
        hesitationBaseline: null,
        hesitationCount: null,
        hesitationTime: null,
        shortcutCopies: null,
        shortcutPastes: null,
        autofillCancels: null,
        autofillStarts: null,
        devtoolsOpen: null,
        completionTime: null,
        hesitationPercentage: null,
        behaviorThreatLevel: null
      },
      tags: [],
      creator: 'bobby.baek+flexbase@withpersona.com',
      reviewerComment: null,
      createdAt: '2022-06-28T20:54:14.000Z',
      startedAt: null,
      completedAt: null,
      failedAt: null,
      decisionedAt: null,
      expiredAt: '2022-06-29T20:54:31.000Z',
      redactedAt: null,
      previousStepName: null,
      nextStepName: null,
      nameFirst: null,
      nameMiddle: null,
      nameLast: null,
      birthdate: null,
      addressStreet1: null,
      addressStreet2: null,
      addressCity: null,
      addressSubdivision: null,
      addressSubdivisionAbbr: null,
      addressPostalCode: null,
      addressPostalCodeAbbr: null,
      socialSecurityNumber: null,
      emailAddress: null,
      phoneNumber: null,
      fields: {
        birthdate: [Object],
        nameLast: [Object],
        nameFirst: [Object],
        nameMiddle: [Object],
        addressCity: [Object],
        phoneNumber: [Object],
        emailAddress: [Object],
        addressStreet1: [Object],
        addressStreet2: [Object],
        addressPostalCode: [Object],
        addressSubdivision: [Object],
        addressCountryCode: [Object],
        socialSecurityNumber: [Object]
      },
    },
    relationships: {
      account: { data: { type: 'account', id: 'act_wUWs7RWHpvWy9gnw4uqqnS3B' } },
      template: { data: { type: 'template', id: 'tmpl_PPDFW92MxhJLomjh4gC2tb5x' } },
      inquiryTemplate: { data: null },
      inquiryTemplateVersion: { data: null },
      reviewer: { data: null },
      reports: { data: [] },
      verifications: { data: [] },
      sessions: { data: [ [Object] ] },
      documents: { data: [] },
      selfies: { data: [] }
    }
  },
  details: {
    requestId: '4b1e7bcd-be12-4fe8-af6b-dc41e8b230ae',
    runtime: 0.09918
  }
}
```

#### [打印调查 PDF](https://docs.withpersona.com/reference/print-an-inquiry-pdf)

调查的PDF字节 `inquiryId`数字 :

```typescript
const resp = await client.inquiry.print('inq_hckCfzvWeT3YEkkmVGzAuxKn')
```

结果会是:

```javascript
{
  success: true,
  inquiry: {
    id: 'inq_hckCfzvWeT3YEkkmVGzAuxKn',
    body: Gunzip {
      _writeState: [Uint32Array],
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 4,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      bytesWritten: 217026,
      _handle: null,
      _outBuffer: <Buffer 20 0a 30 30 30 30 32 32 38 39 30 38 20 30 30
       30 30 30 20 6e 20 0a 30 30 30 30 32 32 39 35 36 36 20 30 30 30
       30 30 20 6e 20 0a 30 30 30 30 32 32 39 36 ... 16334 more bytes>,
      _outOffset: 911,
      _chunkSize: 16384,
      _defaultFlushFlag: 2,
      _finishFlushFlag: 2,
      _defaultFullFlushFlag: 3,
      _info: undefined,
      _maxOutputLength: 4294967296,
      _level: -1,
      _strategy: 0,
      [Symbol(kCapture)]: false,
      [Symbol(kCallback)]: null,
      [Symbol(kError)]: null
    }
  }
}
```

#### [创建调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-id-2)

您可以创建调查:

```typescript
const resp = await client.inquiry.create({
  templateId: 'tmpl_PP...',
  referenceId: '5f81c440-088a-4d71-8980-cdd2565abc8f'
})
```

并且结果看起来会非常类似 `byId()` 函数.

#### [更新调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-id-3)

您可以为调查更新数据 :

```typescript
const resp = await client.inquiry.update(inquiryId, {
  reviewerComment: 'looking good',
})
```

我们需要做更多的测试 这个电话的输出,但它 应该有用 但还没有经过测试.

#### [继续调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-idresume)

你可以在工作流程中恢复调查,用我们的话说 个人文件 :

> 恢复现有的调查。 如果调查处于待决状态, 您还必须指定从此端点生成的会话符号.

```typescript
const resp = await client.inquiry.resume(inquiryId)
```

我们需要做更多的测试 这个电话的输出,但它 应该有用 但还没有经过测试.

#### [核准调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-idapprove)

您可以手动批准一项调查:

```typescript
const resp = await client.inquiry.approve(inquiryId)
```

我们需要做更多的测试 这个电话的输出,但它 应该有用 但还没有经过测试.

#### [拒绝调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-iddecline)

您可以手动拒绝调查 :

```typescript
const resp = await client.inquiry.decline(inquiryId)
```

我们需要做更多的测试 这个电话的输出,但它 应该有用 但还没有经过测试.

#### [编辑调查](https://docs.withpersona.com/reference/apiv1inquiriesinquiry-id-1)

你可以通过编辑所有PII来软删除调查, 在其中 个人文件词:

> 永久删除个人可识别信息 a 调查及所有相关核查和报告。 这一行动 无法被撤销 .
> 
> 这一终点可用于遵守隐私条例,例如: 作为GDPR / CCPA 或强制数据隐私.

```typescript
const resp = await client.inquiry.delete(inquiryId)
```

我们需要做更多的测试 这个电话的输出,但它 应该有用 但还没有经过测试.

#### [添加标签](https://docs.withpersona.com/reference/add-a-tag)

您可以在已有的调查中添加标签, 并使用简单的调用 :

```typescript
const resp = await client.inquiry.addTag('inq_2rs9qsQ1D5GJgmeMK7ktnzo1', 'bad')
```

且结果看起来与 `byId()`页:1 这个 标记都由Persona大写, 和独有的,再次由Persona,所以 在添加标记时,您不必担心案件或独有性.

#### [删除标记](https://docs.withpersona.com/reference/remove-a-tag)

您可以用简单的调用从现有的调查中删除标签 :

```typescript
const resp = await client.inquiry.removeTag('inq_2rs9qsQ1D5GJgmeMK7ktnzo1', 'good')
```

且结果看起来与 `byId()`页:1 这个 标记都由Persona大写, 和独有的,再次由Persona,所以 在删除标记时,您不必担心案件或独有性. 另外,去除不存在的标签也没有处罚.

#### [设置全部标记](https://docs.withpersona.com/reference/set-all-tags)

您可以为现有的调查设置完整的标签 简单的调用 :

```typescript
const resp = await client.inquiry.setTags('inq_2rs9qsQ1D5GJgmeMK7ktnzo1',
 ['bad', 'iffy']
)
```

且结果看起来与 `byId()`页:1 这个 标记将全部由Persona大写, 和独有,再次由Persona, 这样你就可以不用担心标签中的情况或独特性.

### 核查呼吁

如《人物》所述a [文档](https://docs.withpersona.com/reference/verifications)数字 :

> 核查是指个人进行的多次核查. 调查包含一项或多项核查。 可用的属性 对于任何特定的核查,取决于其类型。 每项调查 关系字段列出所有相关验证的ID. 要在获取相片 URL 时认证, 请通过相同的授权 头曰.
> 
> 核查随着个人通过 流动。 检查以下状态以监视进度并查找 完成结果.

#### [获取验证](https://docs.withpersona.com/reference/apiv1verificationsverification-id)

您可以用简单的 `verificationId`数字 :

```typescript
const resp = await client.verification.byId('ver_6JxUgEi2GyMMXQ1vZUFYSGWS')
```

结果会是:

```javascript
{
  success: true,
  verification: {
    type: 'verification/database',
    id: 'ver_JpPzxVnDz9P9tWs7UagHj7Gh',
    attributes: {
      status: 'submitted',
      createdAt: '2022-07-06T09:03:46.000Z',
      createdAtTs: 1657098226,
      submittedAt: '2022-07-06T09:03:47.000Z',
      submittedAtTs: 1657098227,
      completedAt: null,
      completedAtTs: null,
      countryCode: 'US',
      nameFirst: 'Tralisha',
      nameMiddle: null,
      nameLast: 'Fenton',
      addressStreet1: '327 Briarbend Rd',
      addressStreet2: null,
      addressCity: 'Goose Creek',
      addressSubdivision: 'SC',
      addressPostalCode: '29445-7778',
      birthdate: '1998-01-11',
      phoneNumber: '903-991-3776',
      emailAddress: '3hwx94mq@smuggroup.com',
      checks: []
    },
    relationships: { inquiry: [Object] }
  },
  details: {
    requestId: '6f0be052-502a-4e5c-8818-8df961128521',
    runtime: 0.057535
  }
}
```

#### [打印验证 PDF](https://docs.withpersona.com/reference/print-a-verification-as-pdf)

您可以用 PDF 打印出验证文件 :

```typescript
const resp = await client.verification.print('ver_6JxUgEi2GyMMXQ1vZUFYSGWS')
```

结果会是:

```javascript
{
  success: true,
  verification: {
    id: 'ver_6JxUgEi2GyMMXQ1vZUFYSGWS',
    body: Gunzip {
      _writeState: [Uint32Array],
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 4,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      bytesWritten: 217026,
      _handle: null,
      _outBuffer: <Buffer 20 0a 30 30 30 30 32 32 38 39 30 38 20 30 30
       30 30 30 20 6e 20 0a 30 30 30 30 32 32 39 35 36 36 20 30 30 30
       30 30 20 6e 20 0a 30 30 30 30 32 32 39 36 ... 16334 more bytes>,
      _outOffset: 911,
      _chunkSize: 16384,
      _defaultFlushFlag: 2,
      _finishFlushFlag: 2,
      _defaultFullFlushFlag: 3,
      _info: undefined,
      _maxOutputLength: 4294967296,
      _level: -1,
      _strategy: 0,
      [Symbol(kCapture)]: false,
      [Symbol(kCallback)]: null,
      [Symbol(kError)]: null
    }
  }
}
```

### 数据库核查呼叫

核查制度的一个子集是一个简单的数据库核查,其中: 身份的静态数据发送到个人,并贯穿于 一系列数据库 寻找它是否匹配一个坏演员.

#### 检索数据库核查

您可以用简单的 `verificationId`数字 :

```typescript
const resp = await client.verification.database.byId(verificationId)
```

其结果将非常像来自 `byId()` 页:1 a 一般性核查.

#### 创建数据库验证

您可以简单地创建数据库验证:

```typescript
const resp = await client.verification.database.create({
  inquiryId,
  nameFirst: 'James',
  nameLast: 'Woods',
  addressStreet1: '327 Briarbend Ave',
  addressCity: 'Goose Creek',
  addressSubdivision: 'SC',
  addressPostalCode: '29445',
  identificationNumber: '111-22-3333',
  birthdate: '1998-01-11',
  phoneNumber: '312-555-1212',
  emailAddress: 'yoy@gogole.com',
  countryCode: 'US',
})
```

其结果将非常像来自 `byId()` 页:1 a 一般性核查.

#### 提交数据库验证

数据库核查一旦建立,必须提交处理, 这样做的简单方法是:

```typescript
const resp = await client.verification.database.submit(verificationId)
```

其结果将非常像来自 `byId()` 页:1 一般性核查,但 `status` 在数据中,很可能有 更改自 `created` 改为 `submitted`。然后,它将会在呼叫者身上 以获取完成时的网络信息 核查或使用 `byId()` 函数以民意测验 Persona 直至 页:1 `status` 更改终端条件.

#### 同步运行数据库验证

因为它是一个简单的过程, 它有道理有一个 _同步_ 创建、提交和监测数据库核查的方法 你可以做这个"等待"。 这可以用代码在 客户端 :

```typescript
const resp = await client.verification.database.run({
  inquiryId,
  nameFirst: 'James',
  nameLast: 'Woods',
  addressStreet1: '327 Briarbend Ave',
  addressCity: 'Goose Creek',
  addressSubdivision: 'SC',
  addressPostalCode: '29445',
  identificationNumber: '111-22-3333',
  birthdate: '1998-01-11',
  phoneNumber: '312-555-1212',
  emailAddress: 'yoy@gogole.com',
  countryCode: 'US',
})
```

输入与 `create()` 函数和 结果看起来很像来自 `byId()` 页:1 一般性核查,但 `status` 将是一个终审案件.

其中一个是 `stage` 输出属性。 这个会 经历了四个处理阶段:

-   `create` - 如果有错误 `create()` 呼叫,这是 在输出中,连同出错.
-   `submit` - 里面有个错误 `submit()` 呼叫,这是 在输出中,连同出错
-   `complete` - 如果核查工作完成,这将会是 输出和 `status` 输入 `verification` 改为: 最后处置.
-   `processing` - 如果30秒后, 什么都没有改变, 那么这个会 ,连同来自 `byId()`。 。 。 .

想法是错误被标记 与他们发生的电话, 那能帮助打电话的人知道发生了什么.

### 数据库TIN核查呼叫

核查系统的一个子集是数据库TIN(Tax Id号码) 核实公司名称和税务身份证或EIN的发送地点,以及Persona 检查是否真的符合 TIN 或 EIN 。 这是 **_没有_** 寻找彼此,但 _核查_ 关于 双相匹配.

#### 检索数据库 TIN 核查

您可以用简单的 `verificationId`数字 :

```typescript
const resp = await client.verification.tin.byId(verificationId)
```

结果会是:

```javascript
{
  success: true,
  verification: {
    type: 'verification/database-tin',
    id: 'ver_kVJEwKg2BsSGu81G78nTVdtA',
    attributes: {
      status: 'passed',
      createdAt: '2022-07-08T19:18:37.000Z',
      createdAtTs: 1657307917,
      submittedAt: '2022-07-08T19:18:37.000Z',
      submittedAtTs: 1657307917,
      completedAt: '2022-07-08T19:18:37.000Z',
      completedAtTs: 1657307917,
      countryCode: 'US',
      tin: '411234567',
      tinType: 'ssn',
      nameFirst: null,
      nameLast: null,
      checks: [Array]
    },
    relationships: { inquiry: [Object] }
  },
  details: {
    requestId: 'b9553a39-fcc8-498c-9ef9-c0f4a69038aa',
    runtime: 0.112685
  },
  stage: 'complete'
}
```

在许多方面与身份核查相似,但 公司的不同信息 而不是那个人.

#### 创建数据库 TIN 校验

您可以简单地创建数据库 TIN 校验 :

```typescript
const resp = await client.verification.tin.create({
  nameBusiness: 'Microsoft Corp',
  tin: '91-1144442',
  verificationTemplateId: 'vtmpl_abcedfg...',
  countryCode: 'US',
})
```

其结果将非常像来自 `byId()` 页:1 a 一般性核查.

#### 提交数据库 TIN 验证

数据库TIN核查一旦建立,必须提交处理, 这样做的简单方法是:

```typescript
const resp = await client.verification.tin.submit(verificationId)
```

其结果将非常像来自 `byId()` 页:1 一般性核查,但 `status` 在数据中,很可能有 更改自 `created` 改为 `submitted`。然后,它将会在呼叫者身上 以获取完成时的网络信息 核查或使用 `byId()` 函数以民意测验 Persona 直至 页:1 `status` 更改终端条件.

#### 同步运行数据库 TIN 校验

因为它是一个简单的过程, 它有道理有一个 _同步_ 如何创建、提交和监测数据库TIN核查,以便 你可以做这个"等待"。 这可以用代码在 客户端 :

```typescript
const resp = await client.verification.tin.run({
  nameBusiness: 'Microsoft Corp',
  tin: '91-1144442',
  verificationTemplateId: 'vtmpl_abcedfg...',
  countryCode: 'US',
})
```

输入与 `create()` 函数和 结果看起来很像来自 `byId()` 页:1 一般性核查,但 `status` 将是一个终审案件.

其中一个是 `stage` 输出属性。 这个会 经历了四个处理阶段:

-   `create` - 如果有错误 `create()` 呼叫,这是 在输出中,连同出错.
-   `submit` - 里面有个错误 `submit()` 呼叫,这是 在输出中,连同出错
-   `complete` - 如果核查工作完成,这将会是 输出和 `status` 输入 `verification` 改为: 最后处置.
-   `processing` - 如果30秒后, 什么都没有改变, 那么这个会 ,连同来自 `byId()`。 。 。 .

想法是错误被标记 与他们发生的电话, 那能帮助打电话的人知道发生了什么.

## 发展

对于那些有兴趣在图书馆工作的人来说,有些事情是 工作会简单一点 代码的组织全部在 `src/`,每个模块 _节_ 用户名: `account`, (中文(简体) ), `inquiry`, (中文(简体) ), 包括: 这使得函数的位置非常容易.

此外,与Persona服务的主要联系是: `src/index.ts` 模块 `fire()` 函数。 在构造器中 客户,每个 _节次_ 被创建,然后链接到 他们的交流工作主课.

### 设置

为了与守则合作,发展依赖包括: `dotenv` 以便每个用户都能创建 `.env` 具有单一工作值的文件 与个人a :

-   `PERSONA_API_KEY` 这是Persona制作的"API密钥" API 个人 键页.

### 测试

有几个测试脚本可以测试和验证关于 Persona服务行使API的不同部分. 每个都是 自成一体,并可使用:

```bash
$ npm run ts tests/verification.ts

creating new Inquiry based off Database Template...
Success! we have created the new Inquiry inq_Cw4YUBJQDwSmasqN3ZVYpGri
running Database Verification for Inquiry inq_Cw4YUBJQDwSmasqN3ZVYpGri...
TWO {
  success: true,
  verification: {
    type: 'verification/database',
    id: 'ver_XmdrvsgCSSXfiSLpbL42Zywg',
    attributes: {
      status: 'passed',
      createdAt: '2022-06-30T16:25:26.000Z',
      createdAtTs: 1656606326,
      submittedAt: '2022-06-30T16:25:27.000Z',
      submittedAtTs: 1656606327,
      completedAt: '2022-06-30T16:25:27.000Z',
      completedAtTs: 1656606327,
      countryCode: 'US',
      nameFirst: 'Tralisha',
      nameMiddle: null,
      nameLast: 'Fenton',
      addressStreet1: '327 Briarbend Rd',
      addressStreet2: null,
      addressCity: 'Goose Creek',
      addressSubdivision: 'SC',
      addressPostalCode: '29445-7778',
      birthdate: '1998-01-11',
      phoneNumber: '903-991-3776',
      emailAddress: '3hwx94mq@smuggroup.com',
      checks: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
    },
    relationships: { inquiry: [Object] }
  },
  details: {
    requestId: 'e578d72c-7b96-4be5-b078-c41564f994a1',
    runtime: 0.114366
  },
  stage: 'complete'
}
Success! created the Database Verification ver_XmdrvsgCSSXfiSLpbL42Zywg
```

每次测试都会通过客户端进行一系列的通话,然后检查 结果显示操作成功。 如所示,如果所有步骤 报告内容 `Success!` 然后一切正常进行.

如果有一个电话有问题,那么 `Error!` 将打印 ,从客户端返回的数据将被丢弃到控制台.

## 常见问题

### @flexbase/persona-node-client 是什么？

API 客户端

### 如何安装 @flexbase/persona-node-client？

在项目目录运行 npm install @flexbase/persona-node-client，或使用 pnpm add / yarn add / bun add。

### @flexbase/persona-node-client 支持 TypeScript 吗？

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

### @flexbase/persona-node-client 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @flexbase/persona-node-client 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=12\.\*。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @flexbase/persona-node-client 可以商用吗？

@flexbase/persona-node-client 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @flexbase/persona-node-client 的下载量有多少？

根据 npm 官方下载统计，@flexbase/persona-node-client 在 2026/10/15 – 2026/11/13 这 30 天内被下载 186,555 次，日均约 6,219 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @flexbase/persona-node-client 还在维护吗？

最新版本 0\.4\.2 发布于 2023/07/20（3 年前）；至今共发布 10 个版本，其中过去 12 个月发布了 0 个；首次发布于 2022/07/02。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

