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_APP—EntityModel<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 params—GDPR 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_APP—OverallStatisticOverall 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_AUTHOR—TutorialMetaInfographicsMetadata 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_APP—voidClean up unused tags
POST/tags/interestItemsADMIN, CONTENT_AUTHOR, DEVELOPER_APPList<String> bodyResponseEntityUpdate items of interest

MethodPathAuthParametersReturnsDescription
GET/findAllFeaturedTasksADMIN, DEVELOPER_APP—ListGet all featured tasks
GET/getAllFeaturedIdsListADMIN, DEVELOPER_APP—List<Long>Featured task IDs
GET/getAllFeaturedIdsMapADMIN, DEVELOPER_APP—Map<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/headersAuthenticated—Request headersDebug helper
GET/__debug/principalAuthenticated—Principal infoAuth debug
GET/application/configurationADMIN—List<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/getRecipientListADMIN—Email listNotification recipients
GET/sendNotificationADMIN——Send outdated tutorial alerts
GET/sendTutorialNotificationADMINTutorial ID—Send notification for one tutorial
POST/updateRecipientListADMINUpdated list body—Update 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