> ## Documentation Index
> Fetch the complete documentation index at: https://docs.solo.one/llms.txt
> Use this file to discover all available pages before exploring further.

# Network contribution

> How contributing verified work to the network works — and what a contributor keeps

**Furnishing** is how a participant contributes verified work into a network.
It's the write half of the network: a verification your institution already
performed becomes a reusable [trust asset](/concepts/trust/trust-assets) that
entitled participants can later query. If querying is how you take value out of
a SOLO network, contributing is how you put value in — and how you earn the
right to take value out in the first place.

## Contributing is asset creation, not data donation

The natural fear of contributing is "I'm giving away proprietary customer
intelligence and losing control." A SOLO network is designed so that isn't what
happens. When you furnish a verification, it does not vanish into a vendor
database — it becomes an **attributed, governed asset** you still have a stake
in:

* **You keep attribution.** Every certificate sub-product your data backs
  carries your `furnishing_entity_id` and `attestation_id`. The verification
  travels with your name on it — see [Provenance](/concepts/trust/provenance).
* **You keep governance.** Contributed data is still gated by the subject's
  [consent](/concepts/identity/consent), the network's
  [querying policy](/concepts/governance/querying-policies), and each reader's
  [entitlement](/concepts/governance/entitlement). Furnishing does not expose
  your data to passive observers.
* **You gain read access.** Contributing is how you earn entitlement to read a
  subject back later (see below).

## Why furnish?

Banks furnish for two reasons, one regulatory and one economic:

1. **It's how the network has anything to say.** Every certificate, attestation,
   and screening result a querier receives traces back to a record some
   furnisher contributed. A network where nobody furnishes is an empty
   database with a governance layer.
2. **It earns you read access.** Furnishing an entity makes you
   [entitled](/concepts/governance/entitlement) to that entity's data on future
   queries. Contributing is one of the two ways to earn entitlement — the other
   is a prior query. For most participants, furnishing the entities you already
   onboard is by far the cheapest way to build broad read coverage across the
   network.

This earn-back loop is deliberate. Networks stay healthy when read access is
proportional to contribution, so the [entitlement
model](/concepts/governance/entitlement) treats every furnish as a deposit
against future reads.

## The three furnishing channels

There are three ways to get records into a network. All three converge on the
same ingestion machinery — the differences are in transport, batch size, and
how much automation you want to build.

|                          | REST furnish                                   | Bulk file upload                                 | SFTP drops                                                            |
| ------------------------ | ---------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------- |
| **Endpoint / transport** | `POST /v1/products/{product}/furnish`          | `POST /v1/file-upload/ingest`                    | SFTP server (`sftp.solo.one`)                                         |
| **Payload**              | JSON records in the request body               | One file per request (multipart)                 | Excel workbooks dropped into category directories                     |
| **Batch size**           | One to a few records per call                  | One file, many rows                              | One workbook, many rows; many workbooks per session                   |
| **Processing**           | Synchronous — response reflects the furnish    | Asynchronous — returns an upload record to track | Asynchronous — ingestion triggers on upload                           |
| **Best for**             | Real-time furnishing from your onboarding flow | Programmatic batch jobs that already speak HTTPS | Recurring scheduled drops from core-banking or data-warehouse exports |

When to choose each:

* **REST furnish** when furnishing is an event in your system — a consumer
  finishes onboarding, you furnish their record in the same workflow. Lowest
  latency, immediate feedback, no file handling.
* **[Bulk file upload](/api-overview/furnishing/file-upload)** when you have a
  periodic batch job and an HTTPS client but don't want to manage SFTP
  credentials or a file-transfer pipeline.
* **[SFTP](/api-overview/sftp/overview)** when your data already leaves your
  systems as files on a schedule. Most core-banking and data-warehouse stacks
  can target an SFTP endpoint with zero custom code, which makes it the usual
  choice for nightly or monthly drops.

<Note>
  All three channels feed the same furnishing pipeline. A record furnished over
  REST and the same record uploaded in a workbook over SFTP end up as identical
  data in the network — same validation, same policy resolution, same
  entitlement effect.
</Note>

## How a furnish works

A furnish brings together a **network**, a **program**, a resolved **furnishing
policy**, and a **consumer** (or business):

```mermaid theme={null}
flowchart LR
    Rec[Your records] --> F[Product furnish]
    N[Network + program] --> F
    P[Furnishing policy] -. resolved .-> F
    F --> M[Matched to entity]
    M --> Store[(Network data)]
```

| Concept                 | Role in the furnish                                                                                                                   |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Product**             | *What* you're contributing (e.g. a KYC certificate). Determines the endpoint and record schema.                                       |
| **Network**             | *Where* the data is contributed. You must be a [furnisher](/concepts/governance/network-roles) of it.                                 |
| **Program**             | *Which partition* inside the network the data belongs to. Programs link to the policies that govern acceptance.                       |
| **Policy**              | The [furnishing policy](/concepts/governance/furnishing-policies) the network resolves automatically from program + application date. |
| **Consumer / Business** | *Who* the data is about — matched from the identifiers in each record.                                                                |

### Anatomy of a REST furnish

You call the product's furnish endpoint with the network scope and one or more
records. For a KYC certificate:

```bash theme={null}
curl -X POST https://api.solo.one/v1/products/kyc_certificate/furnish \
  -H "Authorization: Bearer $SOLO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "network_id": "9f1c0c2e-7a44-4f1e-9d2a-08b6f3a1c5d7",
    "program_name": "default",
    "application_date": "2026-05-28",
    "records": [
      {
        "first_name": "Jane",
        "last_name": "Doe",
        "date_of_birth": "1990-01-15",
        "social_security_number": "123-45-6789"
      }
    ]
  }'
```

A successful furnish returns a submission acknowledgment:

```json theme={null}
{
  "success": true,
  "submission_id": "5b2e9f10-3c7d-4e8a-b1f6-2d9c0a47e831"
}
```

Field by field:

* `network_id` — the network you're furnishing into. You must hold the
  furnisher role there.
* `program_name` — names the program inside that network. Together with
  `application_date`, this is what the network uses to resolve the applicable
  furnishing policy.
* `application_date` — when the consumer applied. Used in policy resolution
  (see below), not as a record timestamp.
* `records` — one or more consumer records. For KYC certificates each record
  carries `first_name`, `last_name`, `date_of_birth`, and
  `social_security_number` — all strings. The SSN is the matching key that
  connects your record to a consumer [entity](/concepts/identity/entities).

The same shape applies to `POST /v1/products/kyb_certificate/furnish` for
business records.

### Program routing and policy resolution

You never attach a furnishing policy yourself. At ingest, the network resolves
it in two steps:

1. **Program lookup.** `program_name` is resolved to a program inside the
   network identified by `network_id`. An unknown program name fails the
   record — programs must be configured by the network's governor before
   furnishers can target them.
2. **Policy matching.** Each program is linked to one or more
   [furnishing policies](/concepts/governance/furnishing-policies), each link
   carrying an effective date window. Your record's `application_date` is
   compared against the policy's active window and the program-link's
   effective window. Policies whose windows cover the application date apply;
   records that fall outside every window are *filtered* — skipped without
   being treated as errors.

```mermaid theme={null}
flowchart TD
    R[Record: program_name + application_date] --> PG[Resolve program in network]
    PG -->|not found| ERR[Record fails]
    PG --> PM[Match linked furnishing policies]
    PM -->|application_date in window| RUN[Ingest under policy]
    PM -->|outside all windows| FIL[Filtered — skipped, not an error]
```

This is why the policy is "optional" from your perspective: it's always
applied, but never something you pass in. As a furnisher you state *facts*
(program, date, record); the governor's configuration decides *rules*. If a
program links several policies whose windows overlap your application date,
the record is ingested under each matching policy.

## What happens after ingest

Once a record is accepted, the furnishing pipeline takes over:

1. **Validation.** The record is checked against the resolved policy's
   requirements. Each record is processed independently — one bad record in a
   batch doesn't fail its neighbors.
2. **Entity matching.** Identifiers in the record (SSN for consumers; tax
   identifier and jurisdiction for businesses) are matched to an existing
   [entity](/concepts/identity/entities), or a new entity profile is created.
   Re-furnishing the same entity updates the existing profile rather than
   creating a duplicate.
3. **Records become network data.** The furnished attributes are written as
   that entity's data, attributed to your organization as furnisher.
4. **Certificates and attestations.** For certificate products, the furnished
   operations (document capture, address verification, and so on — whatever
   the policy requires) become the evidence behind KYC/KYB certificates that
   queriers later receive. Where your organization has attested to the data,
   the attestation is linked to the resulting certificates.
5. **Entitlement is recorded.** Your organization becomes
   [entitled](/concepts/governance/entitlement) to this entity's data on
   future queries.

## Data quality expectations

The network is only as good as what's furnished into it. A few expectations
hold across every channel:

* **Identifiers must be real and complete.** SSNs, EINs, and dates of birth
  are matching keys. A typo doesn't just corrupt one record — it creates a
  phantom entity or pollutes a real one.
* **Treat identifiers as text.** SSNs and tax identifiers are strings, not
  integers. This matters in spreadsheets especially: a numeric cell silently
  drops leading zeros.
* **`application_date` should be the genuine application date.** It drives
  policy resolution; backdating or defaulting it to "today" routes records to
  the wrong policy version.
* **Furnish what the policy asks for.** Policies enumerate required
  verification operations. Records that don't satisfy them won't produce
  certificates, even if they ingest cleanly.
* **Idempotency is on natural keys.** Re-submitting a consumer record with the
  same SSN updates rather than duplicates. Don't "fix" a bad record by
  furnishing a second one with a tweaked identifier.

## Furnishing vs. querying

|                          | Furnishing                  | Querying               |
| ------------------------ | --------------------------- | ---------------------- |
| Direction                | Write into the network      | Read from the network  |
| Needs consent?           | No                          | Yes                    |
| Needs a policy you pass? | No (resolved automatically) | Yes (`network_policy`) |
| Earns entitlement?       | Yes                         | Yes                    |

See [Querying](/api-overview/querying/overview) for the read half.

## Troubleshooting

<AccordionGroup>
  <Accordion title="403 / not authorized to furnish">
    Your organization must hold the furnisher role in the target network. See
    [network roles](/concepts/governance/network-roles). Check that
    `network_id` is the network where you were granted the role — roles don't
    carry across networks.
  </Accordion>

  <Accordion title="Record fails with an unknown program">
    `program_name` must exactly match a program configured in the network by
    its governor. Program names are matched within the network identified by
    `network_id` — confirm both halves. If the program genuinely doesn't exist
    yet, the governor needs to create it (over the API or a
    [programs workbook](/api-overview/sftp/schemas#programs)) before you furnish
    against it.
  </Accordion>

  <Accordion title="Records accepted but no certificate appears">
    Most often the record was **filtered**: its `application_date` fell outside
    every linked policy's effective window. Filtered records are skipped
    deliberately, not errored. Check the program's policy links and their date
    windows against the application dates you're sending.
  </Accordion>

  <Accordion title="Validation errors on individual records">
    Records are validated independently, so a batch can partially succeed.
    Common causes: missing required fields (all four KYC record fields are
    required), malformed dates (use ISO 8601, e.g. `1990-01-15`), or empty
    identifier strings.
  </Accordion>

  <Accordion title="Duplicate entities after furnishing">
    Entity matching keys on identifiers (SSN; EIN + jurisdiction). If you see
    duplicates, the identifiers differed between submissions — check for
    formatting drift such as dropped leading zeros or embedded whitespace.
  </Accordion>
</AccordionGroup>

## In the dashboard

<Frame caption="Furnishing programs list — before program workbook upload">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/01-programs-list.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=b8609c54083f857c96aa9b260e92e3fd" alt="Furnishing programs list — before program workbook upload" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/01-programs-list.png" />
</Frame>

<Frame caption="Program workbook upload dialog">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/02-program-upload-dialog.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=2e8eae3355fbcf61decdcbf6a5a46079" alt="Program workbook upload dialog" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/02-program-upload-dialog.png" />
</Frame>

<Frame caption="Furnishing channels — REST API, SFTP file drops, and data lake connectors">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/sources/furnishing-complete/06-list.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=ca51eba4fd908e92f148d68553e90021" alt="Furnishing channels — REST API, SFTP file drops, and data lake connectors" width="1440" height="900" data-path="images/dashboard/journeys/sources/furnishing-complete/06-list.png" />
</Frame>

<Frame caption="Product furnish onboarding — step overview">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/09-product-onboarding-dialog.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=311ee5542e901f6311012e8c1978f20c" alt="Product furnish onboarding — step overview" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/09-product-onboarding-dialog.png" />
</Frame>

<Frame caption="Institutional attestation — active or ready to certify">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/10-product-onboarding-attestation-filled.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=251ca3efa3862bf062449ec9ff05f62b" alt="Institutional attestation — active or ready to certify" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/10-product-onboarding-attestation-filled.png" />
</Frame>

<Frame caption="Product furnish onboarding — KYC data workbook ready to upload">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/11-product-onboarding-upload-filled.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=786481a8a179e6c41bd59bcc2be10a34" alt="Product furnish onboarding — KYC data workbook ready to upload" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/11-product-onboarding-upload-filled.png" />
</Frame>

<Frame caption="Product furnish onboarding — KYC upload accepted and processing">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/12-product-onboarding-upload-success.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=8fa01d87fed656589621e20681c4bf0d" alt="Product furnish onboarding — KYC upload accepted and processing" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/12-product-onboarding-upload-success.png" />
</Frame>

<Frame caption="KYC product detail after successful furnish onboarding">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/13-product-onboarding-success-detail.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=63692f4a05c63883ffbceeab55ed347a" alt="KYC product detail after successful furnish onboarding" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/13-product-onboarding-success-detail.png" />
</Frame>

<Frame caption="Consumer detail — furnishments tab">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/15-entity-furnish-furnishments-tab.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=97261a56b1db41a510f5662bc11bfcb9" alt="Consumer detail — furnishments tab" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/15-entity-furnish-furnishments-tab.png" />
</Frame>

<Frame caption="Entity furnish — product picker dialog">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/16-entity-furnish-dialog.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=f6a9448191dbdbd3fcb5eacc2e6d801f" alt="Entity furnish — product picker dialog" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/16-entity-furnish-dialog.png" />
</Frame>

<Frame caption="Entity furnish — KYC product selected">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/17-entity-furnish-dialog-filled.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=5fccff31f1fa5e4153378873de70e390" alt="Entity furnish — KYC product selected" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/17-entity-furnish-dialog-filled.png" />
</Frame>

<Frame caption="Furnished consumer — furnishments tab after KYC upload">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/20-entity-furnish-furnishments-after-upload.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=b25106d7abb1025357135f8396b1b39c" alt="Furnished consumer — furnishments tab after KYC upload" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/20-entity-furnish-furnishments-after-upload.png" />
</Frame>

<Frame caption="Business detail — furnishments tab">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/22-entity-furnish-business-furnishments-tab.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=de345d4680d604112a1e69f7f3d41f5a" alt="Business detail — furnishments tab" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/22-entity-furnish-business-furnishments-tab.png" />
</Frame>

<Frame caption="Entity furnish — KYB product picker">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/23-entity-furnish-business-dialog.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=a078601c394b6846bcb2983cd966b7d1" alt="Entity furnish — KYB product picker" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/23-entity-furnish-business-dialog.png" />
</Frame>

<Frame caption="Entity furnish — KYB product selected">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/24-entity-furnish-business-dialog-filled.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=6e4f986dd3bc1eb607c9352331ad1b82" alt="Entity furnish — KYB product selected" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/24-entity-furnish-business-dialog-filled.png" />
</Frame>

<Frame caption="Furnished business — furnishments tab after KYB upload">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/27-entity-furnish-business-furnishments-after-upload.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=33f1f2736aa94f1dbcca81726bb0cd3b" alt="Furnished business — furnishments tab after KYB upload" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/27-entity-furnish-business-furnishments-after-upload.png" />
</Frame>

<Frame caption="Furnish events history list">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/28-history-list.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=4c353d60e9b331846c2a9f051924200e" alt="Furnish events history list" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/28-history-list.png" />
</Frame>

<Frame caption="Furnish event detail — overview tab">
  <img src="https://mintcdn.com/soloone/yGCbj3r-gv4V9x0i/images/dashboard/journeys/furnishing/furnishing-complete/29-history-event-detail.png?fit=max&auto=format&n=yGCbj3r-gv4V9x0i&q=85&s=9e0e9afcbb78b35b8197ad0765b1ec83" alt="Furnish event detail — overview tab" width="1440" height="900" data-path="images/dashboard/journeys/furnishing/furnishing-complete/29-history-event-detail.png" />
</Frame>

## Related concepts

<CardGroup cols={2}>
  <Card title="Bulk File Upload" icon="file-arrow-up" href="/api-overview/furnishing/file-upload">
    Furnish whole files over REST with one request.
  </Card>

  <Card title="SFTP Ingestion" icon="server" href="/api-overview/sftp/overview">
    Recurring workbook drops, no HTTP client required.
  </Card>

  <Card title="Furnishing Policies" icon="scale-balanced" href="/concepts/governance/furnishing-policies">
    The rules the network applies to what you contribute.
  </Card>

  <Card title="Furnish an entity" icon="rocket" href="/home/quickstart/furnish-an-entity">
    A hands-on walkthrough of your first furnish.
  </Card>
</CardGroup>
