Skip to main content
POST
Builds one registration for many wallets. Invalid entries are reported in rejected rather than failing the request. When every entry is rejected, the request fails with NO_VALID_ENTRIES.
A record is written only for a wallet the mined transaction actually registered. On a Trusset register, the contract skips any wallet that already holds an unrevoked identity. It also skips an entry with a zero kycHash or an invalid expiry, and every entry it runs out of gas for. Skipped wallets come back in onChainSkipped on the confirm leg, with their records unchanged. Use Verify Identity to update a wallet that is already registered.
Call once without txHash, sign what comes back, then send the same entries again with txHash added. What you sign depends on registerKind, as on Verify Identity.

Body Parameters

array
required
The wallets to register. Minimum 1, maximum 500.
array
ERC-3643 only. The signatures from the SIGN_CLAIMS phase, as [{ walletAddress, signature }].
object
ERC-3643 only. ONCHAINIDs you deployed with your own tooling, keyed by wallet.
string
ERC-3643 only. The wallet that will sign the claims. Refused with CLAIM_SIGNER_NOT_TRUSTED when it holds no claim key on the register’s trusted issuer. It also becomes the management key of any ONCHAINID the plan deploys, so name a wallet registered to your instance.
string
The hash of the mined transaction. Send it with the same entries to confirm. On an ERC-3643 register, send the hash of steps[confirmStepIndex]. Omit it to receive the calldata or the next phase.

Response Fields

object
rejected[].code is one of INVALID_ENTRY, INVALID_ADDRESS, MISSING_COUNTRY, INVALID_COUNTRY, INVALID_HASH, DUPLICATE_ADDRESS, INVALID_INVESTOR_TYPE or COUNTRY_BLOCKED. An INVALID_INVESTOR_TYPE message lists the values your instance accepts. COUNTRY_BLOCKED checks the verification profile named after the entry’s investorType.

Verify on a Trusset register

Send transaction from a wallet that holds KYC_PROVIDER_ROLE on the register. The API refuses the calldata with KYC_PROVIDER_ROLE_MISSING when it can read that none of your instance’s wallets holds the role. The confirm leg refuses before writing anything when the transaction’s wallets differ from the accepted entries (TX_ENTRIES_MISMATCH). It also refuses when a written entry’s mined investor type differs from the request (TX_INVESTOR_TYPE_MISMATCH). On the Trusset ID Register, the transaction must be signed by one of your instance’s verified wallets (UNAUTHORIZED_SIGNER). On your own register the signer is logged, not checked.

Verify on an ERC-3643 register

The phases work as on Verify Identity, across every accepted entry: Send entries from the first response on every later call, so each wallet keeps its kycHash. The claim signatures cover those hashes. The keys are the same as on Verify Identity. A CLAIM key on claimIssuer signs, and the ONCHAINID’s management key sends each claim step. An agent of the register sends the verify and country steps. The API refuses up front with REGISTRY_AGENT_MISSING or CLAIM_SIGNER_MISSING when none of your instance’s wallets qualifies. The ERC-3643 example sends everything from one wallet that is both, named as signerAddress.
On an ERC-3643 register, batch only wallets that are new to the register. The confirm compares the wallets in the verify step with every accepted entry, and a wallet already on the register is left out of that step. The confirm then fails with TX_ENTRIES_MISMATCH, and a claim or country step cannot be confirmed here at all. Use Verify Identity for wallets already on the register.
An ERC-3643 register stores no investor type and no expiry, so TX_INVESTOR_TYPE_MISMATCH never applies there. onChainSkipped lists the wallets whose KYC claim could not be read back after the transaction. Unlike Verify Identity, the batch confirm does not ask the register whether each wallet now counts as verified.

Records

For every accepted wallet not in onChainSkipped, the confirm leg writes the customer record as verified, with the profile key the entry’s investorType resolved to and the kycHash read from the chain. A new record takes the entry’s country. An existing record keeps the country it already has. Any pending verification for those wallets is settled, and the batch is recorded once in your instance’s verification history as a BATCH_VERIFY entry with the wallets it registered, the transaction and its signer. When the profile an entry’s investorType names has an eligibility register, the wallet’s admission to it is queued for your wallet to sign. See Eligibility registers.

Error Codes