Connect your product to your customers' HR systems
Let your customers connect Personio, Workday, Leapsome and more through a hosted, consent-first connect flow. Read employees, employments, time off and teams from one API, and get a webhook whenever something changes.
- Hosted connect flow
- Consent per data category
- Signed webhooks
How it works
From your client's HR system to your product in four steps
Integrate once. Your customers' clients connect their own HR system, and you work with one data model no matter which vendor is behind it.
- 1
Connect
Your client opens a hosted popup, follows a setup guide for their HR system and grants consent to specific data.
openConnect(url) - 2
Sync & normalize
We sync on a schedule and in near real time where the vendor sends webhooks, mapping every vendor into one model.
change detection - 3
Read one API
Employees, employments, teams, locations, time off and custom fields, filtered to what your client consented to.
GET /v1/hris/* - 4
React to changes
Signed webhooks tell you what changed (IDs and field names), so you never poll and never receive personal data in payloads.
hris.employees.changed
Unified data model
One model instead of one integration per vendor
Every vendor is mapped into the same shapes with stable IDs. Unknown vendor values never break a sync: they map to OTHER and you can remap them per connection.
- Employees Names, work email, status, start and end dates, manager, team, location
- Employments & compensation Job, type, history; pay only with the compensation scope
- Teams & locations Departments with hierarchy, offices with ISO country codes
- Time off Types, requests and balances; never free-text notes or reasons
- Custom fields Map any vendor field to your own keys, per connection
{
"id": "emp_3eIG9JE6kd2z1Spd",
"remoteId": "21001",
"firstName": "Anna",
"lastName": "Weber",
"displayName": "Anna Weber",
"workEmail": "anna.weber@bakery.example",
"personalEmail": null,
"employmentStatus": "ACTIVE",
"startDate": "2024-03-01",
"terminationDate": null,
"jobTitle": "Head of People",
"managerId": "emp_2kd91Lq0aWm3XyZb",
"teamIds": ["team_7Hc2pQx"],
"locationId": "loc_Ber1n9x",
"customFields": { "cost_center": "DE-OPS-12" },
"changedAt": "2026-10-27T09:12:44.120Z",
"remoteDeletedAt": null
} Integrations
Honest about what works today
We build for HR systems where your client can create API credentials themselves. Status labels are generated from the code, not from marketing.
- File export (CSV, Excel) Global Syncing now
- CharlieHR EU Connect only
- Deel Global Connect only
- Kenjo EU Connect only
- Paychex Flex US Connect only
- Leapsome EU Priority
- Personio EU Priority
- Workday Global Priority
- ADP Workforce Now US Coming soon
- Dayforce US Coming soon
- Factorial EU Coming soon
- Humaans EU Coming soon
Plus a developer sandbox with realistic data that syncs every entity today.
Why Remic
Built around consent and transparency
Unified APIs usually compete on the number of logos. We compete on trust: what your clients agreed to, what actually syncs, and what happens when something breaks.
- Available
Consent you can show
Every connection stores who granted access, to which data categories and when. Data outside the granted scopes is dropped when stored and again when read.
- Available
A portal for your clients
Your client's HR admin sees every app connected to their HR system, what each can access and how it was used, and can revoke access in one click.
- Available
Honest coverage
Our coverage page is generated from the code: per HR system, what syncs today, what your client needs, and what the vendor’s API terms allow.
- Partly available
Real time where vendors allow it
Where an HR system sends webhooks, changes reach you in seconds through targeted syncs. Everything else syncs on a schedule.
- Available
Connections that heal themselves
When credentials expire, your client gets a reconnect link by email. You get a webhook, not a support ticket.
- Available
Built for developers
Instant sandbox with realistic data, OpenAPI reference, signed webhooks, and request logs and integration health for every connection.
For developers
Ship an HR integration in an afternoon
A connect session from your backend, one call in your frontend, then plain REST and webhooks.
1. Create a connect session
curl -X POST https://api.remic.dev/v1/connect/sessions \
-H "Authorization: Bearer $REMIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"endUserOriginId": "client-42",
"endUserName": "Bakery Schmidt GmbH",
"scopes": ["employees.basic", "teams", "time_off"]
}'
# → { "sessionId": "…", "url": "https://connect…/?token=…", "expiresAt": "…" } const res = await fetch('https://api.remic.dev/v1/connect/sessions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.REMIC_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
endUserOriginId: 'client-42',
endUserName: 'Bakery Schmidt GmbH',
scopes: ['employees.basic', 'teams', 'time_off'],
}),
});
const { url } = await res.json(); // hand this to your frontend 2. Open the connect popup
import { openConnect } from '@remic/connect-sdk';
// url comes from your backend (POST /v1/connect/sessions)
const { connectionId } = await openConnect(url);
// Confirm server-side: GET /v1/connections/:id 3. Read unified data
curl "https://api.remic.dev/v1/hris/employees?pageSize=100" \
-H "Authorization: Bearer $REMIC_API_KEY" \
-H "X-Connection-Id: $CONNECTION_ID"
# → { "results": [ …employees ], "next": "eyJjIjoi…" }
# Pass ?cursor=<next> for the next page, ?updatedAfter=<ISO> for changes only. async function* employees(connectionId: string) {
let cursor: string | null = null;
do {
const query = new URLSearchParams({ pageSize: '100', ...(cursor ? { cursor } : {}) });
const res = await fetch(`https://api.remic.dev/v1/hris/employees?${query}`, {
headers: {
Authorization: `Bearer ${process.env.REMIC_API_KEY}`,
'X-Connection-Id': connectionId,
},
});
const page = await res.json();
yield* page.results;
cursor = page.next;
} while (cursor);
} 4. Verify webhooks
import crypto from 'node:crypto';
// header: X-Remic-Signature: t=<unix seconds>,v1=<hex>
export function verify(rawBody: string, header: string, secret: string): boolean {
const t = /t=(\d+)/.exec(header)?.[1];
const v1 = /v1=([0-9a-f]{64})/.exec(header)?.[1];
if (!t || !v1) return false;
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // replay window
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
} {
"id": "evt_8KfQ2…",
"type": "hris.employees.changed",
"createdAt": "2026-10-27T09:12:44.120Z",
"data": {
"connectionId": "6957e4c8-…",
"syncRunId": "47e872fb-…",
"created": ["emp_3eIG9JE6kd2z1Spd"],
"updated": [{ "id": "emp_14Mylj48go5gqDpt", "changedFields": ["jobTitle"] }],
"deleted": [],
"part": 1,
"totalParts": 1
}
} Security
Privacy by design, not by policy
HR data is the most sensitive data your customers have. We treat it that way by default.
- Credentials encrypted per connection (AES-256-GCM envelope encryption)
- Scopes enforced when data is stored and again when it is read
- Webhook payloads carry IDs and field names, never employee values
- Audit log of every action by your team, API keys and your clients
- Credentials are never returned by any endpoint
- Rate limiting on every public endpoint
FAQ
Questions buyers ask us
Which HR systems can I use today?
The developer sandbox syncs every entity today. CharlieHR, Kenjo, Deel and Paychex Flex can be connected and their credentials are verified, while data sync for them is being built. Personio, Leapsome and Workday are next. The coverage page always shows the current state. See coverage
Do you need partnerships with the HR vendors?
No. We build for HR systems where your client can create API credentials themselves and hand them to us through the connect flow. Systems that only allow API access to formal partners are not supported yet, and we say so on the coverage page.
Do you store employee data?
Yes: a normalized copy, so reads are fast and we can tell you exactly what changed. We only store the data categories your client consented to, never free-text notes such as absence reasons, and we delete the copy when access is revoked or the connection is deleted.
Where will data be hosted?
We are in early access. Production hosting for real HR data will be in the EU, and we will publish the hosting provider and our sub-processors before any real client data is onboarded. Remic is built to run on any major cloud or on an EU-owned provider. Security details
How fresh is the data?
HR systems are synced on a schedule (every 6 hours by default). Where the HR system can send webhooks, changes are picked up within seconds through targeted syncs, and you get a webhook from us in turn.
What if I need data that is not in the unified model?
Map vendor fields to your own custom fields per connection, or use read-only passthrough to call the HR system’s API directly. Passthrough needs an extra scope that your client must grant explicitly.
What does it cost?
We are in early access. Design partners get the sandbox for free and early-access pricing. We will publish our pricing openly. Pricing and design partners
Build your HR integration on Remic
Start in the sandbox today. We are onboarding a small group of design partners: you get direct access to the founders and help decide which HR systems come next.