---
title: "Import up to 100 document fingerprints from the dashboard"
method: POST
path: "/anchor-self-service/bulk"
tags: ["Anchoring"]
---

# Import up to 100 document fingerprints from the dashboard

`POST /anchor-self-service/bulk`

## Request

- Base URL: `https://app.arkova.ai/api/v1`
- URL: `https://app.arkova.ai/api/v1/anchor-self-service/bulk`
- Auth: HTTP bearer

JWT bridge for the same canonical import orchestration. The selected personal or organization scope is re-derived from the authenticated caller. Recipient assignment requires owner/admin authority for that organization; a caller without it still gets every anchor, and only the recipient-bearing rows report recipient_provisioning_forbidden.

## Request body

- object
  - `org_id` string, uuid, nullable, required: JWT transport only: selected caller-owned organization, or null for personal import. API-key transport derives this from the key.
  - `action` 'queue' | 'instant', required
  - `description` string: Shared public description; at most 500 characters, the record limit
  - `private_tags` object: Import-wide private tags; never public or included in webhooks
    - `user` string[]
    - `organization` string[]
  - `rows` object[], required
    - `fingerprint` string, required
    - `filename` string, required
    - `file_size` integer
    - `credential_type` 'DEGREE' | 'LICENSE' | 'CERTIFICATE' | 'TRANSCRIPT' | 'PROFESSIONAL' | 'CPE' | 'CLE' | 'BADGE' | 'ATTESTATION' | 'FINANCIAL' | 'LEGAL' | 'INSURANCE' | 'SEC_FILING' | 'PATENT' | 'REGULATION' | 'PUBLICATION' | 'CHARITY' | 'ACCREDITATION' | 'FINANCIAL_ADVISOR' | 'BUSINESS_ENTITY' | 'RESUME' | 'MEDICAL' | 'MILITARY' | 'IDENTITY' | 'CONTRACT_PRESIGNING' | 'CONTRACT_POSTSIGNING' | 'OTHER'
    - `metadata` object: PII-stripped extraction/source metadata. Reserved private keys and underscore-prefixed keys are dropped; invalid public evidence claims are rejected per row.
    - `fingerprint_provided` boolean, required: True only when the imported fingerprint was computed from document bytes; false remains unclassified.
    - `recipient_email` string, email: Optional recipient assignment. Assigns the record to that third party and can cause an activation email to be sent to that address. Requires owner/admin authority for the selected organization; without it the row is still anchored and reports recipient_provisioning_forbidden.
    - `recipient_name` string

## Response `200`

Every row created or idempotently skipped

- object
  - `total` integer, required
  - `created` integer, required
  - `skipped` integer, required
  - `failed` integer, required
  - `recipient_link_failed` integer: Rows whose anchor committed but whose recipient did not resolve. Already included in created/skipped; never in failed. Counts rows whose recipient was never linked AND rows that were linked but whose invitation did not go out - see each row reason.
  - `results` object[], required
    - `fingerprint` string, required
    - `status` 'created' | 'skipped' | 'failed' | 'created_recipient_failed' | 'skipped_recipient_failed', required: The *_recipient_failed values mean the anchor exists and must not be re-submitted; the recipient did not resolve. The status does not say whether the recipient was linked - the reason code does. The anchor_recipients link commits before the activation email is sent, so recipient_activation_* reasons mean the recipient WAS linked and only the invitation did not go out (or its delivery is unknown), while reasons thrown at or before the link insert mean it was not linked. recipient_provisioning_forbidden means the caller may not assign recipients at all.
    - `public_id` string
    - `reason` string: Bounded machine-readable failure code
    - `instant_status` 'QUEUED' | 'PROCESSING' | 'NEEDS_CREDIT' | 'RETRYABLE' | 'HELD' | 'SUBMITTED' | 'FAILED'
    - `recipient_status` 'linked' | 'activation_pending': Present only when the row carried a recipient and it was linked. activation_pending means the recipient is a new, unconfirmed account that was invited to activate; linked means an existing account.

## Other responses

- `207`: Bounded partial result; at least one row failed
- `400`: Invalid request
- `401`: Authentication required
- `403`: Insufficient permissions
- `429`: Batch-tier rate limit exceeded
- `503`: API not enabled (feature flag off)

---

[API](https://skmtc.dev/arkova/apis/arkova-verification-api.md) · [All operations](https://skmtc.dev/arkova/apis/arkova-verification-api/llms.txt) · [OpenAPI document](https://skmtc.dev/arkova/apis/arkova-verification-api/revisions/a14858d1efd4?raw)
