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

# Uploading documents

> Every way to get denials into Denialbase — drag-and-drop, bulk, email, API, or EHR sync.

## Supported formats

<CardGroup cols={3}>
  <Card title="PDF" icon="file-pdf">
    Scanned or native PDFs of EOBs, denial letters, remittance advice.
  </Card>

  <Card title="Image" icon="image">
    PNG, JPG, TIFF — OCR runs automatically.
  </Card>

  <Card title="X12 835 / 837" icon="file-code">
    EDI files from clearinghouses and payer portals.
  </Card>
</CardGroup>

## Upload methods

<Tabs>
  <Tab title="Drag & drop">
    From any page in the app, drag a file onto the upload zone in the sidebar. Multi-file drops are supported — up to 50 files at once.
  </Tab>

  <Tab title="Bulk upload">
    **Settings → Documents → Bulk upload** accepts up to 500 files or a single zipped archive. Files are queued, extracted, and processed in the background. You'll get an email when the batch is done.
  </Tab>

  <Tab title="Scan-to-email">
    Every practice gets a unique forwarding address (`<practice>@uploads.denialbase.com`). Forward or scan-to-email, and Denialbase ingests attachments automatically. Emails themselves are discarded after processing.
  </Tab>

  <Tab title="EHR integration">
    If your EHR is connected via FHIR, denials sync automatically. See [Epic / FHIR setup](/integrations/epic-fhir).
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl -X POST https://api.denialbase.com/api/v1/documents \
      -H "Cookie: $SESSION_COOKIE" \
      -F "file=@denial.pdf" \
      -F "document_type=eob"
    ```

    Returns the document ID; processing happens asynchronously. See [API reference](/api-reference/introduction).
  </Tab>
</Tabs>

## File-size and rate limits

| Limit                              | Value                              |
| ---------------------------------- | ---------------------------------- |
| Single file size                   | 50 MB                              |
| Bulk upload batch                  | 500 files or 2 GB, whichever first |
| Files per practice per day (trial) | 100                                |
| Files per practice per day (paid)  | Unlimited (fair-use)               |
| API upload rate                    | 30 req/min per user                |

## What happens after upload

<Steps>
  <Step title="Virus scan">
    Every file is scanned by ClamAV before any human or AI system touches it. Infected files are quarantined; you'll be notified.
  </Step>

  <Step title="OCR and text extraction">
    For scanned PDFs and images, we run OCR and extract the text. Native PDFs skip OCR.
  </Step>

  <Step title="Classification">
    The LLM classifies the document as EOB, denial letter, remittance advice, medical record, or other, and routes accordingly.
  </Step>

  <Step title="Denial detection">
    For denial-bearing documents, we extract the claim ID, denial reason, CARC/RARC codes, and deadline, and surface the result in the Denials inbox.
  </Step>

  <Step title="Storage">
    The file is stored in a CMEK-encrypted GCS bucket with object versioning. Access is audit-logged.
  </Step>
</Steps>

## Troubleshooting

<AccordionGroup>
  <Accordion title="The upload got stuck at 'Processing'">
    Large files or low-quality scans can take up to 2 minutes. If it's been more than 5 minutes, check **Settings → Documents → Processing queue** and retry from there.
  </Accordion>

  <Accordion title="OCR is missing fields">
    Low-DPI scans (\< 200 DPI) hurt OCR quality. Re-scan at 300 DPI or upload the native PDF if available. You can also manually edit fields in the denial detail view.
  </Accordion>

  <Accordion title="My document was marked 'Low confidence'">
    It's been queued for [Human-in-the-loop review](/billing/reviewing-denials#human-in-the-loop). You'll see it in the review inbox; our reviewers typically clear low-confidence items within an hour.
  </Accordion>

  <Accordion title="The scan-to-email address isn't accepting my email">
    Forwarding addresses only accept emails from verified sender domains (your practice's MX records). Add the address to **Settings → Integrations → Scan-to-email → Allowed senders**.
  </Accordion>
</AccordionGroup>
