---
title: "HR25 Compensation API"
url: "https://developer.migros.ch/apis/hr25-compensation-api-0/versions/81e689e4-d95b-44d7-a80e-882b791b85b2"
---

# HR25 Compensation API

OpenAPI specification document.

```json
{"components":{"schemas":{"Body_ingest_csv_ingestion_csv_post":{"properties":{"file":{"format":"binary","title":"File","type":"string"}},"required":["file"],"title":"Body_ingest_csv_ingestion_csv_post","type":"object"},"Body_ingest_excel_ingestion_xlsx_post":{"properties":{"file":{"format":"binary","title":"File","type":"string"}},"required":["file"],"title":"Body_ingest_excel_ingestion_xlsx_post","type":"object"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"title":"Detail","type":"array"}},"title":"HTTPValidationError","type":"object"},"JobStatus":{"description":"Status of an async salary calculation job","properties":{"error":{"description":"Error message if status is failed","type":"string"},"job_id":{"description":"Unique job identifier (UUID)","type":"string"},"status":{"description":"Job status: running, completed, or failed","enum":["running","completed","failed"],"type":"string"}},"required":["job_id","status"],"title":"JobStatus","type":"object"},"MissingGeozonesError":{"description":"Error returned when required geozones are missing from the lohnskala","properties":{"detail":{"properties":{"error":{"description":"Error code","example":"missing_geozones","type":"string"},"message":{"description":"Human-readable error message","example":"Les geozones suivantes sont manquantes dans la lohnskala: R03, R04","type":"string"},"missing_geozones":{"description":"List of missing geozone codes","example":["R03","R04"],"items":{"type":"string"},"type":"array"}},"type":"object"}},"title":"MissingGeozonesError","type":"object"},"ValidationError":{"properties":{"ctx":{"title":"Context","type":"object"},"input":{"title":"Input"},"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"title":"Location","type":"array"},"msg":{"title":"Message","type":"string"},"type":{"title":"Error Type","type":"string"}},"required":["loc","msg","type"],"title":"ValidationError","type":"object"}}},"externalDocs":{"description":"Details, examples and more information can be found here.","url":"https://developer-dev.migros.ch/mgb-developer-portal/documentation/api-docs/hr25-compensation-api"},"info":{"contact":{"email":"florian.genilloud@mgb.ch","name":"MGB-SDI"},"description":"API pour l'analyse de compensation HR25","title":"HR25 Compensation API","version":"0.1.0"},"openapi":"3.0.3","paths":{"/migros/human-resources/hrsolcomp/v1/health":{"get":{"description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Health Check Health Get","type":"object"}}},"description":"Successful Response"}},"summary":"Health Check","tags":["health"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/ingestion/csv":{"post":{"description":"Ingest a CSV file into Dataverse.\n\nUses the same transformation pipeline as test_ingestion.py:\nrename columns, prepare for Dataverse, and create records.","operationId":"ingest_csv_ingestion_csv_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_csv_ingestion_csv_post"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Ingest Csv Ingestion Csv Post","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Ingest Csv","tags":["ingestion"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/ingestion/xlsx":{"post":{"description":"Ingest an Excel file into Dataverse.\n\nUses the same transformation pipeline as test_ingestion.py:\nrename columns, prepare for Dataverse, and create records.","operationId":"ingest_excel_ingestion_xlsx_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_excel_ingestion_xlsx_post"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Ingest Excel Ingestion Xlsx Post","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Ingest Excel","tags":["ingestion"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/me":{"get":{"description":"Get current user information.\n\nReturns Dataverse user info including:\n- userId: Dataverse system user GUID\n- businessUnitId: User's business unit GUID\n- organizationId: Organization GUID\n\nPowerApps usage:\n    Simply call this endpoint - the connector passes your token automatically.","operationId":"get_current_user_me_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Get Current User Me Get","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Get Current User","tags":["user"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/me/business-unit":{"get":{"description":"Get current user's business unit details.\n\nReturns:\n    Business unit record with name and ID.","operationId":"get_current_business_unit_me_business_unit_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Get Current Business Unit Me Business Unit Get","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Get Current Business Unit","tags":["user"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/me/details":{"get":{"description":"Get full user details from Dataverse.\n\nReturns complete systemuser record including:\n- fullname: Display name\n- internalemailaddress: Email\n- businessunitid: Business unit reference\n- title: Job title\n- And many more fields...","operationId":"get_current_user_details_me_details_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Get Current User Details Me Details Get","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Get Current User Details","tags":["user"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/salary/calculate":{"post":{"description":"Launch salary calculation in the background.\n\nReturns immediately with a job_id. The calculation runs asynchronously\nand writes results directly to Dataverse.\nUse GET /salary/jobs/{job_id} to check progress.","operationId":"calculate_salary_salary_calculate_post","parameters":[{"description":"If true, stop after Phase 1 and only update position_in_band and position_category fields. Phase 2 is skipped.","in":"query","name":"phase1_only","required":false,"schema":{"default":false,"title":"Phase1 Only","type":"boolean"}},{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatus"}}},"description":"Job accepted"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Calculate Salary","tags":["salary"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/salary/jobs":{"get":{"description":"Check the status of a salary calculation job.","operationId":"get_job_status_salary_jobs_get","parameters":[{"description":"UUID returned by POST /salary/calculate","in":"query","name":"job_id","required":true,"schema":{"title":"Job ID","type":"string"}},{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatus"}}},"description":"Job status"},"404":{"description":"Job not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Get Job Status","tags":["salary"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/salary/projection-grid":{"get":{"description":"Generate projection grid for all dialogs, experiences, and positions.\n\nCreates a comprehensive dataset of salary trajectories across all possible\nstarting conditions.\n\nArgs:\n    budget_factor: Budget constraint multiplier (1.0 = 100% funded, 0.87 = 87%)\n\nReturns:\n    Dictionary with projection grid data.","operationId":"get_projection_grid_salary_projection_grid_get","parameters":[{"in":"query","name":"budget_factor","required":false,"schema":{"default":1,"title":"Budget Factor","type":"number"}},{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Get Projection Grid Salary Projection Grid Get","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Get Projection Grid","tags":["salary"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}},"/migros/human-resources/hrsolcomp/v1/salary/strukturelle-massnahmen":{"post":{"description":"Apply structural salary measures to eligible employees.\n\nFetches active rules from strukturelle_params, evaluates them against all latest\n non-excluded employees, and writes cumulated amounts back to Dataverse.","operationId":"apply_strukturelle_salary_strukturelle_massnahmen_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"title":"Authorization","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"nb_employees_impacted":{"description":"Number of employees with non-zero structural amount","type":"integer"},"nb_rules":{"description":"Number of active rules applied","type":"integer"},"total":{"description":"Total CHF allocated across all employees","type":"number"}},"title":"StruktuelleResponse","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Apply Strukturelle Massnahmen","tags":["salary"],"x-kong-route-defaults":{"strip_path":true,"tags":["hr25-comp"]}}}},"servers":[{"url":"https://hr25-comp.service.migros.cloud"}],"tags":[{"description":"Health check endpoints","name":"health"},{"description":"Current user information","name":"user"},{"description":"Salary calculation endpoints","name":"salary"},{"description":"Data ingestion endpoints","name":"ingestion"},{"name":"m-api"},{"name":"hr"}],"x-active-from":"04-03-2026","x-company":"migros","x-edm-domain":"human-resources","x-eol":"01-01-2030","x-headmatter":{"readable_by":"*"},"x-kong-service-defaults":{"connect_timeout":5000,"read_timeout":240000,"write_timeout":240000},"x-kong-tags":["hr25-comp"],"x-leanix-id":"d34996eb-5f3e-4695-b3b9-fd6cee01287a"}
```
