IntaOps

API Documentation

A friendly, step-by-step guide for developers.

What is IntaOps?

In simple terms, IntaOps is a universal translator and a super-secure courier service for digital information—specifically designed to help different computer systems talk to each other safely.

✅ Prerequisites

  • IntaOps KYB verified account — Corporation, NGO, and/or LLC entities.
  • Valid access — atleast occassional commitment plan.

Step 0 — Get your credentials

Before your machine can communiate with IntaOps you need a Developer Application — an OAuth client with a client id + client secret. You can get these credentials from the Developer Portal section.

Install IntaOps SDK

One package per language wraps the OAuth, the FHIR R4 surface, EMR synchronization.

Python

pip install intaops

🟦 TypeScript

npm install @intaops/connector

Go

go install github.com/IntaOps/connector-go@v0.1.3

IntaOps Desktop is an offline-first clinic workspace: sign in once while online, then keep registering patients and capturing records with no signal — everything syncs automatically when a connection returns. You download the installer straight from your workspace: click the Get IntaOps Desktop button (the floating download icon just above the chat bubble, bottom-right), choose your operating system, and the download starts automatically. No separate account is needed beyond your verified entity login.

Windows 10 / 11

  • Installer (.exe) — recommended for a single machine; double-click and follow the wizard.
  • MSI (.msi) — for IT-managed rollouts (Group Policy / Intune).
  1. Download IntaOps_x64-setup.exe (or the .msi) from the workspace.
  2. Double-click it. If Windows SmartScreen warns (“unknown publisher”), click More info → Run anyway.
  3. Finish the wizard, then launch IntaOps from the Start menu.

macOS

Pick the build for your chip (Apple menu → About This Mac):

  • Apple Silicon (M1/M2/M3…) → IntaOps_aarch64.dmg
  • Intel IntaOps_x64.dmg
  1. Open the downloaded .dmg and drag IntaOps into Applications.
  2. First launch: right-click the app → Open

🐧 Linux

Install the .deb or .rpm for your distribution:

Debian / Ubuntu — .deb

sudo apt install ./IntaOps_0.1.5_amd64.deb

Fedora / RHEL — .rpm

sudo dnf install ./IntaOps-0.1.5-1.x86_64.rpm

Then launch IntaOps from your applications menu.

After installing:open IntaOps, sign in with your entity login while online once, and you’re set — the app then works fully offline and updates itself in the background whenever a connection is available.

🏥 Connecting Health Data (EHR / EMR)

Already running an EMR (HelliumOS, AquilaEHR, or custom software)? You can synchronize existing records to IntaOps network, pull and/or push patient data on demand, and subscribe to real-time events. Four paths — pick the one that fits the job.

How to get an access token

  1. Dashboard → Developer Portal · Applications → create app → copy client id + client secret (secret is shown once).
  2. Exchange them at POST /oauth/token with grant_type=client_credentials → response gives an access_token.Access token expires in 5 mins, refresh token last longer
  3. Send that token as Authorization: Bearer <access-token> on every call below. Never send the client_secret on these calls /oauth/token.

1. Pull on demand

FHIR R4

Look up a patient right now. The everyday read path — via the drop-in SDKs (intaops · @intaops/connector · connector-go) on the dashboard.

Provider: "I would like to access IO-8137345683 now."
Auth: system/*reference ledger; patient/* decides.

2. Pull bulk

Bulk Export

Mirrors the FHIR Bulk Data Access spec. Kick off an async job, poll for the NDJSON manifest, then download the shards.

Provider: "Sync 100k patients overnight."
Auth: system/*.read via client credentials.

3. Push synchronization

One-shot

Synchronize your existing siloed EMR onto the IntaOps network. One endpoint, four ingestion methods: FHIR, HL7 v2, bulk JSON, or CSV.

Provider: "Synchronize UCH Ibadan's clinical data."
Track: Lifecycle = validating → processing → completed.

4. Real-time webhooks

HMAC

IntaOps POSTs HMAC-signed events to your URL when something changes. Subscribe once; receive forever.

Provider: "Tell me when a lab arrives or consent is granted."
Verify: /developers/webhook-verifier

↳ Don't want to run curl? Open your app at /applications → click View on the row → use the "Test your credentials" card's Run test button to mint a token in-browser (decoded JWT preview + copy button included). The client_secret never leaves the server.

↳ Same call wrapped in the SDKs — see the "Drop-in Connector SDKs" card on the dashboard for Python / TypeScript / Go.

↳ For huge sync, open the job then poll with PATCH /api/emr/migration/{job_id}/records/. Poll GET /api/emr/migration/{job_id}/status/ for progress.

Path 3 — via the SDKs

The connector SDKs now ship one-line helpers for the same job. The backend accepts the SDK's OAuth bearer (client_credentials) on both /api/emr/migration/* and the FHIR-flavored wrapper POST /fhir/$import (Bulk Data Import).

Point & Click Connector

Click through to your existing EHR / EMR from the dashboard — no SDK to install, no code to write. The connector handles the OAuth handshake, data synchronization, and surfaces a clear status indicator. So non-engineers (admins, clinical leads, ops managers) can wire your system into IntaOps in under five minutes.

Supported systems

HelliumOsAquilaEHRCustom FHIR endpoint

Five-minute setup

  1. 1Open Dashboard → Overview → EMR Synchronization and click Start synchronization.
  2. 2Pick your EHR / EMR vendor from the catalog. If yours isn't listed, choose Custom / In-house and paste your base URL.
  3. 3Choose your import method — FHIR API, HL7 v2, bulk JSON, or CSV. Each method has a short description and a link to the deeper reference.
  4. 4Pick the resource types to sync (Patient, Observation, Encounter, MedicationRequest, DiagnosticReport, plus Allergies, Conditions, Immunizations, Procedures and Documents — toggle whatever applies) and a click on pull.
  5. 5Watch job progress → the connector will validate, ingest, and synchronize your records. You can pause or revoke the connector at any time.

Batch Account Upload

Onboard many patient records at once — useful when migrating from an existing system, importing a partner's patient list. Two flavours: a CSV upload, and a JSON-array.Both return a per-row report so a single bad row never blocks the rest.

Method 1 — CSV upload (no code)

  1. 1Open Dashboard → Overview → Batch registeration.
  2. 2Drag in a CSV. The uploader shows column mapping before you push — catch typos and missing fields up-front.
  3. 3Click Import. IntaOps validates every row in parallel, then shows a downloadable report: accepted.csv + rejected.csv with the failure reason on every rejected row.

Your spreadsheet needs these columns (email, first_name, last_name and phone_number are required):

Method 2 — Bulk API (one POST per batch)

POST a JSON array. Use this from your ETL pipeline, your CRM migration script. Accepts up to 500 records per request. Returns the same per-row breakdown.

Field reference

FieldTypeRequiredNotes
first_namestringyes1–15 chars
last_namestringyes1–15 chars
emailstringnoMust be unique — duplicates reject the row
phone_numberstringyesE.164 format, e.g. +2348012345678
📚

API Reference

Quick lookup for every endpoint, every webhook event, and every HTTP status code the platform emits. Use this section as a cheat sheet once you've shipped your first integration.

📋 All Available Endpoints

Base URL: https://services.intaops.io · All requests require Authorization: Bearer YOUR_ACCESS_TOKEN

Identity

POST/api/v1/individual-query/query/Look up an individual(body: {"verificare_id": "io-…"})

Authentication — OAuth 2.0 / SMART on FHIR

POST/oauth/tokenToken endpoint — grant_type=client_credentials or authorization_code + PKCE. access_token ~5 min
GET/oauth/authorizeSMART authorization_code launch — the patient approves in the IntaOps app; the browser carries the code back to your redirect_uri

Discovery — SMART on FHIR (public, no auth, CORS-enabled)

GET/fhir/metadataCapabilityStatement — the resources + interactions we support
GET/fhir/.well-known/smart-configurationSMART launch / token / capabilities
GET/.well-known/openid-configurationOpenID Connect discovery document
GET/.well-known/jwks.jsonPublic signing keys — verify our tokens & verifiable credentials

FHIR R4 — healthcare reads + writes

GET/fhir/Patient/{verificare_id}Read a single Patient resource
GET/fhir/Patient?…Search Patients — paginated FHIR Bundle
GET/fhir/Observation?patient=…Search Observations (vital-signs) for a patient
GET/fhir/{Resource}?patient=…Clinical breadth: AllergyIntolerance · Condition · Immunization · Procedure · DocumentReference · MedicationRequest · DiagnosticReport · Encounter
GET/fhir/Patient/{verificare_id}/$summaryInternational Patient Summary (IPS) — one portable document Bundle for diaspora / cross-border care. EEHRxF-aligned. Needs patient/*.read
POST/fhir/{Resource}Create — writable: Patient · Observation · MedicationRequest · DiagnosticReport · Encounter · Condition · Immunization · Procedure · AllergyIntolerance · DocumentReference
PUT/fhir/{Resource}/{id}Update an existing writable FHIR resource by id (update-only; unknown id → 404)

EMR Synchronization — bulk onboarding

POST/api/emr/migration/initiate/Open a migration job (fhir_api | hl7 | bulk_json | csv)
PATCH/api/emr/migration/{job_id}/records/Push a chunk of records to an existing job
GET/api/emr/migration/{job_id}/status/Poll job status until completed / failed
GET/api/emr/migration/jobs/List your migration jobs
POST/fhir/$importFHIR Bulk Data Import wrapper — keeps you on /fhir base
GET/fhir/$import-status/{job_id}Poll the $import job (mirrors /status/)

🔔 Webhook Events

IntaOps POSTs these events to your webhook URL when things happen.

Healthhealth_record.createdA new FHIR resource was written to a patient's record
Healthhealth_record.updatedAn existing FHIR resource was modified (PUT)
Healthconsent.grantedPatient granted a third-party app consent to a patient/*
Healthconsent.revokedPatient revoked a previously granted consent
Healthmigration_job.completedA POST /api/emr/migration/initiate/ job reached a terminal state — summary counts in the payload
Healthappointment.bookedAn appointment was created for a patient (manual booking or self-schedule)

📬 HTTP Status Codes

Every response from IntaOps includes one of these numbers.

200OKEverything worked perfectly!
201CreatedNew resource was created (e.g. product, subscription)
202AcceptedAsync work kicked off — poll the Content-Location for status (FHIR $import, EMR migration)
400Bad RequestSomething in your request is missing or wrong
401UnauthorizedWrong or missing API key / expired OAuth token
403ForbiddenAuthenticated, but the scope or consent doesn't cover this call
404Not FoundThe user or resource does not exist
409ConflictThe resource is in a state that blocks this operation (e.g. job already completed)
415Unsupported Media TypeSet Content-Type: application/json — DRF's parser chain only matches that on marketplace + migration endpoints
422Unprocessable EntityRequest was syntactically valid but failed semantic validation — see error payload for which field
429Too Many RequestsSlow down — you are calling too fast. Honour the Retry-After header