The Cell Line Verifier API is the easiest way to automate cell line extraction from PDFs
within your own workflow. The daily usage limit is indexed to that of your online CLV
account, which can be increased upon request. Please note that this service is running on
the free-tier data sharing plan offered by OpenAI. So please do not input any sensitive
data, or anything that you're not worth sharing with OpenAI.
To get started, click on Generate API key in your account settings and follow the instructions below.
Making a request
The only endpoint intended for external use is api/analyse, making the base URL:
https://cell-line-verifier.com/api/analyse
You can test the endpoint and your API key with a curl request. Send your key as a Bearer token in the Authorization header,
and upload your PDF as multipart/form-data:
curl https://cell-line-verifier.com/api/analyse -H "Authorization: Bearer YOUR_API_KEY" -F "pdfs=@/path/to/paper.pdf"
Please note that only one PDF can be sent per request. You can send several requests in parallel: the server analyses up to 5 PDFs at once (all users combined), and the others wait in a queue and are processed in order.
By default the latest pipeline (v1.1) is used. To pick a version explicitly, add a tool_version form field
(v1.1, v1 or v1.1.img), e.g. -F "tool_version=v1". v1.1.img also reads the
article's figures (with gpt-6-luna only): it finds cell lines shown only in images, but takes longer and uses more tokens.
The extraction model can be chosen the same way with a model form field: gpt-6-luna (default) or
gpt-4o, e.g. -F "model=gpt-4o". v1 only runs on gpt-4o, which is used automatically
when no model is given. Please note that gpt-6-luna results can vary slightly between two runs of the same file.
Response format
On success, every request returns the same object:
{
"tool_version": "v1.1",
"model": "gpt-6-luna",
"filename": "test_paper_1.pdf",
"doi": "10.1186/s12935-023-03077-4",
"extracted": ["AGS", "HT-22", "MKN45", "MKN47", "MNK45", "SGC-7901"],
"verified": [["AGS", "CVCL_0139"], ["HT-22", "CVCL_0321"], ["MKN45", "CVCL_0434"]],
"problematic": [["SGC-7901", "CVCL_0520"]],
"proprietary": [["SKBR-3/Tr", "CVCL_0033"], ["MHCC97/SR", "CVCL_4971"]],
"unverifiable": ["MKN47", "MNK45"],
"figure_only": [],
"counts": {"AGS": 87, "MKN45": 79, "MNK45": 7, "SGC-7901": 4, "SKBR-3/Tr": 2, "HT-22": 1, "MKN47": 1, "MHCC97/SR": 1},
"predictions": {"MNK45": "recurring_mistake", "MKN47": "punctual_mistake"}
}
| Field | Description |
tool_version | The extraction pipeline version used for this file: v1.1 (default, recommended), v1 (previous version) or v1.1.img (v1.1 plus the figures) |
model | The model used for extraction: gpt-6-luna (default) or gpt-4o |
filename | The name of the uploaded file |
doi | The article's DOI found in the PDF (e.g. 10.1186/s12935-023-03077-4), or null if none was found |
extracted | Every cell line name found in the text, before verification |
verified | [name, CVCL accession] pairs confirmed against Cellosaurus |
problematic | [name, CVCL accession] pairs flagged as problematic (e.g. contaminated, misidentified) |
proprietary | [name, parent CVCL accession] pairs for lines identified as proprietary/self-derived, linked to their likely parent line |
unverifiable | Names that could not be matched against Cellosaurus |
figure_only | v1.1.img only: the extracted names found in a figure but nowhere in the article text. They may be misreadings of the figure, so check it before relying on them. |
counts | Number of times each name is written in the article text (references excluded), keyed by the name as listed above. Spellings of the same line are counted together; names found only in a figure are absent. |
predictions | For each non-verifiable name written in the text: independent_use (used as a cell line of its own, e.g. listed alongside the real line it resembles), recurring_mistake (written more than once in place of one of the article's real lines) or punctual_mistake (once) or uncertain (looks like a mistake, but the name has 3 characters or fewer and is written at most twice: too short to tell). An independent use can be an unregistered line developed by a group: it calls for a check, not a verdict. |
Please note that cell lines classified as proprietary or non-verifiable might require further verifications as this tool can make mistakes.
Python code example
Here's a Python example. Wrap this in a loop to process multiple files, or run up to 5 calls in parallel (e.g. with a thread pool of 5 workers).
import os
import requests
API_KEY = os.environ["CLV_API_KEY"]
def analyse_pdf(path, tool_version="v1.1", model="gpt-6-luna"):
with open(path, "rb") as f:
r = requests.post("https://cell-line-verifier.com/api/analyse",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"pdfs": (os.path.basename(path), f, "application/pdf")},
data={"tool_version": tool_version, "model": model},
timeout=30,)
r.raise_for_status()
return r.json()
print(analyse_pdf("test_paper_1.pdf"))
The same process can be repeated in the programming language of your choice.
The Cell Line Verifier team