Skip to content

IMS API Reference

Information Management System — the backend for developers.sap.com tutorial progress tracking. Source: D:\projects\com.sap.developers.ims

Overview

IMS is a Spring Boot 2.5.7 (Java 17) application deployed on SAP BTP Cloud Foundry. It uses Spring Data REST (HATEOAS/HAL) to auto-expose JPA repositories as REST endpoints, plus custom @RepositoryRestController classes for business logic. Data is stored in SAP HANA Cloud (H2 for tests).

Technology Stack

LayerTechnology
FrameworkSpring Boot 2.5.7, Spring Data REST
LanguageJava 17 (SAP Machine JDK)
DatabaseSAP HANA Cloud (Liquibase migrations)
AuthOAuth2 Resource Server, XSUAA JWT
BuildMaven multi-module, WAR packaging
DeploymentCloud Foundry (manifest-based)
API FormatHAL+JSON (HATEOAS)

Module Structure

com.sap.developers.ims/
├── application/       # Core REST API, JPA entities, services, repositories
├── job/               # Spring Batch jobs (analytics, account merge, cleanup)
├── display-application/ # WebSocket-based real-time event displays
├── ui/                # Legacy React 15 admin frontend
├── display-ui/        # Pre-built display frontend
├── web/               # WAR packaging (combines all modules)
└── approuter/         # Node.js SAP Application Router (XSUAA auth)

Domain Model Hierarchy

Group
  └── Mission
        └── Tutorial
              ├── Step
              └── Checkpoint

All four task types extend a common Task base entity with id, title, status, and taskType discriminator. TaskRecord tracks a user's completion status for any task.


Authentication & Authorization

Security Model

  • OAuth2 Resource Server with JWT tokens via SAP XSUAA
  • Basic Auth bypass available for technical users (local dev)
  • Public endpoints: /actuator/health, /actuator/info, /public/**

Roles

Role ConstantScopeDescription
ADMINSCOPE_AdminFull access to all endpoints
DEVELOPER_APPSCOPE_DeveloperAEM/frontend application calls
MOBILE_APPSCOPE_MobileMobile app calls
DISPLAY_APPSCOPE_DisplayEvent display dashboard
CONTENT_AUTHORSCOPE_ContentAuthorTutorial metadata management
CONSOLIDATION_SCOPE(custom)Account merge operations

API Endpoints

Tutorials

Base path: /tutorials

MethodPathAuthParametersReturnsDescription
GET/tutorialsADMIN, DEVELOPER_APPPageableCollectionModel<Tutorial>List all tutorials (paginated)
POST/tutorialsADMIN, DEVELOPER_APPEntityModel<Tutorial> bodyResponseEntityCreate or update tutorial (synchronized)
GET/tutorials/{id}ADMIN, DEVELOPER_APPEntityModel<Tutorial>Get tutorial by ID (Spring Data REST)
GET/tutorials/{id}/steps/searchADMIN, DEVELOPER_APPtitle (query)EntityModel<Step>Find step by title within tutorial
GET/tutorials/search/findByTextADMINtext, PageableCollectionModelFull-text search tutorials
GET/tutorials/findByTitleADMIN, DEVELOPER_APP, MOBILE_APPtutorialTitle (query)ResponseEntityFind tutorial by exact title

Tutorial Entity Fields:

FieldTypeNotes
idLongPrimary key
titleStringInherited from Task
statusStringnull = active, "DELETED" = soft-deleted
mdFileUrlStringMarkdown source file URL (required)
primaryTagTagMany-to-one
experienceTagTagMany-to-one (Beginner/Intermediate/Advanced)
averageTimeToCompleteLongMinutes
stepsList<Step>Ordered one-to-many via join table
tagsSet<Tag>Many-to-many
featuredOrderIntegerHomepage featured position

Missions

Base path: /missions

MethodPathAuthParametersReturnsDescription
GET/missionsADMIN, DEVELOPER_APPPageableCollectionModel<Mission>List all missions (paginated)
GET/missions/{missionId}/completion-graphADMIN, DEVELOPER_APP, MOBILE_APPmissionId (path), userId (query)EntityModel<CompletionGraph>Get mission completion graph for user
GET/missions/{missionId}/exportADMIN, DEVELOPER_APPmissionId (path)EntityModel<MissionDTO>Export full mission data
GET/missions/search/findByTextADMINtext, PageableCollectionModelFull-text search missions
DELETE/missions/{id}ADMIN, DEVELOPER_APPid (path), deletionReason (optional query)voidSoft-delete mission

Mission Entity Fields:

FieldTypeNotes
idLongPrimary key
titleStringInherited from Task
descriptionString (LOB)Rich description
pathsList<CompletionPath>Ordered groups within mission
eventEventMany-to-one (optional event association)
communityMissionIdStringExternal ID for SAP Community
taskValidationRuleTaskValidationRuleEmbedded completion rules
averageTimeToCompleteLongMinutes
primaryTagTagMany-to-one
experienceTagTagMany-to-one
tagsSet<Tag>Many-to-many
featuredOrderIntegerHomepage featured position

Groups

Base path: /groups

MethodPathAuthParametersReturnsDescription
GET/groupsADMIN, DEVELOPER_APPPageableCollectionModel<Group>List all groups (paginated)
GET/groups/{groupId}/exportADMIN, DEVELOPER_APPgroupId (path)EntityModel<GroupDTO>Export full group data
GET/groups/search/findByTextADMINtext, PageableCollectionModelFull-text search groups
DELETE/groups/{id}ADMIN, DEVELOPER_APPid (path), deletionReason (optional)voidSoft-delete group

Group Entity Fields:

FieldTypeNotes
idLongPrimary key
titleStringInherited from Task
descriptionString (LOB)Rich description
tutorialsList<Tutorial>Ordered one-to-many via join table
primaryTag, experienceTagTagMany-to-one
tagsSet<Tag>Many-to-many
averageTimeToCompleteLongMinutes
featuredOrderIntegerHomepage featured position

Task Records (Progress Tracking)

Base path: /task-records

This is the core progress-tracking entity — one record per user per task, recording completion status.

MethodPathAuthParametersReturnsDescription
POST/task-recordsADMIN, DEVELOPER_APP, MOBILE_APPEntityModel<TaskRecord> bodyResponseEntityRecord task completion
GET/task-records/search/byUserAndTask(Spring Data REST)userId, taskIdTaskRecordFind record for specific user+task
GET/task-records/search/byUserAndTasks(Spring Data REST)userId, taskId...List<TaskRecord>Find records for user + multiple tasks
GET/task-records/search/findTaskProgressByUserAndTasksIdsADMIN, DEVELOPER_APPuserImsId, tasksIds (Set), tutorialIdList<UserProgressWithTutorialSteps>Detailed progress with step-level info
GET/task-records/search/countCompletedMissionsTotalByIdADMINmissionIdCountTotal users who completed mission
GET/task-records/search/countCompletedMissionsPercentByIdADMINmissionIdPercentageCompletion percentage
GET/task-records/search/findByAccountNumberADMINaccountNumber, petNumber, dsrRequestNumber, PageablePagedModelFind by account (admin/GDPR)
GET/task-records/download/{fileName}.csvADMINaccountNumber, petNumber, dsrRequestNumberCSV streamExport records as CSV
GET/task-records/sendToNgdsADMIN, DEVELOPER_APPtasksIdBooleanPush record to NGDS analytics

TaskRecord Entity Fields:

FieldTypeNotes
idLongPrimary key
userUserMany-to-one
taskTaskMany-to-one
eventEventMany-to-one (optional)
titleStringSnapshot of task title
statusTaskRecordStatusIN_PROGRESS, COMPLETED, etc.
progressInteger0–100
progressNoteStringStatus notes
completionTimeLongTime spent (seconds)
completionDateLocalDateTimeWhen completed
taskTypeTaskTypeTUTORIAL, MISSION, GROUP, STEP

Event-driven cascading: When a TaskRecord is saved, Spring application events trigger status recalculation up the hierarchy (Tutorial → Group → Mission) via TutorialStatusCalculator, GroupStatusCalculator, MissionStatusCalculator.


Users

Base path: /users

MethodPathAuthParametersReturnsDescription
GET/users/resolveADMIN, DEVELOPER_APPaccountNumber (query)PersistentEntityResourceResolve user by SAP account number
GET/users/{userId}/search/findUserProgressADMIN, DEVELOPER_APPuserId (path)UserProgressModelGet user's overall progress summary
GET/users/anonymizeADMINaccountNumber (query)GDPR anonymization
GET/users/anonymizeByDsrRequestADMINDSR request paramsGDPR anonymization by DSR

User Entity Fields:

FieldTypeNotes
idLongPrimary key (= IMS ID)
uuidStringUnique, immutable
sapIdStringSAP ID
taskRecordsList<TaskRecord>One-to-many (sub-resource: /users/{id}/task-records)
prizeRecordsList<PrizeRecord>One-to-many (sub-resource: /users/{id}/prize-records)
accomplishmentsList<AccomplishmentRecord>One-to-many
profileProfileEmbedded

Projections:

  • ?projection=leaderBoardRankings — includes uuid, sapId, profile, accomplishments, computed leaderBoardRankings

Prizes & Prize Records

MethodPathAuthParametersReturnsDescription
GET/prizes(Spring Data REST)PageableCollectionModel<Prize>List prizes
DELETE/prizes/{prizeId}ADMINprizeId (path)ResponseEntityDelete prize
GET/prizes/search/findByTextADMINtext, PageableCollectionModelSearch prizes
PATCH/prize-records/{id}ADMIN, DEVELOPER_APP, MOBILE_APPEntityModel<PrizeRecord> bodyEntityModel<PrizeRecord>Update prize record status
GET/prize-records/findByUserAndPrizeIdsADMIN, DEVELOPER_APPuserId, prizeIds (List)List<PrizeRecordWithStatus>Get prize records for user

Accomplishments

MethodPathAuthParametersReturnsDescription
GET/accomplishmentsADMIN, DEVELOPER_APPPageableCollectionModel<Accomplishment>List accomplishments
GET/accomplishments/search/findByTextADMINtext, PageableCollectionModelSearch accomplishments

Events

MethodPathAuthParametersReturnsDescription
GET/events(Spring Data REST)PageableCollectionModel<Event>List events
DELETE/events/{eventId}ADMINeventId (path)ResponseEntityDelete event
GET/events/search/findByTextADMINtext, PageableCollectionModelSearch events

Event Entity Fields: id, name (required), startDate, endDate, timeZone


Statistics

MethodPathAuthParametersReturnsDescription
GET/statisticADMIN, DEVELOPER_APP, MOBILE_APPOverallStatisticOverall platform statistics
GET/eventStatisticADMIN, DISPLAY_APP, MOBILE_APPeventIdEventStatisticEvent-specific statistics
GET/tutorialComplBurnupByDayADMIN, DISPLAY_APPeventIdList<TaskCountByDateModel>Completion burnup chart data
GET/tutorialComplStatsByTrackADMIN, DISPLAY_APPeventIdEventStatisticWrapperCompletion stats by learning track
GET/tutorialComplSpeedADMIN, DISPLAY_APPeventId, periodLongCompletion speed metric
GET/statistic/events/{eventId}/bucketsADMIN, DISPLAY_APPeventId (path)Bucket dataEvent bucket/tier breakdown

Tutorial Metadata

MethodPathAuthParametersReturnsDescription
GET/tutorialMetaADMIN, CONTENT_AUTHORPageableCollectionModelList tutorial metadata
POST/tutorialMetaADMIN, DEVELOPER_APP, CONTENT_AUTHORTutorialMetaResource bodyResponseEntityCreate metadata (synchronized)
PATCH/tutorialMetaADMIN, DEVELOPER_APP, CONTENT_AUTHORTutorialMetaResource bodyResponseEntityUpdate metadata (synchronized)
DELETE/tutorialMeta/{tutorialId}ADMIN, DEVELOPER_APP, CONTENT_AUTHORtutorialId (path)voidDelete metadata
POST/tutorialMeta/searchADMIN, CONTENT_AUTHORTutorialMetaSortParams body, PageableCollectionModelSearch with custom sort
GET/tutorialMeta/tagsADMIN, CONTENT_AUTHOR, DEVELOPER_APPPageableCollectionModelGet metadata tags
POST/tutorialMeta/setMonitoredStatusADMIN, CONTENT_AUTHORstatus (query), List<Long> bodyResponseEntityBulk set monitored flag
POST/tutorialMeta/setReviewedStatusADMIN, CONTENT_AUTHORstatus, id (query)ResponseEntitySet reviewed flag
GET/tutorialMeta/infographicsADMIN, CONTENT_AUTHORTutorialMetaInfographicsMetadata dashboard stats

Tags

MethodPathAuthParametersReturnsDescription
GET/tags/search/findByTextADMIN, CONTENT_AUTHOR, DEVELOPER_APPtext, PageableCollectionModelSearch tags
POST/tags/updateDevelopersTagsADMIN, CONTENT_AUTHOR, DEVELOPER_APPMap<String, Boolean> bodyResponseEntityBulk update tags
DELETE/tags/deleteUnusedTagsADMIN, CONTENT_AUTHOR, DEVELOPER_APPvoidClean up unused tags
POST/tags/interestItemsADMIN, CONTENT_AUTHOR, DEVELOPER_APPList<String> bodyResponseEntityUpdate items of interest

MethodPathAuthParametersReturnsDescription
GET/findAllFeaturedTasksADMIN, DEVELOPER_APPListGet all featured tasks
GET/getAllFeaturedIdsListADMIN, DEVELOPER_APPList<Long>Featured task IDs
GET/getAllFeaturedIdsMapADMIN, DEVELOPER_APPMap<Long, Integer>Featured IDs with order
POST/setFeaturedOrder/{ids}ADMINids (path, comma-separated)Mark tasks as featured
DELETE/deleteFeaturedOrder/{ids}ADMINids (path, comma-separated)Unmark featured tasks

Utility Endpoints

MethodPathAuthParametersReturnsDescription
GET/tasks/findRelatedADMIN, DEVELOPER_APP, MOBILE_APPtutorialId or tutorialTitleResponseEntityFind parent mission/group for a tutorial
GET/__debug/headersAuthenticatedRequest headersDebug helper
GET/__debug/principalAuthenticatedPrincipal infoAuth debug
GET/application/configurationADMINList<ApplicationConfiguration>App config entries

Account Merge

Base path: /api/v1/user-merge

MethodPathAuthParametersReturnsDescription
POST/api/v1/user-merge/{uuid}CONSOLIDATION_SCOPEAccountMergeRequest bodyResponseEntityRegister secondary accounts
POST/api/v1/user-merge/{uuid}/{sapID}/{target}CONSOLIDATION_SCOPEPath varsResponseEntityTrigger account merge
GET/api/v1/user-merge/statusCONSOLIDATION_SCOPEOptional path varsResponseEntityCheck merge status

Tutorial Repositories

MethodPathAuthParametersReturnsDescription
GET/tutorialRepository/sortedRepositoriesADMIN, CONTENT_AUTHORPageableCollectionModelList GitHub repos sorted
PATCH/tutorialRepository/updateTutorialRepositoryOwner/{repositoryName}ADMIN, DEVELOPER_APPTutorialContributorDTO bodyResponseEntity<RepositoryModel>Update repo owner

Developer Environment Tabs

MethodPathAuthParametersReturnsDescription
GET/developerEnvironmentTabs/user/{userId}ADMIN, DEVELOPER_APPuserId (path)List<TabModel>Get user's environment tabs
POST/developerEnvironmentTabs/user/{userId}ADMIN, DEVELOPER_APPTabModel bodyTabModelCreate new tab
PATCH.../user/{userId}/updateADMIN, DEVELOPER_APPTabModel bodyTabModelUpdate tab
PATCH.../user/{userId}/reorderADMIN, DEVELOPER_APPList<Long> body (IDs)List<TabModel>Reorder tabs
DELETE.../user/{userId}/tab/{tabId}ADMIN, DEVELOPER_APPPath varsResponseEntityDelete tab

Notification System

MethodPathAuthParametersReturnsDescription
GET/getRecipientListADMINEmail listNotification recipients
GET/sendNotificationADMINSend outdated tutorial alerts
GET/sendTutorialNotificationADMINTutorial IDSend notification for one tutorial
POST/updateRecipientListADMINUpdated list bodyUpdate recipient emails

External Integrations

SystemPurposeTransport
Adobe AnalyticsTutorial completion eventsHTTPS to sap.d1.sc.omtrdc.net
NGDSSAP internal trackingBTP Destination Service
SCICross-domain identityBTP Destination Service
AEMContent management (frontend)AEM calls IMS as backend
MailContributor notificationsjavax.mail via destination

Spring Profiles

ProfilePurpose
cloudCloud Foundry deployment (default)
localLocal dev (debug logging, analytics disabled)
imstestTest environment
imsprodProduction

Key Source Locations

WhatPath
Controllersapplication/src/main/java/com/sap/developers/ims/controller/
Repositoriesapplication/src/main/java/com/sap/developers/ims/repository/
Modelsapplication/src/main/java/com/sap/developers/ims/model/
Servicesapplication/src/main/java/com/sap/developers/ims/service/
Configurationapplication/src/main/java/com/sap/developers/ims/configuration/
DB Migrationsapplication/src/main/resources/db/changelog/
SecurityWebSecurityConfiguration.java, ServiceSecurityConfiguration.java