saprfclib - Pure Python SAP RFC Protocol Implementation
saprfclib is a pure-Python reimplementation of the SAP RFC wire protocol - zero
native/C dependencies. Call any SAP function module from Python with just a pip install.
Supports direct TCP, SAProuter, message server (load-balanced), SNC (X.509/Kerberos),
and WebSocket RFC (SAP BTP/cloud) connections. Requires Python 3.12 or later.
No SAP NetWeaver RFC SDK. No C compiler. No LD_LIBRARY_PATH. No container image built
around a proprietary .so.
Installation
pip install saprfclib
Pulls two pure-Python dependencies (wsproto and h11)
Quick Start
import saprfclib
conn = saprfclib.connect(
ashost="your-sap-host", # Application server hostname or IP
sysnr=0, # System number (port = 3300 + sysnr)
client="100", # SAP client (Mandant)
user="RFC_USER", # SAP logon user
passwd="secret", # Password (never logged by saprfclib)
)
result = conn.call("STFC_CONNECTION", REQUTEXT="Hello from saprfclib!")
print(result["ECHOTEXT"]) # "Hello from saprfclib!"
print(result["RESPTEXT"]) # SAP server response text
conn.close()
conn.call() fetches function module metadata from DDIC on the first call and caches
it in-process - no configuration needed.
Connection Options
| Mode | Key Parameters |
|---|---|
| Direct TCP | ashost, sysnr |
| SAProuter | ashost, sysnr, saprouter="/H/router/S/3299/H/target" |
| Message server | mshost, sysid, group |
| SNC (X.509 / Kerberos) | snc_lib, snc_partnername, snc_qop |
| WebSocket RFC | wshost, wsport, ws_path |
| SOCKS5 proxy (SAP BTP) | proxy_type="socks5", proxy_host, proxy_port (+ proxy_jwt / OAuth triple) |
Reach an on-premise system through the SAP BTP Connectivity Proxy / Cloud Connector (e.g. from a Kyma workload) with no NW RFC SDK or Transparent Proxy:
# trusted mode (no proxy authentication)
conn = saprfclib.connect(
ashost="s4-2025-raw", sysnr="00", client="001", user="Developer", passwd="...",
proxy_type="socks5",
proxy_host="connectivity-proxy.kyma-system.svc.cluster.local",
proxy_port=20004,
gwhost="vhcala4hci", # SAP system's internal host (ashost is the virtual tunnel host)
)
# untrusted mode — SAP JWT (method 0x80), token fetched via client_credentials
conn = saprfclib.connect(
ashost="s4-2025", sysnr="00", client="001", user="Developer", passwd="...",
proxy_type="socks5", proxy_host="...", proxy_port=20004,
proxy_client_id="...", proxy_client_secret="...",
proxy_token_url="https://<subaccount>.authentication.<region>.hana.ondemand.com/oauth/token",
proxy_scc_location_id="MyLocation", # optional Cloud Connector location
)
# or let saprfclib read the bound Connectivity service (VCAP_SERVICES / SERVICE_BINDING_ROOT)
cfg = saprfclib.connectivity_proxy_kwargs() # add with_auth=False in trusted mode
conn = saprfclib.connect(ashost="s4-2025", sysnr="00", client="001",
user="Developer", passwd="...", **cfg)
See the Connection Options guide for the full parameter reference.
Documentation
Full documentation: https://randomstr1ng.github.io/saprfclib/
- Getting Started - install, connect, and make your first call in 10 minutes
- Cookbook - TABLE parameters, RFC server, tRFC/qRFC, connection pool, SNC, WebSocket RFC
- API Reference - auto-generated from typed docstrings via MkDocs + mkdocstrings
- Protocol Docs - NI/CPIC framing, ABAP type serialization, RFC handshake, SNC, tRFC/bgRFC wire specs
Example Scripts
The examples/ directory contains runnable scripts for common patterns:
| Script | Pattern |
|---|---|
examples/01_connect_and_call.py |
Basic connect → call → close |
examples/02_table_params.py |
RFC_READ_TABLE with TABLE parameters |
examples/03_connection_pool.py |
Multi-threaded connection pool |
examples/04_trfc_submit.py |
tRFC / qRFC lifecycle |
examples/05_rfc_server.py |
RFC server with handler |
examples/06_snc_connection.py |
SNC X.509 connection |
examples/07_websocket_rfc.py |
WebSocket RFC to SAP BTP |
All examples read connection parameters from SAPRFC_* environment variables.
Development
git clone https://github.com/randomstr1ng/saprfclib
cd saprfclib
pip install -e ".[dev]"
# Run offline test suite (no live SAP needed)
hatch run test -m "not integration"
# Lint and format
hatch run lint:check
hatch run lint:fmt
# Type-check
hatch run lint:type
# Build wheel + sdist
hatch build
Live integration tests require a running SAP system. Set environment variables:
export SAPRFC_ASHOST=your-sap-host
export SAPRFC_SYSNR=0
export SAPRFC_CLIENT=100
export SAPRFC_USER=RFC_USER
export SAPRFC_PASSWD=secret
pytest -m integration
See CONTRIBUTING.md for the full contributor guide, and CLAUDE.md for the protocol-fidelity rules every change must follow.
License
Licensed under the Mozilla Public License 2.0 - see LICENSE.
MPL-2.0 is deliberate: you may use saprfclib inside a closed-source, commercial
product with no obligation to release your own code. If you modify saprfclib's own
source files, those modified files must remain under MPL-2.0 and be made available.
Improvements to the library flow back; your product stays yours.
Trademarks and Affiliation
This project is not affiliated with, endorsed by, or supported by SAP SE. SAP,
ABAP, SAP NetWeaver, SAProuter, and SAP S/4HANA are trademarks or registered
trademarks of SAP SE in Germany and other countries, used here for identification
only. saprfclib contains no SAP code, binaries, or headers. Using it does not grant
you any licence to SAP software - you remain responsible for your own SAP licensing.
See NOTICE for details.
Metadata
Release files for saprfclib 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| saprfclib-0.1.8.tar.gz | 894.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| saprfclib-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / saprfclib-0.1.8.tar.gz
| Download URL | saprfclib-0.1.8.tar.gz |
|---|---|
| Size | 894.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
256d454403560ec6a52f5e23ce57748a32bf99961f982ff04a8555912d8f9822
|
|
BLAKE2b-256 checksum How to use checksums |
8482f8f09bfeda2af9648a19495d524b362ab31d6bc0700f9754bad787cd0aa8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency logRelease files / saprfclib-0.1.8-py3-none-any.whl
| Download URL | saprfclib-0.1.8-py3-none-any.whl |
|---|---|
| Size | 263.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
47856d4b0aebdd7a85493cd864fe34ccd5132d7382c4f2477e21202a74617af8
|
|
BLAKE2b-256 checksum How to use checksums |
c0364cac3cf0757c561636cb9931e1a9456d13145a2554bc4dafa0aeb9cb23f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency log