Enter password to continue
| Type | Portfolio | V | Prompt Preview | Status | By | Actions |
|---|---|---|---|---|---|---|
Loading... | ||||||
| Module | Query | Portfolio | SQL Preview | Status | Order | Actions |
|---|---|---|---|---|---|---|
Loading... | ||||||
| Name | Provider | Model | Portfolio | Mode | Status | Actions |
|---|---|---|---|---|---|---|
Loading... | ||||||
Resolution order: When generating insights for a portfolio, the system picks the LLM in this priority:
portfolio = "client-name", use itportfolio = (empty)To set up a client with their own LLM:
Important: Only one global default (portfolio = empty) should be active at a time. Multiple active defaults cause unpredictable behavior.
| Name | Label | Description | Status | Created | Actions |
|---|---|---|---|---|---|
Loading... | |||||
insight_type = your module namemodule = your module name| Portfolio | API Key | Description | Status | Created By | Created | Actions |
|---|---|---|---|---|---|---|
Loading... | ||||||
| Name | Module | Portfolio | Env | Schedule | Status | Last Run | Next Run | Actions |
|---|---|---|---|---|---|---|---|---|
Loading... | ||||||||
Base URL: https://insights.ility.com
All endpoints require a key parameter for authentication and a module parameter to specify the insight type. Modules are dynamic — add new ones in the Modules tab.
/get_insights
Retrieve insights for any module. Supports 4 modes: latest (default), specific date, date range, or list available dates. Works with any registered module (portfolio, tenants, revenue, or custom).
| Parameter | Type | Required | Description |
|---|---|---|---|
| key | string | Yes | API key |
| module | string | Yes | Module name (e.g. "portfolio", "tenants", "revenue", "work-order") |
| portfolio | string | Yes | Portfolio name (e.g. "centuria") |
| env | string | Yes | "stg" or "prod" |
| data_date | string | No | YYYY-MM-DD — get insight for a specific date |
| start_date | string | No | YYYY-MM-DD — start of date range (use with end_date) |
| end_date | string | No | YYYY-MM-DD — end of date range (use with start_date) |
| dates_only | boolean | No | "true" — returns only the list of available dates |
# Latest insight for a module curl "BASE_URL/get_insights?key=YOUR_KEY&module=portfolio&portfolio=centuria&env=prod" # Specific date curl "BASE_URL/get_insights?key=YOUR_KEY&module=portfolio&portfolio=centuria&env=prod&data_date=2026-04-07" # List available dates curl "BASE_URL/get_insights?key=YOUR_KEY&module=portfolio&portfolio=centuria&env=prod&dates_only=true" # Date range curl "BASE_URL/get_insights?key=YOUR_KEY&module=portfolio&portfolio=centuria&env=prod&start_date=2026-04-01&end_date=2026-04-07" # Custom module (e.g. work-order) curl "BASE_URL/get_insights?key=YOUR_KEY&module=work-order&portfolio=centuria&env=prod"
/get_scores
Returns insight scores in card format (e.g. tenant renewal scores). Pass the module via query param.
curl "BASE_URL/get_scores?key=YOUR_KEY&module=tenants&portfolio=centuria&env=prod"
/generate_insights
Generate insights for any module from BigQuery data via LLM. If insights for today already exist, returns them with already_exists: true unless force: true is set. Works with any registered module.
| Body Parameter | Type | Required | Description |
|---|---|---|---|
| key | string | Yes | API key |
| module | string | Yes | Module name (e.g. "portfolio", "tenants", "work-order") |
| portfolio | string | Yes | Portfolio name |
| env | string | Yes | "stg" or "prod" |
| force | boolean | No | true = regenerate even if today's insights exist |
| tenants | string | No | Comma-separated tenant names (filters BQ queries) |
# Generate portfolio insights
curl -X POST "BASE_URL/generate_insights" \
-H "Content-Type: application/json" \
-d '{"key":"YOUR_KEY","module":"portfolio","portfolio":"centuria","env":"prod"}'
# Force regenerate (bypass duplicate check)
curl -X POST "BASE_URL/generate_insights" \
-H "Content-Type: application/json" \
-d '{"key":"YOUR_KEY","module":"portfolio","portfolio":"centuria","env":"prod","force":true}'
# Generate custom module
curl -X POST "BASE_URL/generate_insights" \
-H "Content-Type: application/json" \
-d '{"key":"YOUR_KEY","module":"work-order","portfolio":"centuria","env":"prod"}'
/upload_and_analyse_file
Upload a file (or send JSON/text data) with an analysis prompt. Returns a structured report or email via LLM. Supports multipart form-data with optional file attachment.
| Form Field | Type | Required | Description |
|---|---|---|---|
| key | string | Yes | API key (form field or header) |
| prompt | string | Yes | Analysis prompt (min 5 words, 20 chars). Can be plain text or JSON data. |
| file | file | No | File upload (max 2MB). Supported: CSV, XLSX, XLS, PDF, TXT, DOC, DOCX, RTF, PNG, JPG |
| type | string | No | "report" (default) or "email" |
| output_format | string | No | "html" (default) or "json". HTML returns rendered report; JSON returns structured data. |
| model_id | string | No | Override LLM model (e.g. "gemini-2.5-flash"). Must be in allowlist. |
| max_output_tokens | integer | No | Max response tokens (default: 4096, cap: 4096) |
# Report with file upload
curl -X POST "BASE_URL/upload_and_analyse_file" \
-F "key=YOUR_KEY" \
-F "prompt=Analyse this data and generate a summary with key metrics and risks" \
-F "type=report" \
-F "output_format=json" \
-F "file=@data.csv"
# Email from JSON data (no file)
curl -X POST "BASE_URL/upload_and_analyse_file" \
-F "key=YOUR_KEY" \
-F 'prompt=[{"name":"Alice","score":92},{"name":"Bob","score":74}]' \
-F "type=email" \
-F "output_format=json"
# Report with S3 file references in prompt
curl -X POST "BASE_URL/upload_and_analyse_file" \
-F "key=YOUR_KEY" \
-F 'prompt=[{"bucket":"my-bucket","awsKey":"data/report.csv","type":"csv"}]' \
-F "type=report" \
-F "output_format=json"
/compare_insights
Compare insights across multiple dates using AI. Accepts 2-10 insight IDs and returns a structured comparison with trends, improvements, deteriorations, and recommendations.
| Body Parameter | Type | Required | Description |
|---|---|---|---|
| key | string | Yes | API key |
| module | string | Yes | Module name (e.g. "portfolio", "work-order") |
| portfolio | string | Yes | Portfolio name |
| env | string | Yes | "stg" or "prod" |
| insight_ids | array | Yes | Array of 2-10 insight UUIDs to compare |
curl -X POST "BASE_URL/compare_insights" \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_KEY",
"module": "portfolio",
"portfolio": "centuria",
"env": "prod",
"insight_ids": ["uuid-1", "uuid-2"]
}'
/modules
List all active insight modules. No authentication required. Use this to discover available module names for other endpoints.
curl "BASE_URL/modules"
# Response:
# [
# {"name": "portfolio", "label": "Portfolio", "description": "...", "is_active": true},
# {"name": "tenants", "label": "Tenants", "description": "...", "is_active": true},
# {"name": "revenue", "label": "Revenue", "description": "...", "is_active": true},
# {"name": "work-order", "label": "Work Orders", "description": "...", "is_active": true}
# ]
/schedules
|
POST
/schedules
Manage scheduled insight generation jobs. GET lists all schedules. POST creates a new one. Works with any registered module.
| POST Body | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Schedule name |
| insight_type | string | Yes | Module name (e.g. "portfolio", "work-order") |
| portfolio | string | Yes | Portfolio name |
| env | string | Yes | "stg" or "prod" |
| cron_expression | string | Yes | 5-field cron: "0 2 * * *" = daily at 2 AM |
| is_active | boolean | No | Default: true |
Additional endpoints: PUT /schedules/<id> (update), DELETE /schedules/<id> (delete), POST /schedules/<id>/run (trigger now).
/embed.html
Standalone embeddable page for iframes. Displays the latest insight with a date picker for historical browsing. Works with any registered module. Each portfolio + module combination gets a unique URL.
| URL Param | Required | Description |
|---|---|---|
| key | Yes | API key |
| portfolio | Yes | Portfolio name |
| module | No | "portfolio" (default) or any registered module name |
| env | No | "prod" (default) or "stg" |
<!-- Portfolio insights for Centuria --> <iframe src="BASE_URL/embed.html?key=YOUR_KEY&portfolio=centuria&module=portfolio&env=prod" width="100%" height="800" frameborder="0" style="border-radius: 12px; border: 1px solid #e2e4eb;" ></iframe> <!-- Custom module (e.g. work orders) --> <iframe src="BASE_URL/embed.html?key=YOUR_KEY&portfolio=centuria&module=work-order&env=prod" width="100%" height="800" frameborder="0" ></iframe>