diff --git a/README.md b/README.md
index 9954275f..57065cee 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,59 @@ TRAPI stands for [Translator Reasoner API](https://github.com/NCATSTranslator/Re
We maintain a live instance of this application at https://api.bte.ncats.io/ that can be used for testing. Query Examples can be found [here](/examples).
+### Trapi API Implementation
+```mermaid
+sequenceDiagram
+autonumber
+participant I as index.js - query()
+participant QG as query_graph.js
+participant BEQ as batch_edge_query.js
+participant Q2A as qedge2apiedge.js
+participant R as query_results.js
+participant C as call-apis module
+
+note over I, R: query_graph_handler module
+
+I->>QG: processQueryGraph()
+QG->>QG: Process TRAPI Query Graph Object into
internal qEdge and qXEdge representation
+note right of QG: qEdge - Edge in TRAPI query graph
qXEdge - Internal UpdatedExeEdge representation
of a qEdge to be executed
+QG->>I: return qXEdges
+
+I->>I: Inferred Mode: create
templated queries
+
+loop Executing with Edge Manager
+I->>I: while there are unexecuted qXEdges,
get next qXEdge
+
+I->>BEQ: BatchEdgeQueryHandler()
+BEQ->>BEQ: NodesUpdateHandler(): get equivalent IDs
+BEQ->>BEQ: cacheHandler(): fetch cached records
+
+alt if there are uncached qXEdges
+BEQ->>Q2A: QEdge2APIEdgeHandler()
+Q2A->>Q2A: convert qXEdges into API calls by using
metaKG to get metaEdges for qXEdge
+Q2A->>BEQ: return metaXEdges
+note right of BEQ: metaEdge - An edge in the metaKG
metaXEdge - A metaEdge pair with a qXEdge
+BEQ->>C: query()
+C->>C: make API calls in batches
and merge results
+C->>BEQ: return records from APIs
+end
+
+BEQ->>BEQ: cacheHandler(): cache result records
+note right of BEQ: record - A single unit of transformed
data from a sub-query response
+
+BEQ->>I: return records
+
+I->>I: Store records/update edge manager
+I->>I: Mark Edge as Executed
+end
+
+I->>R: trapiResultsAssembler
+R->>R: assemble and convert records into
final return results
+R->>I: put results in bteGraph
+note left of R: result - 1 item of the array in the
TRAPI response (message.results)
+I->>I: bteGraph: prune not fully connected
results from graph
+```
+
---