This reference covers the ILAP Analytics REST export endpoints for pulling schedule data — schedules, activities, periodized progress, resources, links, and metadata — for reporting and bulk extract. It is aimed at report developers, data engineers, and planners, and assumes you already have a DataReader bearer token or service token.
Base URL
https://app-ilapanalytics-api-dev.azurewebsites.net
Substitute your own environment's base URL. All endpoints described here live under /api/v3/export.
Authentication
The export endpoints accept either of these headers:
Authorization: bearer <jwt>
Authorization: IlapAnalyticsToken <service token>
The DataReader role is sufficient for all export reads. See the Authentication guide for how to obtain a token. A typical Python token acquisition, using Azure.Identity, looks like this:
from azure.identity import DefaultAzureCredential
# Get token
credential = DefaultAzureCredential() # DefaultAzureCredential will try and find the option that is setup
token = credential.get_token(f"api://{your_api_azure_id}/.Default")
Revision types
Every export endpoint takes a RevisionType parameter, one of:
Live— the current live schedule data.Baseline— the current baseline.OriginalBaseline— the original baseline, unaffected by later re-baselining.Current— the latest revision, whatever its type.
See the API overview for the canonical explanation of revision types.
Export endpoints
All endpoints take ReportScheduleId (int) and RevisionType. The paginated endpoints additionally take PageNumber and PageSize.
| Endpoint | Paginated |
|---|---|
/api/v3/export/Activities |
Yes |
/api/v3/export/Successors |
Yes |
/api/v3/export/ResourceAssignments |
Yes |
/api/v3/export/PeriodizedActivities |
Yes |
/api/v3/export/ActivityMetadataValues |
Yes |
/api/v3/export/ActivityLinks |
Yes |
/api/v3/export/Schedules |
No |
/api/v3/export/Calendars |
No |
/api/v3/export/Profiles |
No |
/api/v3/export/Resources |
No |
/api/v3/export/Structures |
No |
/api/v3/export/MetadataFields |
No |
/api/v3/export/ScheduleMetadataValues |
No |
/api/v3/export/singleSchedule |
No |
Response shape
Every export GET returns an OffsetPaginationResult object. Property names are PascalCase (the API serializes with Newtonsoft.Json), and properties whose value is null are omitted from the response:
Data— array of records.PageNumberPageSizeTotalItemsTotalPages
Responses are gzip-compressed; HTTP clients such as Python's requests decompress them transparently.
Pagination
For the paginated endpoints, pass PageNumber (1-based) and PageSize. Keep requesting subsequent pages until PageNumber >= TotalPages in the response.
Worked example — pull all activities
curl -s -H "Authorization: bearer $TOKEN" \
"https://app-ilapanalytics-api-dev.azurewebsites.net/api/v3/export/Activities?ReportScheduleId=123&RevisionType=Live&PageNumber=1&PageSize=1000"
import requests
BASE = "https://app-ilapanalytics-api-dev.azurewebsites.net" # your environment
TOKEN = "<DataReader bearer token>" # see Authentication
HEADERS = {"Authorization": f"bearer {TOKEN}"}
REPORT_SCHEDULE_ID = "<report schedule id>"
REVISION = "Live" # Live | Baseline | OriginalBaseline | Current
def export_all(resource, page_size=1000):
"""Page a /api/v3/export collection. Each response is an OffsetPaginationResult:
{"Data": [...], "PageNumber", "PageSize", "TotalItems", "TotalPages"} (PascalCase)."""
rows, page = [], 1
while True:
params = {"ReportScheduleId": REPORT_SCHEDULE_ID, "RevisionType": REVISION,
"PageNumber": page, "PageSize": page_size}
r = requests.get(f"{BASE}/api/v3/export/{resource}", headers=HEADERS, params=params, timeout=180)
r.raise_for_status()
payload = r.json()
rows.extend(payload["Data"])
if page >= payload["TotalPages"]:
break
page += 1
return rows
activities = export_all("Activities")
print(len(activities), "activities")
Abridged response (shape shown; PascalCase; null fields omitted):
{
"Data": [
{ "ScheduleId": 123, "Description": "Install pump P-101",
"ActualStart": "2026-01-05T00:00:00", "PlannedWorkHours": 40.0,
"CurrentProgress": 0.35, "PlannedProgress": 0.40 }
],
"PageNumber": 1, "PageSize": 1000, "TotalItems": 8421, "TotalPages": 9
}
Extension fields
Tenant-specific metadata values come through the export as dynamic fields via the metadata endpoints (/api/v3/export/ActivityMetadataValues, /api/v3/export/ScheduleMetadataValues, /api/v3/export/MetadataFields), so field names vary per tenant and are not enumerated here.
See also
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article