# eMigration > Practice management software for Registered Migration Agents (RMAs) in Australia. eMigration helps RMAs manage visa caseloads, collect documents from clients, and maintain OMARA-compliant case records — replacing spreadsheets and legacy desktop tools like MigrationManager. ## Who this is for - Registered Migration Agents (RMAs) registered with OMARA in Australia - Small to mid-size migration practices (1–15 staff) - Solo practitioners managing 30–50 active visa matters ## What it does - **Case management** — track visa matters by subclass (482, 186, 189, 190, 820, etc.), status, and deadline - **Client document collection** — send clients a mobile-friendly upload link (no account required) - **OMARA audit trail** — immutable log of advice given, documents received, and status changes per case - **Deadline tracking** — dashboard of upcoming and overdue matters with email alerts - **Team management** — multi-user firm support with role-based access ## API access Base URL: `https://emigrations.net/api/v1/` Authentication: `Authorization: Bearer emig_live_` Manage API keys at `/dashboard/settings/api`. Keys have scopes: `cases:read`, `cases:write`, `clients:read`, `clients:write`, `checklist:write`. Interactive API documentation: https://emigrations.net/api/docs OpenAPI spec (JSON): https://emigrations.net/api/v1/openapi.json ### Endpoints | Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /api/v1/cases | cases:read | List cases (paginated, ?status=, ?page=, ?perPage=) | | POST | /api/v1/cases | cases:write | Create a case | | GET | /api/v1/cases/:id | cases:read | Get case detail | | PATCH | /api/v1/cases/:id | cases:write | Update case status/deadline/assignee | | GET | /api/v1/cases/:id/checklist | cases:read | Get checklist items | | GET | /api/v1/clients | clients:read | List clients (paginated, ?q= search) | | GET | /api/v1/clients/:id | clients:read | Get client detail | | PATCH | /api/v1/checklist/:id | checklist:write | Update checklist item status | ## Key concepts - **Firm** — the RMA practice (top-level tenant) - **Client** — the visa applicant or sponsor - **Case** — a visa matter linked to a client, with a subclass, status, and deadline - **ChecklistItem** — a document or task required for the case - **DocumentRequest** — a token-based upload request sent to the client - **CaseEvent** — an immutable audit log entry on a case ## MCP Server (Model Context Protocol) For AI agents that support MCP natively — no REST boilerplate required. Endpoint: `https://emigrations.net/api/mcp` Transport: Streamable HTTP (stateless) Authentication: `Authorization: Bearer emig_live_` (same API keys as REST) ### Tools | Tool | Description | |------|-------------| | `list_cases` | List cases — filter by `status`, `clientId` | | `get_case` | Full case detail: checklist items + recent activity | | `list_clients` | List clients — optional `search` by name/email | | `create_note` | Add note to a case — `ADVICE_NOTED` (OMARA audit trail) or `NOTE_ADDED` (internal) | | `update_case_status` | Change case status — logged to audit trail | | `list_deadlines` | Overdue and due-this-week cases | Example MCP config: ```json { "mcpServers": { "emigration": { "url": "https://emigrations.net/api/mcp", "headers": { "Authorization": "Bearer emig_live_" } } } } ``` ## Webhooks Register endpoints at `/dashboard/settings/webhooks`. eMigration POSTs events to your endpoint when things happen. Payloads are HMAC-SHA256 signed. Verify with header: `X-eMigration-Signature: sha256=` using the secret shown at registration. Events: - `case.created` — a new case was opened - `case.status_changed` — case status updated - `document.received` — a client uploaded a document - `deadline.approaching` — a case deadline is within 7 days - `checklist.item_updated` — a checklist item status changed Payload format: ```json { "event": "case.created", "data": { "id": "...", "title": "...", "status": "ACTIVE" }, "timestamp": "2026-03-08T00:00:00.000Z" } ``` ## Data conventions - All timestamps are ISO 8601 in UTC; display timezone is AEST/AEDT - Currency is AUD - Visa subclasses follow the DIBP numbering convention (e.g. "482", "186") - Pagination: `{ data: [], meta: { total, page, perPage } }` - Errors: `{ error: { code, message, field? } }`