Array Data Uploads Integration Guide¶
Feature Availability
The Array Data Uploads feature is enabled on demand. If you're interested in using this feature to enable direct-to-consumer array-data analysis through your application, please contact Gencove support to have it enabled for your organization.
Overview¶
The Array Data Uploads integration allows your application to collect 23andMe, Ancestry, or MyHeritage raw genotyping exports from end-users through Gencove's API—without building your own file-upload infrastructure.
Key Concepts¶
Before integrating, it's helpful to understand a few core Gencove concepts:
- Sample: Represents a single genetic sample in Gencove. In the array-data upload workflow, one upload session equals one sample. Each sample has a unique ID and tracks the entire lifecycle from upload request through analysis.
- Sample Status: Samples progress through various states (e.g.,
consumer awaiting data,scheduled,running,succeeded). - Project: A container for organizing related samples in Gencove. Upload sessions are created in a project Gencove provisions for your organization.
Accepted uploads¶
End-users must upload an unmodified .zip export from 23andMe, Ancestry, or MyHeritage. The maximum file size is 25 MB. The upload form rejects other file types and oversized files before analysis begins.
How It Works¶
The array-data upload workflow involves three key parties:
- Your end-user: The person uploading their genotyping export
- Your application (consumer health company): Handles user requests and integrates with Gencove's API
- Gencove: Hosts the upload experience, stores the file, and runs analysis
sequenceDiagram
autonumber
actor EU as End-user
participant CC as Consumer company
participant CU as consumer.gencove.com
participant API as Gencove API
participant GC as Gencove
EU->>CC: Ready to upload array data
CC->>CC: Accept request, store information
Note over CC,API: CC uses Gencove API key for the request
CC->>API: POST https://api.gencove.com/api/v2/array-data-upload-form/
API-->>CC: Return sample ID and upload URL
CC-->>EU: Open upload URL (WebView or browser)
EU->>CU: Upload .zip file
CU->>GC: Store array data and sample metadata
GC->>GC: Process array data
alt Delivery back to CC via webhook
GC-->>CC: POST results (webhook)
CC-->>EU: Display results in application
else Delivery back to CC via API pull
CC->>API: GET https://api.gencove.com/api/v2/samples/{sample_id}
API-->>CC: Sample status and deliverables
CC-->>EU: Display results in application
end
sequenceDiagram
autonumber
actor EU as End-user
participant CC as Consumer company
participant CU as consumer.gencove.com
participant API as Gencove API
participant GC as Gencove
EU->>CC: Ready to upload array data
CC->>CC: Accept request, store information
Note over CC,API: CC uses Gencove API key for the request
CC->>API: POST https://api.gencove.com/api/v2/array-data-upload-form/
API-->>CC: Return sample ID and upload URL
CC-->>EU: Open upload URL (WebView or browser)
EU->>CU: Upload .zip file
CU->>GC: Store array data and sample metadata
GC->>GC: Process array data
alt Delivery back to CC via webhook
GC-->>CC: POST results (webhook)
CC-->>EU: Display results in application
else Delivery back to CC via API pull
CC->>API: GET https://api.gencove.com/api/v2/samples/{sample_id}
API-->>CC: Sample status and deliverables
CC-->>EU: Display results in application
end
Workflow Steps¶
- Upload request: Your end-user is ready to submit their 23andMe, Ancestry, or MyHeritage export in your application
- Accept request: Your application accepts the request and stores necessary information
- Create session: Your application makes an authenticated request to Gencove's API to create an upload session
- Sample ID and URL: Gencove returns a unique sample ID and a short-lived upload URL that you should hand off to the end-user
- End-user upload: The end-user opens the URL and uploads their
.zipfile on Gencove-hosted pages - Gencove analysis: Gencove stores the file and runs analysis on the array data
- Results delivery via webhook: (RECOMMENDED) Gencove delivers results to your application via webhook when they're ready
- Fetch results via API: Periodically ping the Gencove API to get sample status and results
- Display results: Your application displays the results to your end-user
Integration Guide¶
Get Your API Key¶
To make requests to Gencove's API, you'll need an API key. This key authenticates your application and should be kept secure (treat it like a secret or a password).
To generate an API key:
- Log in to your Gencove account at web.gencove.com
- In the left sidebar, click on Account
- Navigate to the API Keys tab
- Click the Generate new API key button
- Copy the generated API key and store it securely
Security Best Practice: For production use, consider creating a separate Gencove user with
Analystlevel privileges specifically for API access, and use that user's API key. This follows the principle of least privilege and makes it easier to manage access if needed.
Keep Your API Key Secret
Your API key provides access to your Gencove account. Never commit it to version control, never share it publicly, never expose it in client-side code. Store it in a secure secrets management system. If your key gets exposed, make sure to revoke it immediately and generate a new one.
Create a Gencove Project¶
Before creating upload sessions, you need a project for array-data samples.
Gencove support should have created a properly configured project during onboarding; if not, please contact our team.
Create an Upload Session¶
When your end-user is ready to upload, your application should make a POST request to Gencove's array-data upload endpoint.
API Endpoint: POST https://api.gencove.com/api/v2/array-data-upload-form/
Authentication: Include your API key in the Authorization header: Authorization: Api-Key $GENCOVE_API_KEY
Request Body:
{
"metadata": {
"customer_id": "cust_12345",
"channel": "ios_webview"
},
"redirect_on_success": "https://partner.example.com/upload/done",
"redirect_on_failure": "https://partner.example.com/upload/error",
"expires_in": 600
}
Optional Fields:
| Field | Description |
|---|---|
metadata |
Custom key-value pairs stored on the sample (useful for linking back to your system) |
redirect_on_success |
HTTPS URL to send the end-user after a successful upload; omit to show a Gencove confirmation page |
redirect_on_failure |
HTTPS URL to send the end-user after a failed upload; Gencove appends a reason query parameter when possible |
expires_in |
How long the upload link stays valid before the end-user opens it, in seconds (default 600, minimum 60, maximum 3600) |
Response:
{
"sample_id": "6c3437b4-35fc-4224-9bb0-4623a16e6735",
"url": "https://consumer.gencove.com/array-data-upload?token=<jwt>",
"expires_at": "2026-06-02T12:34:56Z"
}
Important: Store the returned sample_id in your database. This is the unique identifier you'll use to track the sample's status and retrieve results. You can also find samples later using values in metadata.
Hand the returned url to your end-user when they are ready to upload (for example, open it in a mobile WebView). Create the session shortly before upload—the link expires after expires_in seconds.
Example Request¶
curl -X POST "https://api.gencove.com/api/v2/array-data-upload-form/" \
-H "Authorization: Api-Key $GENCOVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"metadata": {"customer_id": "cust_12345"},
"redirect_on_success": "https://partner.example.com/upload/done",
"redirect_on_failure": "https://partner.example.com/upload/error",
"expires_in": 600
}'
import os
import requests
API_KEY = os.getenv("GENCOVE_API_KEY")
headers = {
"Authorization": f"Api-Key {API_KEY}",
"Content-Type": "application/json",
}
payload = {
"metadata": {"customer_id": "cust_12345"},
"redirect_on_success": "https://partner.example.com/upload/done",
"redirect_on_failure": "https://partner.example.com/upload/error",
"expires_in": 600,
}
response = requests.post(
"https://api.gencove.com/api/v2/array-data-upload-form/",
headers=headers,
json=payload,
)
response.raise_for_status()
session = response.json()
print(f"Sample ID: {session['sample_id']}")
print(f"Upload URL: {session['url']}")
End-User Upload Experience¶
After your end-user opens the url:
- Gencove validates the link and shows a branded upload form on
consumer.gencove.com - The end-user uploads their
.zipfile - On success, they are redirected to
redirect_on_successor see a Gencove confirmation page - On failure, they are redirected to
redirect_on_failurewhen configured
Once the file is uploaded, the sample is scheduled for analysis automatically. You do not need to make a separate API call to start processing.
Session timing: The upload link is valid for expires_in seconds before it is opened. After the end-user opens it, they have 15 minutes to complete the upload. If either window expires, create a new session.
One file per sample: Each upload session accepts a single .zip file. If a file was already uploaded for that sample, the link will no longer accept another upload.
Tracking Sample Status¶
Relevant statuses for array-data upload samples:
| Status | Meaning |
|---|---|
consumer awaiting data |
Session created; waiting for the end-user to upload |
consumer session expired |
Upload link expired before a file was received |
scheduled |
File received; waiting to start analysis |
running |
Analysis in progress |
succeeded |
Analysis complete; deliverables available |
| Failed statuses | Analysis or QC failure (same patterns as other samples) |
We recommend using event notifications to learn when a sample reaches succeeded. Alternatively, poll GET https://api.gencove.com/api/v2/samples/{sample_id}.
Note: If using polling, check sample status periodically rather than on every page load. Analysis turnaround time depends on queue load and is typically shorter than kit-based workflows.
WebView and iframe Integration¶
The upload pages can be embedded in an iframe or opened in a mobile WebView so the experience stays inside your application.
Manual Testing¶
You can start an upload session from the Gencove web UI:
- Open your array-data upload project
- Click New upload session on the project page
- Open the returned link and upload a test
.zipfile
This uses the same API endpoint as the integration described above.
System Responsibilities¶
Understanding what each system is responsible for helps clarify the integration:
Your Application's Responsibilities¶
- Handle end-user requests to upload array data
- Create upload sessions via the Gencove API
- Store the Gencove sample ID for each upload session
- Hand off the upload URL to the end-user at the right time
- Monitor sample status (via webhooks or polling)
- Retrieve and display results to your end-users
- Manage your end-users' accounts and permissions
- Keep the Gencove API Key secure
Gencove's Responsibilities¶
- Provide the API for creating upload sessions
- Host the end-user upload experience on
consumer.gencove.com - Store uploaded files and run array-data analysis
- Deliver results via webhooks or API
- Provide sample status tracking
Support¶
If you have questions about the Array Data Uploads integration or encounter any issues: