IntaOps Connector — Python
Drop-in Python SDK for the IntaOps SMART-on-FHIR R4 network.
pip install intaops
Prerequisites
Before the SDK can call IntaOps, you need OAuth credentials — client_id + client_secret. Get them from the IntaOps Dashboard:
- Sign in → Developer Portal → Applications (
https://intaops.io/applications) - Create an Application — pick
client_credentialsfor backend services, orauthorization_codefor provider / patient-facing apps - Copy the
client_secretwhen shown — it's revealed once. Keep it server-side, never in browser code.
The SDK handles the OAuth token exchange (POST /oauth/token) for you — IntaOpsClient(client_id=…, client_secret=…) is enough. Access tokens are short-lived (~5 min) and refreshed automatically.
Backend (system-to-system)
from intaops import IntaOpsClient
client = IntaOpsClient(
client_id="app_live_…",
client_secret="secret_live_…",
environment="live", # or "sandbox"
scopes=["system/Patient.read", "system/Observation.read"],
)
patient = client.fhir.get("Patient", "u123")
for obs in client.fhir.search_iter("Observation", patient="u123"):
print(obs["valueQuantity"]["value"])
Provider / patient app (SMART user grant)
from intaops import IntaOpsClient
# Step 1 — generate PKCE + redirect the user
pkce = IntaOpsClient.generate_pkce()
client = IntaOpsClient(
client_id="app_live_…", environment="live",
scopes=["patient/Observation.read", "patient/MedicationRequest.read"],
)
url = client.authorize_url(
redirect_uri="https://yourapp.com/cb",
code_challenge=pkce.challenge,
)
# … redirect the user to `url`, capture `code` on the callback …
# Step 2 — exchange the code for tokens
client = IntaOpsClient.from_authorization_code(
code=code_from_callback,
redirect_uri="https://yourapp.com/cb",
code_verifier=pkce.verifier,
client_id="app_live_…",
environment="live",
scopes=["patient/Observation.read", "patient/MedicationRequest.read"],
)
obs = client.fhir.get("Observation", "obs-1")
Errors
from intaops import (
IntaOpsError, OAuthError, OperationOutcomeError,
ConsentRequiredError, RateLimitedError,
)
try:
client.fhir.get("Observation", "obs-1")
except ConsentRequiredError as e:
# First call to any patient/* scope ALWAYS returns this — consent is OFF
# by default. The IntaOps backend auto-pushes a prompt to the individual's
# IntaOps app; surface e.consent_url to them (push, email, in-app deep-link)
# and retry once they approve.
notify_user(e.user_id, e.consent_url)
except RateLimitedError as e:
time.sleep(e.retry_after or 30)
except OperationOutcomeError as e:
log(e.status_code, e.issue_code, e.location, e.outcome)
except OAuthError as e:
refresh_credentials(e.error)
Scope ↔ industry gating — the scopes your app can request are bounded by your entity's industry. Healthcare entities can request patient/* (consent-gated) and system/* (broad read) FHIR scopes; other industries are scoped to their own data surfaces (financial → financial data, retail → shopping, etc.). Requesting a scope outside your industry raises OAuthError("invalid_scope") at client instantiation.
API
IntaOpsClient(client_id, client_secret=, environment=, scopes=)IntaOpsClient.from_authorization_code(code, redirect_uri, code_verifier, …)IntaOpsClient.generate_pkce()→PKCEPairIntaOpsClient.authorize_url(redirect_uri, code_challenge, state=)→ strclient.fhir.get(resource_type, resource_id)→ dictclient.fhir.search(resource_type, **params)→ Bundle dictclient.fhir.search_iter(resource_type, **params)→ iterator of resourcesclient.fhir.create(resource_type, resource)→ dictclient.fhir.update(resource_type, resource_id, resource)→ dictclient.fhir.capability_statement()→ dict
Marketplace & interoperability — client.marketplace
Also importable standalone: from intaops.marketplace import MarketplaceClient.
client.marketplace.products.create(**data)·.create_with_transform(**data)·.update(product_id, **data)·.get(product_id)·.search(**params)client.marketplace.products.bulk_import(products)·.csv_upload(file, filename="products.csv")client.marketplace.payments.initiate(**data)·.process(transaction_id)·.history(**params)·.revenue()client.marketplace.channels.create(**data)·.send(channel_id, **data)client.marketplace.webhooks.subscribe(**data)·.list()·.update(subscription_id, **data)·.delete(subscription_id)·.deliveries(subscription_id)·.test(subscription_id)client.marketplace.transform.create_schema_mapping(**data)MarketplaceClient.verify_signature(payload, signature, secret)→ bool — verify theIntaops-Signatureheader on inbound webhooks
Migration (EHR / EMR import) — client.migration
Also importable standalone: from intaops.migration import MigrationClient.
client.migration.initiate(...)→ job dictclient.migration.status(job_id)·.jobs(limit=50)client.migration.push_records(job_id, records)client.migration.fhir_import(**kwargs)·.fhir_import_status(job_id)
License
Apache-2.0.
Metadata
Release files for intaops 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| intaops-0.1.5.tar.gz | 20.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| intaops-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 43.2 kB
Release files / intaops-0.1.5.tar.gz
| Download URL | intaops-0.1.5.tar.gz |
|---|---|
| Size | 20.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d806f8043f527032676a60445971ab14be8718c17381452f00930f1523e9eaa8
|
|
BLAKE2b-256 checksum How to use checksums |
c675b8557f1cfc81836469c68abf25a68ed6043cd47d0c6442e379b54efeb8e9
|
| 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 Aug 12, 2026.
Transparency logRelease files / intaops-0.1.5-py3-none-any.whl
| Download URL | intaops-0.1.5-py3-none-any.whl |
|---|---|
| Size | 22.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7336d9ecd900cfee4da8d3494c0f46508be642f56c4e35fa97cd418458b98dba
|
|
BLAKE2b-256 checksum How to use checksums |
a05b125362a5fb4ad29c004bb36ab24a18884ee38b27bf357d29bd0032eb279f
|
| 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 Aug 12, 2026.
Transparency logSecurity for intaops 0.1.5
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for intaops-0.1.5.tar.gz
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 Aug 12, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.