How it works
- 1
Upload a photo
Post an image of business cards to any Slack channel that has the Viably OCR power enabled. Works with photos taken on your phone โ one card or a stack.
- 2
React with ๐ท
Add a :camera: or :camera_with_flash: reaction to the message. Viably detects it, downloads the image, and submits it to the OCR service.
- 3
Extraction happens async
Viably posts a queued confirmation in the thread immediately. The OCR service processes the image and POSTs the structured result back through your OCR relay endpoint.
- 4
Results appear in the thread
Viably posts a formatted contact table (name, role, company, phone, email) and uploads a 9-column CSV with the full extracted data โ all inside the original thread.
Example Slack output
โ IMG_7261.jpg โ 6 contacts (part 1/1) # Name Role Company Phone Email โ โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ 1 Samuel Chan Head of Incubator Supertype +628778251856 [email protected] 2 Vincentius C. Calvin AI Infrastructure Lead Supertype +628039392210 [email protected] ... ๐ 14 contacts extracted. The CSV above has everything.
Setup
A. Enable the OCR power in your workspace
Go to Powers โ OCR in your Viably dashboard and add the Slack channels where scans should be accepted. Viably ignores ๐ท reactions in channels not on this list.
B. Create an OCR relay endpoint
Go to Powers โ Webhook Relay and click + New Relay โ OCR Service. Copy the relay URL and Bearer token โ you will give these to your OCR service so it can POST results back to Viably.
C. Configure your OCR service
Give your OCR service the relay URL and Bearer token from step B. When processing is complete, the service should POST the structured result back to that URL. See Payload format below for the exact shape.
Payload format
Authorization: Bearer <token>. You do not actually need to implement this yourself as Viably's OCR service handles this for you automatically.{
"job_id": "EXBm0KUM", // matches the job Viably created
"ocr_type": "business_cards", // determines parsing & CSV format
"image_filename": "IMG_7261.jpg", // shown in the Slack header
"contacts_found": 6, // shown in the Slack header
"duration_s": 3.2, // shown in footer
"part": "1/1", // supports multi-part results
"message": "<pipe-delimited rows, see below>"
}The message field
For ocr_type: "business_cards", the message field is a string of pipe-delimited rows:
- โข One contact per line (
\nseparates rows) - โข Fields separated by
|(pipe) - โข Exactly 9 fields per row, in order (see below)
- โข A field may contain
,for multiple values (e.g. two phone numbers)
Multi-part results
If your OCR service processes a large image in chunks, set part to "1/3", "2/3", "3/3". Viably accumulates each chunk, posts a table per part, and uploads the combined CSV when all parts are received.
The 9 fields
business_cards row must have exactly 9 pipe-separated values, in this order. Leave a field empty by writing nothing between the pipes.| # | Field | In Slack table | In CSV | Notes |
|---|---|---|---|---|
| 1 | name | โ Name | โ name | |
| 2 | title | โ Role | โ title | Job title / designation |
| 3 | company | โ Company | โ company | |
| 4 | โ Email | โ email | ||
| 5 | phone | โ Phone | โ phone | Use , for multiple numbers |
| 6 | โ | โ whatsapp | CSV only | |
| 7 | website | โ | โ website | CSV only |
| 8 | address | โ | โ address | CSV only |
| 9 | notes | โ | โ notes | Extra info; use ; as delimiter |
The Slack table shows only the first 5 fields (name, role, company, phone, email) to keep it readable. The downloadable CSV always contains all 9 columns.
What you get in Slack
1. Queued confirmation
Immediately after you react with ๐ท, Viably posts a message listing which images were queued for processing.
2. Contact table (per part)
As each result arrives, Viably posts a monospace table showing name, role, company, phone, and email for every contact in that part.
3. CSV download (on completion)
Once all parts are received, Viably uploads a contacts-<job_id>.csv file to the thread. It contains all 9 fields for every extracted contact and is ready to import into any CRM or spreadsheet.