# UniProt to IntAct Link: Step-by-Step Guide

By the end of this guide you will be able to take any protein in UniProt, find the IntAct cross-references attached to it, pull the underlying binary interaction records, parse them into a clean table of interacting pairs, and export the same data in bulk for thousands of proteins at once. Everything runs on the public REST interfaces of UniProt and IntAct, so no local database installation is required.

Here is what you need on hand before the walkthrough:

- A Unix-like shell (Linux, macOS, or WSL on Windows)
- `curl` for HTTP requests, `jq` for JSON parsing, and Python 3 with the standard library only
- A UniProt accession (this guide uses human TP53, accession P04637, as the worked example)
- Internet access to `rest.uniprot.org` and `www.ebi.ac.uk`

## How to Use UniProt Before You Touch IntAct

If you are new to UniProt, two minutes of orientation will save you hours. UniProt is the reference protein knowledgebase maintained by the UniProt Consortium. Its core product, UniProtKB, is split into two sections. Swiss-Prot entries are reviewed by human curators and carry a single stable accession such as P04637. TrEMBL entries are computationally annotated and unreviewed, and they carry accessions in a separate namespace, such as A0A024RBG1. When you plan to follow the UniProt to IntAct link, work with reviewed Swiss-Prot entries whenever you can, because curated entries are the ones IntAct cross-references most reliably.

A quick UniProt database tutorial in four moves:

1. Go to https://www.uniprot.org and type a gene name into the search box, for example `TP53`.
2. Constrain the search when it returns too much. Useful query terms include `gene:TP53`, `organism_id:9606` for human, and `reviewed:true` to keep only Swiss-Prot entries.
3. On the entry page, use the section tabs. The Function tab summarizes activity and domains, the Interaction tab lists curated interaction partners, and the Cross-references tab lists links to dozens of external resources, including IntAct.
4. Note the accession, not the entry name. P04637 is stable. The entry name TP53_HUMAN is mnemonic and can change between releases.

The same search works through the REST interface, which is what scripts should use:

```
curl -s "https://rest.uniprot.org/uniprotkb/search?query=gene:TP53+AND+organism_id:9606+AND+reviewed:true&fields=accession,id,gene_names,protein_name&format=tsv"
```

Expected output:

```
Entry	Entry Name	Gene Names	Protein Names
P04637	TP53_HUMAN	TP53 ...	Cellular tumor antigen p53
```

One row, one accession. That accession is the key that unlocks IntAct.

## What IntAct Is and Where It Fits

IntAct is the molecular interaction database at the [European Bioinformatics Institute](/knowledge/bioinformatics/the-european-bioinformatics-institute-embl-ebi) (EMBL-EBI). Its curators read primary literature, encode each reported interaction in the PSI-MI controlled vocabulary, and store every experiment, participant, and method annotation in a structured database. Interaction data flows outward in three directions that matter to you:

- Cross-references inside UniProt entries
- A REST web service for on-the-fly queries
- Bulk MITAB and PSI-MI XML files on the IntAct FTP site

The UniProt to IntAct link is concrete: every UniProtKB entry that participates in a curated interaction carries one or more `DR   INTACT` cross-reference lines in the flat-file format, and a matching IntAct row in the JSON representation. Each of those cross-references resolves to an IntAct interactor or interaction record identified by an EBI accession such as EBI-366086. From that handle you can fetch the full interaction evidence in IntAct.

## The UniProt to IntACT Link, Step by Step

![Five step flow from resolving a UniProt accession through IntAct cross-references and MITAB download to a deduplicated, validated pair table.](/article-images/illustrations/uniprot-to-intact-link-uniprot-intact-pipeline.webp)

This walkthrough uses human TP53 (P04637) throughout. Substitute any accession you care about.

### Step 1: Confirm the Accession You Intend to Use

Gene names are ambiguous across species. Before anything else, resolve your gene to exactly one reviewed UniProt accession using the REST search shown above, or the website search with `reviewed:true`. Record the accession in a shell variable so the rest of the pipeline is reproducible:

```
ACC=P04637
echo $ACC
```

Expected output:

```
P04637
```

If your input is a list of gene names rather than a single accession, skip ahead to Step 6 and come back here afterward. The order of steps does not matter, but a pipeline built on gene names will eventually break, and Step 6 fixes that at the source.

### Step 2: Read the Interaction Section on the UniProt Entry Page

Open https://www.uniprot.org/uniprotkb/P04637 and scroll to the Interaction section. You will see curated binary interactions in plain language, for example self-association, interaction with MDM2, and dozens of partnerships, each annotated with the number of publications supporting it. Below the list, each interaction points to an IntAct cross-reference with an EBI identifier.

In the Cross-references section, find the IntAct row. It shows a count and links straight into IntAct filtered on that protein. This is the manual version of the UniProt to IntAct link, and it is the best way to sanity-check everything the scripts in later steps produce.

### Step 3: Pull the IntAct Cross-References with the UniProt REST API

The JSON representation of a UniProt entry lists cross-references in the `uniProtKBCrossReferences` array, each tagged with the source database name. Filter for IntAct:

```
curl -s "https://rest.uniprot.org/uniprotkb/${ACC}.json" | \
  jq -r '.uniProtKBCrossReferences[] | select(.database=="INTACT") | .id'
```

Expected output (abbreviated):

```
EBI-366086
EBI-366086
EBI-768897
EBI-768919
...
```

Each line is an IntAct record identifier. You may see the same identifier repeated when one IntAct record supports several annotated views, and you may see different identifiers for the same partner when separate experiments exist. These EBI numbers are IntAct interactor and interaction accessions, not UniProt accessions. Keep them, but do not feed them back into UniProt.

If the command returns nothing, the entry has no IntAct cross-references. That usually means either the protein is unreviewed or no curated interaction record exists for it yet. Re-check with `reviewed:true` in Step 1 before concluding the protein truly has no recorded interactions.

### Step 4: Query the IntAct REST Service Directly

You do not have to go through UniProt at all. IntAct exposes its own REST interface where you can ask for every binary interaction involving an identifier:

```
curl -s "https://www.ebi.ac.uk/intact/ws/interaction/findInteractor?query=${ACC}&format=json" | \
  jq 'length'
```

Expected output is a single integer, the number of binary interaction records involving P04637:

```
3xx
```

The exact number changes as curators add records, so treat it as an order of magnitude. Each element of the returned array is one binary interaction with its own IntAct accession, participants, detection method, interaction type, and publication references. The response is rich, so for programmatic work most people switch to the tabular format in the next step, which flattens the same records into one line per interaction.

Querying with a UniProt accession works because IntAct stores UniProtKB accessions as its primary interactor identifiers. This is the technical heart of the UniProt to IntAct link: the join key is the accession itself, and no conversion step is needed when you start from a Swiss-Prot accession.

### Step 5: Download the Pairwise Table in MITAB Format

The Proteomics Standards Initiative tabular format (MITAB) is the workhorse exchange format for interaction data. Version 2.5 has 15 tab-separated columns per interaction record. IntAct serves it through its PSICQUIC-compatible endpoint:

```
curl -s "https://www.ebi.ac.uk/intact/psicquic/webservices/current/search/interactor/${ACC}?format=tab25&firstResult=0&maxResults=1000" \
  > p04637_mitab.tsv
wc -l p04637_mitab.tsv
```

Expected output is the number of interaction records downloaded, for example:

```
3xx p04637_mitab.tsv
```

Look at the columns you will use most:

```
cut -f1,2,9,15 p04637_mitab.tsv | head -3
```

Expected output (abbreviated, columns 1, 2, 9, and 15):

```
uniprotkb:P04637	uniprotkb:Q00987	pubmed:...	intact-miscore:0.80
uniprotkb:P04637	uniprotkb:Q13309	pubmed:...	intact-miscore:0.66
uniprotkb:P04637	uniprotkb:P04637	pubmed:...	intact-miscore:0.73
```

Reading the fields: column 1 and column 2 hold the two participants, column 9 lists publication identifiers such as `pubmed:12345678`, and column 15 holds the IntAct confidence score (`intact-miscore`), a value between 0 and 1 that increases with the number of publications and independent detection methods backing an interaction. The third row of the sample above is a self-interaction, P04637 paired with itself, which is biologically real for p53 homodimerization.

The following Python script turns the raw file into a deduplicated table of UniProt accession pairs, preserving which publications supported each pair:

```python
import csv
from collections import defaultdict

pairs = defaultdict(set)

def first_uniprot(cell):
    for token in cell.split("|"):
        if token.startswith("uniprotkb:"):
            # strip isoform suffixes such as P04637-2
            return token.split(":", 1)[1].split("-", 1)[0]
    return None

with open("p04637_mitab.tsv") as fh:
    for row in csv.reader(fh, delimiter="\t"):
        if not row or row[0].startswith("#"):
            continue
        if len(row) < 15:
            continue
        a, b = first_uniprot(row[0]), first_uniprot(row[1])
        pub = row[8]
        if a and b:
            pair = tuple(sorted((a, b)))
            pairs[pair].add(pub)

for (a, b), pubs in sorted(pairs.items()):
    print(f"{a}\t{b}\t{len(pubs)}\t{','.join(sorted(pubs))}")
```

Expected output (abbreviated):

```
P04637	P04637	2	pubmed:...
P04637	Q00987	9	pubmed:...
P04637	Q13309	3	pubmed:...
...
```

The counts in column 3 are the number of distinct publications, which is the most defensible simple ranking you can compute from this file. Write the output to a file with `python3 script.py > p04637_pairs.tsv` if you want to keep it.

### Step 6: Map Gene Names to UniProt Accessions

Most collaborator spreadsheets contain gene symbols, not accessions. UniProt provides an identifier mapping service that converts between identifier spaces, and its REST workflow has three stages: submit a job, poll it, and stream the results.

Submit the mapping job:

```
curl -s -X POST -H "Accept: application/json" \
  -d "ids=TP53,MDM2,CDKN1A" \
  -d "from=Gene_Name" \
  -d "to=UniProtKB" \
  https://rest.uniprot.org/idmapping/uniprotkb/run
```

Expected output:

```
{"jobId":"c59884a41e69a1a3c5f5b6d17c6d8b6e8a2f7b1c"}
```

Capture the job identifier and stream the results. Small jobs complete almost instantly, while large jobs may require polling the status endpoint first:

```
JOB=c59884a41e69a1a3c5f5b6d17c6d8b6e8a2f7b1c
curl -s "https://rest.uniprot.org/idmapping/uniprotkb/results/stream/${JOB}" \
  -H "Accept: application/json" | \
  jq -r '.results[] | "\(.from)\t\(.to)"'
```

Expected output:

```
TP53	P04637
MDM2	Q00987
CDKN1A	P38936
```

Now feed the mapped accessions to IntAct, one query per accession, and you have a pipeline that starts from gene symbols and ends in a deduplicated interaction table. Map first, query second. Never pass gene symbols to IntAct and hope, because symbols collide across species and across genes.

### Step 7: Validate the Result

Three checks catch most silent failures.

First, confirm the taxonomy. Columns 10 and 11 of every MITAB line carry NCBI taxonomy identifiers, human is 9606. A quick check tells you whether any cross-species rows slipped in:

```
cut -f10,11 p04637_mitab.tsv | grep -v "9606" | sort | uniq -c
```

Expected output for a clean human query:

```
(none, or a small list you then decide to keep or discard)
```

Second, check interaction types. Column 12 encodes the PSI-MI interaction type. `MI:0407` means direct interaction, `MI:0403` means colocalization, which is evidence that two proteins were found in the same cellular compartment rather than evidence of binding. If your analysis requires physical binding, filter accordingly:

```
cut -f12 p04637_mitab.tsv | grep -c "MI:0403"
```

Third, cross-check against UniProt. Open the UniProt entry page, count the interactions listed in the Interaction section, and compare with your deduplicated pair count. They should be the same order of magnitude. Large discrepancies usually mean one source was updated more recently than the other, because UniProt and IntAct synchronize on their own schedules, or that your MITAB filter dropped records.

### Step 8: Bulk Download for Large-Scale Analyses

Querying one protein at a time does not scale. IntAct publishes the complete database as MITAB files on its FTP site, refreshed on a rolling daily schedule, with species-specific subsets available:

```
curl -O "https://ftp.ebi.ac.uk/intact/daily/psimitab/intact.zip"
unzip intact.zip -d intact_mitab
ls intact_mitab
```

Expected output is a large tab-separated file, for example `intact.txt`, several gigabytes uncompressed. To extract all interactions for your accession list, filter on the identifier columns:

```
awk -F'\t' \
  '($1 ~ /uniprotkb:P04637/ || $2 ~ /uniprotkb:P04637/) && NR>1' \
  intact_mitab/intact.txt > p04637_from_bulk.tsv
wc -l p04637_from_bulk.tsv
```

The row count should land in the same range as your PSICQUIC query from Step 5. Small differences are expected because the bulk file is a snapshot and the live service moves forward. For genome-scale work, load the bulk file once into a local database or pandas DataFrame, and do all your filtering locally. That approach is faster, reproducible, and puts zero load on the public service.

## Reference Table: Endpoints, Formats, and When to Use Each

![Branching path from accession or gene symbol to ID mapping, live queries or bulk download, ending in MITAB or PSI-MI XML.](/article-images/illustrations/uniprot-to-intact-link-intact-query-route.webp)

| Task | Address | Format | Use when |
|--|--|--|--|
| Browse one protein manually | uniprot.org/uniprotkb/ACCESSION | Web page | Checking a single protein |
| UniProt entry data in scripts | rest.uniprot.org/uniprotkb/ACCESSION.json | JSON | Extracting IntAct cross-references |
| Gene name to accession | rest.uniprot.org/idmapping | JSON workflow | Input is symbols, not accessions |
| Query IntAct live | ebi.ac.uk/intact/ws | JSON | One-off programmatic queries |
| Pairwise tabular export | ebi.ac.uk/intact/psicquic ... format=tab25 | MITAB 2.5 TSV | Parsed pair tables, moderate scale |
| Full database export | ftp.ebi.ac.uk/intact/daily/psimitab | MITAB zip | Thousands of proteins at once |

## UniProt to IntACT Link Tips

These tips address the questions that come up repeatedly in practice.

- Cache your downloads. Save every API response to disk with a timestamp in the filename. IntAct and UniProt update continuously, so a result table without a retrieval date is impossible to reproduce.
- Work at the accession level end to end. Convert gene symbols to accessions once, at the start, then throw away the symbols.
- Treat the MiScore as a ranking, not a probability. It is derived from publication and method counts inside IntAct, so it tells you how much curated evidence backs a record, not the chance the interaction is true.
- Filter by interaction type before you build networks. Colocalization and phenotype records are useful in the right question and noise in the wrong one.
- Keep publication identifiers. They are your audit trail back to the experiments, and they let you deduplicate honestly.
- For literature-heavy proteins, expect hundreds of records. The number of interaction records is not the number of partners. Always deduplicate before counting partners.
- When a partner appears only as an isoform identifier such as P04637-2, decide explicitly whether your analysis is isoform-level or protein-level, and strip suffixes in one documented place, not ad hoc.

## Common Mistakes and Limitations

These are the errors that actually corrupt downstream analyses, with fixes.

- **Using the entry name instead of the accession.** IntAct indexes interactors by UniProtKB accession. Sending `TP53_HUMAN` to the IntAct service returns nothing, silently. Fix: always resolve names to accessions first, as in Step 1 and Step 6.
- **Mapping gene symbols without constraining species.** The symbol TP53 resolves cleanly in human, but many symbols map to several organisms at once. Fix: pass `organism_id:9606` (or your taxon) when resolving, then keep only reviewed hits.
- **Mixing unreviewed TrEMBL accessions into the analysis.** Unreviewed entries can appear in interaction files and can duplicate a curated protein under a second accession. Fix: restrict inputs to `reviewed:true` and collapse any TrEMBL accessions to their reviewed parent where one exists.
- **Stripping isoform suffixes blindly.** `P04637-1` and `P04637-2` are distinct sequences with distinct interaction records. Collapsing them loses biology. Fix: carry the suffix through your pipeline and document where you collapse it.
- **Counting records instead of pairs.** One pair supported by nine papers appears nine times or more in raw MITAB. Fix: deduplicate on the sorted accession pair, as in the Step 5 script.
- **Treating colocalization as binding.** `MI:0403` records mean shared compartment, not physical contact. Fix: filter on interaction type for the question you are asking.
- **Dropping or mangling self-interactions.** Homodimers are real edges, and naive graph code that skips edges where both ends are equal deletes them. Fix: decide on a policy, usually keeping self-loops, and apply it consistently.
- **Confusing the two kinds of EBI numbers.** The `EBI-` identifier in a UniProt cross-reference identifies an IntAct interactor or interaction record. The `EBI-` number in MITAB column 14 identifies the interaction. They are different objects in the same namespace. Fix: never join on EBI numbers across the two sources, join on UniProt accessions.
- **Assuming both resources agree perfectly at all times.** Cross-reference counts in UniProt and live counts in IntAct can differ between update cycles. Fix: record retrieval dates and compare orders of magnitude, not exact integers.
- **Hammering the live API for thousands of proteins.** Sequential one-protein requests waste hours and load a shared public service. Fix: use the FTP bulk export in Step 8 for anything beyond a few dozen proteins.

On limitations: IntAct is a curated, literature-derived database. It records what published experiments reported, which means it is biased toward well-studied proteins and lacks unreported or unpublished interactions. Absence of an interaction record is absence of evidence, not evidence of absence. Before any downstream claim reaches a manuscript, verify the underlying publications listed in column 9, because curation summarizes experiments and does not replace reading them.

## Frequently Asked Questions

### What is the difference between the interactions shown in UniProt and the records in IntAct?

UniProt shows a human-readable summary on each entry page, derived from interaction data including IntAct records, while IntAct stores the full structured evidence. Start in UniProt to browse, go to IntAct when you need method details, publication lists, and exports.

### How do I find all interaction partners for a UniProt accession?

Query the IntAct PSICQUIC endpoint with `search/interactor/ACCESSION?format=tab25`, parse the MITAB columns 1 and 2 for `uniprotkb:` identifiers, then deduplicate the pairs. The full command and parser are in Step 5.

### Can I query IntAct with a gene name like TP53 instead of an accession?

You can, and it often works, but it is fragile because gene symbols are not unique. The reliable route is to map symbols to UniProt accessions first using the UniProt ID mapping service, then query IntAct with accessions.

### What does the intact-miscore number mean?

It is IntAct's confidence score, ranging from 0 to 1, computed from the amount of curated evidence behind an interaction, mainly the number of publications and distinct detection methods. Use it to rank records, and prefer filtering on evidence type and publications for stringent analyses.

### Should I download PSI-MI XML or MITAB?

Use MITAB (tab25) for pair tables that feed scripts, spreadsheets, and networks. Use PSI-MI XML when you need full experimental detail such as participants in complexes and feature-level annotations, which the flat table does not carry.

### Why does my UniProt entry show no IntAct cross-reference?

Most often the entry is unreviewed, or no curated interaction record exists for that protein yet. Confirm the entry is Swiss-Prot with `reviewed:true`, and check the IntAct website directly before concluding the data is absent.

### How do I get all human protein-protein interactions from IntAct at once?

Download the bulk MITAB export from the IntAct FTP site at `ftp.ebi.ac.uk/intact/daily/psimitab`, filter on the human taxonomy identifier 9606 in columns 10 and 11, and load the result locally. This is far faster than per-protein API calls.

### Is IntAct the same data as BioGRID or DIP?

No. Each is a separate curation effort with overlapping scope. IntAct participates in the IMEx consortium, which promotes shared curation standards among interaction databases, so records imported from consortium partners may overlap, but the databases remain distinct resources with different curation emphases.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the difference between the interactions shown in UniProt and the records in IntAct?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "UniProt shows a human-readable summary on each entry page, derived from interaction data including IntAct records, while IntAct stores the full structured evidence. Start in UniProt to browse, go to IntAct when you need method details, publication lists, and exports."
      }
    },
    {
      "@type": "Question",
      "name": "How do I find all interaction partners for a UniProt accession?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Query the IntAct PSICQUIC endpoint with search/interactor/ACCESSION?format=tab25, parse the MITAB columns 1 and 2 for uniprotkb identifiers, then deduplicate the pairs."
      }
    },
    {
      "@type": "Question",
      "name": "Can I query IntAct with a gene name like TP53 instead of an accession?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "You can, and it often works, but it is fragile because gene symbols are not unique. The reliable route is to map symbols to UniProt accessions first using the UniProt ID mapping service, then query IntAct with accessions."
      }
    },
    {
      "@type": "Question",
      "name": "What does the intact-miscore number mean?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It is IntAct's confidence score, ranging from 0 to 1, computed from the amount of curated evidence behind an interaction, mainly the number of publications and distinct detection methods. Use it to rank records, and prefer filtering on evidence type and publications for stringent analyses."
      }
    },
    {
      "@type": "Question",
      "name": "Should I download PSI-MI XML or MITAB?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Use MITAB (tab25) for pair tables that feed scripts, spreadsheets, and networks. Use PSI-MI XML when you need full experimental detail such as participants in complexes and feature-level annotations, which the flat table does not carry."
      }
    },
    {
      "@type": "Question",
      "name": "Why does my UniProt entry show no IntAct cross-reference?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Most often the entry is unreviewed, or no curated interaction record exists for that protein yet. Confirm the entry is Swiss-Prot with reviewed:true, and check the IntAct website directly before concluding the data is absent."
      }
    },
    {
      "@type": "Question",
      "name": "How do I get all human protein-protein interactions from IntAct at once?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Download the bulk MITAB export from the IntAct FTP site at ftp.ebi.ac.uk/intact/daily/psimitab, filter on the human taxonomy identifier 9606 in columns 10 and 11, and load the result locally. This is far faster than per-protein API calls."
      }
    },
    {
      "@type": "Question",
      "name": "Is IntAct the same data as BioGRID or DIP?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Each is a separate curation effort with overlapping scope. IntAct participates in the IMEx consortium, which promotes shared curation standards among interaction databases, so records imported from consortium partners may overlap, but the databases remain distinct resources with different curation emphases."
      }
    }
  ]
}
</script>