UniProt Cross-References to Interaction Databases: A Guide

By Dr. Zubair Khalid, DVM, MS, PhD ·

UniProt Cross-References to Interaction Databases: A Guide

By the end of this guide you will be able to do four things with confidence. First, you will read the cross-reference lines of a UniProt entry and know exactly which interaction database each line points to. Second, you will retrieve interaction cross-references for one protein or for an entire proteome using the UniProt REST API, with copy-paste commands and expected output. Third, you will map gene names and foreign identifiers onto UniProt accessions so that your own datasets can be joined against these cross-references. Fourth, you will validate the hits against the source databases and fold them into downstream pipelines for network building, benchmarking, and prediction.

To follow along you need a computer with internet access, a terminal with curl installed, and Python 3 with the requests library (pip install requests). No UniProt account is required. Every command shown works against the public endpoints as of writing, and the identifiers in the sample outputs are abbreviated or illustrative where noted, since cross-reference values change as the underlying databases update.

This article works as a focused UniProt database tutorial for the interaction corner of the resource. If you are new to UniProt as a whole, skim a few entries on the website first so the flat-file layout below looks familiar.

What a UniProt Interaction Cross-Reference Is

Comparison of IntAct, BioGRID, STRING and BindingDB cross-references by evidence type and identifier format.

UniProtKB, the UniProt Knowledgebase, contains two sections. Swiss-Prot entries are reviewed by expert curators. TrEMBL entries are computationally annotated and unreviewed. Every UniProtKB entry carries a block of cross-reference lines, abbreviated DR lines in the flat file, that link the entry to records in dozens of external databases. A subset of those external databases store protein interaction information.

The interaction-related cross-references you will encounter most often are these:

  • IntAct, a manually curated repository of molecular interactions maintained at EMBL-EBI, where each protein participant carries an identifier with the prefix EBI-.
  • BioGRID, a literature-curated database of physical and genetic interactions.
  • DIP, the Database of Interacting Proteins, a curated repository of experimentally determined interactions.
  • MINT, the Molecular INTeraction database, focused on experimentally verified interactions.
  • STRING, a database of predicted functional associations derived from genomic context, coexpression, text mining, and transferred evidence.
  • Complex Portal, a curated resource describing macromolecular protein complexes.
  • BindingDB, a repository of measured binding affinities, mostly for drug targets and their ligands.

The distinction between curated and predicted matters more than any naming detail. IntAct, BioGRID, DIP, and MINT cross-references trace back to published experiments. STRING cross-references describe predicted associations, which can include proteins that never physically contact each other but participate in the same pathway. Complex Portal links describe complexes, meaning a defined group of proteins that assemble together, which is related to but not identical with pairwise interaction. BindingDB links concern binding measurements rather than full interactome coverage.

UniProt also stores its own curated interaction annotation inside the entry, in a section headed INTERACTION within the comment lines. That section and the DR cross-reference block are two different layers of information. The cross-references point outward to the source databases. The INTERACTION comment block is UniProt's distilled summary, often with isoform details and evidence tags. Treat them as complementary, not interchangeable.

A practical reason to care about the cross-reference layer is that the source interaction databases disagree with each other. Primary databases recording experimentally supported human protein-protein interactions show limited overlap, so a comprehensive network requires integrating several heterogeneous datasets, and the choice of integration method changes the resulting network [1]. UniProt cross-references give you a single, stable starting point from which to reach all of those heterogeneous sources, keyed on one identifier system.

Retrieving UniProt Cross-References to Interaction Databases Step by Step

Flow from reading DR lines to checking hits, with the stream endpoint and TSV format noted.

This section is the operational core of the guide. Each step builds on the previous one, and the commands are ordered so you can run them in sequence on your own machine.

Step 1. Find the entry and read its DR lines

Start with a protein of interest. Human tumor protein p53 has the UniProtKB accession P04637, so it makes a good example. Retrieve the flat file in plain text:

curl -s https://rest.uniprot.org/uniprotkb/P04637.txt

To see only the cross-reference lines, pipe the result through grep:

curl -s https://rest.uniprot.org/uniprotkb/P04637.txt | grep "^DR"

You will see dozens of DR lines covering sequence, family, expression, and other databases. The interaction-relevant ones follow this pattern:

DR   BioGRID; <biogrid_id>; -.
DR   DIP; <dip_id>; -.
DR   IntAct; EBI-<number>; -.
DR   MINT; <mint_id>; -.
DR   STRING; P04637; -.

Angle brackets mark entry-specific values that change over time as the source databases grow. The format of every DR line is the same three parts separated by semicolons in the file. The first part is the database name. The second is the identifier of this protein in that database. The third is a secondary identifier or a dash. STRING cross-references use the UniProt accession itself as the identifier, because STRING builds its nodes on UniProt accessions. IntAct identifiers always begin with EBI-, which makes them easy to spot and easy to resolve back through IntAct's own pages.

The same flat file also contains the curated interaction summary. Pull it out with:

curl -s https://rest.uniprot.org/uniprotkb/P04637.txt | grep -A 12 "INTERACTION"

Read this block alongside the DR lines. If the INTERACTION block names a specific isoform or a self-association with a count, that level of detail lives here, not in the cross-references.

Step 2. Query the REST API for cross-reference fields

Downloading and grepping one flat file is fine for a single protein. For structured access, use the search endpoint of the UniProt REST API, which lets you select exactly the fields you want and receive them as tab-separated values.

curl -s "https://rest.uniprot.org/uniprotkb/search?query=accession:P04637+AND+organism_id:9606&fields=accession,id,xref_intact,xref_biogrid,xref_dip,xref_mint,xref_string,xref_complexportal&format=tsv"

The parameters that matter here are:

  • query restricts which entries are returned. accession:P04637 selects one entry, and organism_id:9606 pins the taxonomy to human so a stale or overlapping accession cannot leak in.
  • fields selects the columns of the output. accession and id give the UniProt accession and entry name. The xref_ prefixed fields return the cross-references for each named database, joined with the standard UniProt multi-value separator when an entry carries more than one.
  • format sets the output format. tsv is the most convenient for spreadsheets and parsing. json suits programs. txt returns the flat file.

An abbreviated view of the expected output looks like this, with tabs between columns:

Entry   Entry Name  IntAct  BioGRID DIP MINT    STRING  ComplexPortal
P04637  TP53_HUMAN  EBI-366144  1097    -   -   P04637  -

The exact values in your output depend on the current cross-reference state of the entry, and an empty column means the entry has no cross-reference to that database at this moment. An empty column is a real result, not an error.

Step 3. Retrieve cross-references for an entire proteome

Single-entry queries scale poorly. For all reviewed human entries, switch from the search endpoint to the stream endpoint, which is designed for large exports.

curl -s "https://rest.uniprot.org/uniprotkb/stream?query=reviewed:true+AND+organism_id:9606&fields=accession,id,xref_intact,xref_biogrid,xref_string&format=tsv" > human_reviewed_interaction_xrefs.tsv

The query reviewed:true limits results to Swiss-Prot. organism_id:9606 limits them to human. Swap in any NCBI taxonomy identifier for other species, for example 10090 for mouse. This command produces a file with one row per protein and one column per requested cross-reference source. Expect tens of thousands of rows for reviewed human entries, and expect a meaningful fraction of rows to be empty in the IntAct or BioGRID columns, because interaction curation is uneven across the proteome.

A useful second pass counts how many reviewed human entries carry at least one cross-reference to each source. You can do that later in Python, or at the command line:

curl -s "https://rest.uniprot.org/uniprotkb/stream?query=reviewed:true+AND+organism_id:9606&fields=accession,xref_intact&format=tsv" | awk -F"\t" 'NR>1 && $2!="" {n++} END {print n " entries with IntAct xrefs"}'

Step 4. Parse the results in Python

For anything beyond a quick count, pull the data into Python. The script below streams the same proteome-wide export row by row, counts entries with IntAct cross-references, and builds a dictionary mapping each UniProt accession to its cross-reference identifiers.

import csv
import requests

url = "https://rest.uniprot.org/uniprotkb/stream"
params = {
    "query": "reviewed:true AND organism_id:9606",
    "fields": "accession,id,xref_intact,xref_biogrid,xref_string",
    "format": "tsv",
}

xrefs = {}
with_intact = 0

with requests.get(url, params=params, stream=True, timeout=600) as response:
    response.raise_for_status()
    lines = (line.decode("utf-8") for line in response.iter_lines())
    reader = csv.reader(lines, delimiter="\t")
    header = next(reader)
    for row in reader:
        accession, entry_name, intact, biogrid, string_xref = row
        xrefs[accession] = {
            "entry_name": entry_name,
            "IntAct": [v for v in intact.split("; ") if v],
            "BioGRID": [v for v in biogrid.split("; ") if v],
            "STRING": [v for v in string_xref.split("; ") if v],
        }
        if xrefs[accession]["IntAct"]:
            with_intact += 1

print("Reviewed human entries retrieved:", len(xrefs))
print("Entries with at least one IntAct cross-reference:", with_intact)
print("Example:", xrefs.get("P04637"))

Expected output has this shape, with current counts filled in from your download:

Reviewed human entries retrieved: 20400
Entries with at least one IntAct cross-reference: 8700
Example: {'entry_name': 'TP53_HUMAN', 'IntAct': ['EBI-366144'], 'BioGRID': ['1097'], 'STRING': ['P04637']}

The stream=True argument in the request matters. It keeps the response body from being loaded into memory all at once, which is what you want when the export runs to hundreds of megabytes of text. The timeout applies to the connection and read phases between chunks, not to the total transfer.

Step 5. Map gene names and foreign identifiers to UniProt accessions

Your own data probably arrives keyed by gene symbols, Ensembl identifiers, or identifiers from the interaction databases themselves. Before you can join against UniProt cross-references, you need everything on the UniProt accession. The UniProt ID mapping service handles this.

Submit a mapping job:

curl -s -X POST https://rest.uniprot.org/idmapping/run -d from=Gene_Name -d to=UniProtKB_AC-ID -d ids=TP53,PIK3CA,MTOR

The service returns a job identifier immediately:

{"jobId": "00d3e0a48d8a4b3ea70e0f8f3d0a1b2c"}

Poll the status endpoint until it reports results are ready, then stream the results:

curl -s "https://rest.uniprot.org/idmapping/uniprotkb/results/stream/00d3e0a48d8a4b3ea70e0f8f3d0a1b2c?format=tsv"

Expected output:

From	To
TP53	P04637
PIK3CA	P42336
MTOR	P42345

The job identifier in these examples is illustrative. Your run will return its own identifier. Note that gene name mapping can return multiple accessions for one symbol, particularly for symbols shared across species or gene families, so always filter the results by taxonomy before joining.

For identifiers that live outside the UniProt naming space entirely, the Protein Identifier Cross-Reference service is the broader tool. PICR maps protein identifiers, sequences, and gene identifiers across source databases, using the UniProt Archive as a warehouse and returning matches based on 100 percent sequence identity, with interactive and programmatic access through REST and SOAP interfaces [2]. Since its initial release it has expanded its coverage and added gene identifier input and output through UniProtKB and Ensembl, plus a best-guess mapping mode and a sequence search entry point for mapping protein subsequences [3]. The 100 percent sequence identity rule is the key design point. PICR will not guess across near-identical sequences, which protects you from silent mismapping at the cost of leaving ambiguous cases unresolved.

Step 6. Validate the hits against the source databases

Cross-references are pointers, and pointers go stale or point at records whose annotation has moved on. Before you commit a cross-reference to your analysis, open it at the source. An IntAct identifier can be looked up on the IntAct website to see the experiment, publication, and detection method behind each interaction. A BioGRID identifier resolves to a page listing the literature evidence per interaction. A Complex Portal identifier resolves to a complex page with participant stoichiometry.

If you want programmatic validation, both IntAct and BioGRID expose web services, and BioGRID requires a free access key issued after registration. Keep validation cheap and targeted. In practice, spot-checking a random sample of cross-references, plus every cross-reference that drives a headline conclusion in your analysis, catches the problems that matter without turning validation into a full re-curation project.

A different situation arises when you hold your own affinity purification mass spectrometry data and want to derive interaction scores rather than inherit them from a database. Tools built for that purpose, such as SAINTq, score protein-protein interactions from affinity purification experiments using fragment or peptide intensity data [4]. In that workflow, public cross-references from UniProt serve as the reference set of known interactions against which your new scores are judged, rather than as the data itself.

Key API Fields and Parameters at a Glance

Field or parameterWhat it returnsNotes
, -, -, -
accessionUniProtKB accession, for example P04637Your join key for everything downstream
idEntry name, for example TP53_HUMANHuman-readable, changes rarely
xref_intactIntAct identifiers, EBI- prefixedCurated binary interactions
xref_biogridBioGRID identifiersLiterature-curated physical and genetic interactions
xref_dipDIP identifiersExperimentally determined interactions
xref_mintMINT identifiersExperimentally verified interactions
xref_stringSTRING identifiersPredicted functional associations, not curated binary interactions
xref_complexportalComplex Portal identifiersCurated protein complexes with defined stoichiometry
xref_bindingdbBindingDB identifiersMeasured binding affinities, uneven coverage
cc_interactionThe UniProt INTERACTION comment block as a fieldCurated summary, can be isoform-specific
query=reviewed:trueLimits results to Swiss-ProtStrongly recommended for network analyses
format=tsvTab-separated outputPair with stream for large exports

Using Cross-References in Downstream Analyses

Building integrated interaction networks

The cross-reference columns you exported are, in effect, several partial views of the same interactome stacked side by side. Deciding how to merge them is a research question in itself. One documented approach is PICKLE 2.0, a human protein-protein interaction meta-database that uses the reviewed human complete proteome from UniProtKB/Swiss-Prot as the reference interactor set and integrates primary datasets through a genetic information ontology rather than flattening everything to one normalized level up front, which lets users identify normalization artifacts later [1]. You do not need to reproduce that architecture to benefit from the idea. When you merge cross-references from IntAct, BioGRID, DIP, and MINT, record the source of every edge and keep the evidence level attached, so that artifacts introduced by merging remain visible.

If you would rather work inside an existing platform, Galaxy InteractoMIX provides thirteen computational tools covering interactomics from the cross-species interactome scale down to atomic-resolution analysis of complexes, including retrieval of consolidated interaction data distributed across several databases and ready-to-use workflows requiring minimal user intervention [5]. That platform is a reasonable choice when your priority is reproducible pipelines over bespoke code.

Benchmarking prediction methods against curated cross-references

Curated cross-references are the standard positive labels for benchmarking interaction prediction. The prediction field itself is active, particularly for peptide-protein interactions, where peptides participate in a large fraction of cellular protein-protein interactions and machine learning models have been developed to predict such interactions at lower computational cost than docking or molecular dynamics [6]. CAMP, a deep learning framework, predicts binary peptide-protein interactions and identifies binding residues along the peptide in a single pipeline [7]. More recently, the SWING interaction language model predicts peptide-major histocompatibility complex interactions across classes and predicts how sequence variants disrupt specific protein-protein interactions from sequence information alone [8]. For therapeutic peptide engineering specifically, a systematic assessment of sequence-based protein-protein interaction predictors found that similarity-based predictors were more suitable as a screening tool than the deep learning methods available at the time, and that this advantage holds mainly when natural interactors of the target are already known [9]. The lesson for anyone assembling a benchmark from UniProt cross-references is twofold. Curated cross-references are the ground truth layer that all of these methods are measured against, and the choice of benchmark interacts strongly with the use case, so build your positive and negative sets deliberately.

Structural and affinity resources complement the binary interaction cross-references when your work goes past the question of whether two proteins interact and into the question of how. Propedia v2.3 is a peptide-protein interaction database holding over 49,300 complexes with clustering by sequence, interface, and binding site, plus graph-based structural signatures for peptides [10]. A separate data resource compiles peptide-protein interaction structures together with binding affinities for peptide drug discovery work [11].

Annotating your own ligand and target evidence

When your project mixes experimental binding measurements with docking predictions, identifier standardization becomes the bottleneck. DockNmine is a web portal built for expert annotation of both experimental data and docking studies, created precisely because comparing predictions with experiments suffers from poor transferability of experimental data and nonstandard molecule naming [12]. The same naming discipline applies to protein identifiers. The cross-reference and mapping machinery described in the steps above is what keeps a docking result against one identifier from being compared silently against an experiment measured on a different one.

Practical Tips for Cleaner Results

Pin the organism in every query. Appending AND organism_id:9606 or the equivalent for your species to each search eliminates cross-species duplication, which is the most frequent cause of inflated row counts in merged tables.

Prefer reviewed entries for interaction work. TrEMBL entries carry cross-references too, but their identifiers are less stable and their annotation shallower. Restrict to reviewed:true unless you have a specific reason not to.

Keep predicted and curated sources in separate columns. STRING cross-references describe functional associations, some of which are not physical interactions. If you merge them into the same edge list as IntAct and BioGRID, your network silently changes meaning.

Request only the fields you need. The fields parameter exists precisely so that bulk downloads stay small. A stream request for three xref fields over the reviewed human proteome is a fraction of the size of a full flat-file export.

Snapshot and date your downloads. Cross-reference sets grow continuously. Save the query URL alongside the downloaded file, and record the UniProt release version shown on the website that day, so a collaborator can reproduce the exact dataset months later.

Handle multi-value cells explicitly. When an entry has several cross-references to the same database, the TSV field joins them with the UniProt multi-value separator. Split them, trim whitespace, and deduplicate before counting.

Cache API responses during development. While you are debugging a parsing script, write responses to disk and iterate on the saved files. This spares the public service unnecessary load and makes your debugging reproducible.

Spot-check before you scale. Validate a handful of cross-references at the source database before building a pipeline on top of ten thousand of them. The failure modes in the next section are easy to see in a sample and expensive to discover at scale.

Common Mistakes and Limitations

Confusing the cross-reference block with the INTERACTION annotation. These are different layers. The DR lines point to external database records. The INTERACTION comment block is UniProt's own curated summary, which can carry isoform-specific details absent from the external records. Reading only one of the two gives you an incomplete picture.

Assuming every cross-referenced interaction is a physical interaction. STRING cross-references include predicted associations, text-mining-derived links, and pathway co-membership. An edge list built from STRING xrefs is not an edge list of physical binding events. Filter by evidence type at the STRING level if physical interactions are what you need.

Ignoring isoform-specificity. An interaction may hold for one isoform of a protein and not another. The canonical sequence is not always the interacting species. Check the INTERACTION block and the source database record when isoform questions matter for your hypothesis.

Treating identifier mapping as a solved, one-to-one problem. Each major protein database assigns identifiers under its own conventions, and resolving which identifiers refer to identical proteins is a genuine challenge when unifying datasets from multiple sources [2]. Gene-name-to-accession mapping can return multiple hits per symbol. Map, filter by organism, resolve multiple hits manually or by sequence, and never join raw gene symbols directly against accessions.

Assuming the databases agree. Source databases recording experimentally supported interactions have limited overlap, and how you integrate them changes the integrated network [1]. Do not compute a single "interaction count" per protein by naively summing cross-references across sources, because the same interaction may be counted twice.

Letting query typos fail silently. If you request a field name that does not exist, the API rejects the request with an HTTP 400 response that identifies the invalid field. Check the response body rather than assuming the download succeeded. A defensive pattern in Python is to call response.raise_for_status() immediately after every request, which converts a 400 into a requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: ... traceback at the exact line that caused it.

Pounding the public API. Very rapid repeated requests can trigger rate limiting, which surfaces as HTTP 429. Use the stream endpoint for bulk work, request only the fields you need, and cache during development.

Reading cross-reference coverage as biological truth about the proteome. Interaction databases are biased toward well-studied proteins. A protein with an empty IntAct column may simply be under-studied, not non-interacting. Denominator-based claims, such as the fraction of your gene list that has known interactions, should acknowledge this curation bias explicitly.

Stale or changed cross-references. Source databases reorganize, retire identifiers, and update records. If a cross-reference fails to resolve, first confirm the UniProt entry version you downloaded, then check whether the source database renamed the record. A validation step from Step 6 catches this before it reaches a figure.

On limitations more broadly, every number and edge list you produce from cross-references is a snapshot of a moving resource, filtered through curation priorities that favor some proteins and evidence types over others. State the snapshot date, the query, and the field list in your methods section, and interpret absence of a cross-reference as absence of evidence.

Frequently Asked Questions

What are UniProt cross-references to interaction databases?

They are links stored in the DR lines of each UniProtKB entry that point to this protein's record in external interaction resources such as IntAct, BioGRID, DIP, MINT, STRING, Complex Portal, and BindingDB. They let you start from a stable UniProt accession and reach every interaction record held for that protein across heterogeneous sources.

How do I retrieve interaction cross-references for an entire proteome?

Use the UniProt REST stream endpoint with a query such as reviewed:true AND organism_id:9606, list the xref_ fields you want in the fields parameter, and set format=tsv. This returns one row per protein with the cross-reference identifiers as columns, which you can parse with any spreadsheet or scripting language.

Which interaction databases does UniProt link to?

The main interaction-related cross-references are to IntAct, BioGRID, DIP, and MINT for experimentally curated interactions, to STRING for predicted functional associations, to Complex Portal for curated protein complexes, and to BindingDB for measured binding affinities. Each source has a different evidence standard, so treat the columns separately rather than as one uniform interaction list.

How do I map a gene name to a UniProt accession?

Submit the gene symbols to the UniProt ID mapping service with from=Gene_Name and to=UniProtKB_AC-ID, poll the job status, and stream the results. Filter by organism afterward, because gene symbols can map to multiple species. For identifiers from other database naming schemes, the PICR service maps protein identifiers and sequences across a large set of source databases based on 100 percent sequence identity.

Why do IntAct and BioGRID disagree for the same protein?

The two databases curate different slices of the literature with different scopes, detection-method criteria, and update schedules, and experimentally supported interaction databases in general show limited overlap with one another. Disagreement usually reflects differences in what each database chose to capture, not an error in either one, so integrating both with evidence attached is the standard practice.

How do I tell predicted interactions from experimental ones?

By source. IntAct, BioGRID, DIP, and MINT cross-references trace to published experiments curated by their teams. STRING cross-references describe predicted functional associations derived from genomic context, coexpression, text mining, and transferred evidence. The UniProt INTERACTION comment block adds evidence detail for its own curated annotations.

Can I train a machine learning model on these cross-references?

Yes, curated cross-references are widely used as positive labels for interaction prediction. Be deliberate about the negative set, watch for the well-studied-protein bias in the labels, and separate sources by evidence type so a model is not trained to reproduce STRING's prediction methodology rather than physical interaction. Structural and affinity databases can supplement the binary labels when your task requires binding-site or affinity information.

How current is the cross-reference data?

UniProt publishes on a regular release schedule, and cross-references are refreshed as the source databases update their records. There is no real-time guarantee between releases, so record the release version and download date with every dataset you generate, and re-run your queries when you need the current state rather than assuming an old file is still accurate.

Sources

  1. PICKLE 2.0: A human protein-protein interaction meta-database employing data integration via genetic information ontology.
  2. The Protein Identifier Cross-Referencing (PICR) service: reconciling protein identifiers across multiple source databases.
  3. Improvements in the Protein Identifier Cross-Reference service.
  4. SAINTq: Scoring protein-protein interactions in affinity purification - mass spectrometry experiments with fragment or peptide intensity data
  5. Galaxy InteractoMIX: An Integrated Computational Platform for the Study of Protein-Protein Interaction Data.
  6. Leveraging machine learning models for peptide-protein interaction prediction
  7. A deep-learning framework for multi-level peptide-protein interaction prediction
  8. Sliding Window Interaction Grammar (SWING): a generalized interaction language model for peptide and protein interactions
  9. Assessing sequence-based protein-protein interaction predictors for use in therapeutic peptide engineering
  10. Propedia v2.3: A novel representation approach for the peptide-protein interaction database using graph-based structural signatures
  11. A data resource of peptide-protein interaction structures and binding affinities for peptide drug discovery
  12. DockNmine, a Web Portal to Assemble and Analyse Virtual and Experimental Interaction Data.