API and MCP reference
Generated from the code, so it always matches the live API. New here? Start with the guide: your first call in five minutes.
- Base address:
https://api.mihnaro.com/api/v1- Endpoints:
- 1249
- MCP tools:
- 461
Public and sign-in
No token: signing in and password recovery.
brand 1 endpoint
-
GET
/api/v1/app/brandGET /api/v1/app/brand (docs/mobile-app.md, "أيقونة التطبيق"): the main brand from the admi...GET /api/v1/app/brand (docs/mobile-app.md, "أيقونة التطبيق"): the main brand from the admin panel, for the app's build script (icon, splash) and its screens. Public and cacheable. The icon sources fall back to the mark; `version` changes whenever any of it does. data: name, colors {brand, accent}, logo_url, logo_white_url, mark_url, mark_white_url, icon_url, icon_white_url, icon_source (app_icon|mark), version.
- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/brand" \ -H "Accept: application/json"
branding 1 endpoint
-
GET
/api/v1/app/brandingWhat the mobile app is painted with before anyone signs in: the system palette and logos f...What the mobile app is painted with before anyone signs in: the system palette and logos from the admin panel.
- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/branding" \ -H "Accept: application/json"
help 3 endpoints
-
GET
/api/v1/help/categories- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/help/categories" \ -H "Accept: application/json" -
GET
/api/v1/help/articles- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
qnullable|string|'max:' . \App\Support\Limits::chars(100)categorynullable|string|in:getting-started,employees,payroll,leaves,attendance,documents,performance,recruitment,reports,settings,apiExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/help/articles?q=...&category=getting-started" \ -H "Accept: application/json" -
GET
/api/v1/help/articles/{category}/{article}- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
categorystring · [a-z0-9-]+ The record's ID. articlestring · [a-z0-9-]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/help/articles/{category}/{article}" \ -H "Accept: application/json"
meta 1 endpoint
-
GET
/api/v1/app/meta- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/meta" \ -H "Accept: application/json"
password 3 endpoints
-
GET
/api/v1/app/password/options- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/password/options" \ -H "Accept: application/json" -
POST
/api/v1/app/password/forgot- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
emailrequiredrequired|emailchannelrequiredrequired|Rule::in(self::availableChannels())Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/password/forgot" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"email":"[email protected]","channel":"..."}' -
POST
/api/v1/app/password/reset- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
tokenrequiredrequired|stringpasswordrequiredrequired|string|confirmed|\App\Support\PasswordPolicy::rule($link->user)|new \App\Rules\NotRecentlyUsedPassword($link->user)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/password/reset" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"token":"...","password":"..."}'
server-switch 1 endpoint
-
GET
/api/v1/app/server-switchGET /api/v1/app/server-switch (docs/mobile-server-switch.md): only whether the app's live/...GET /api/v1/app/server-switch (docs/mobile-server-switch.md): only whether the app's live/dev switch works now, nothing else. Public, never cached: the app asks at the moment of the 15th tap, and on dev at every open.
- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/server-switch" \ -H "Accept: application/json"
site 2 endpoints
-
GET
/api/v1/site/contact/options- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/site/contact/options" \ -H "Accept: application/json" -
POST
/api/v1/site/contact- Sign-in
- None
- Permission
- Any signed-in user of the company
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/site/contact" \ -H "Accept: application/json"
sso 1 endpoint
-
POST
/api/v1/app/sso/tokenThe mobile app after single sign-on (MobileSso): the one-time code and its PKCE code_verif...The mobile app after single sign-on (MobileSso): the one-time code and its PKCE code_verifier. No 2FA code: the provider checked.
- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
coderequiredrequired|string|max:100code_verifierrequiredrequired|string|min:43|max:128device_namerequiredrequired|string|max:80device_idnullable|string|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/sso/token" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"code":"...","code_verifier":"...","device_name":"...","device_id":"..."}'
token 1 endpoint
-
POST
/api/v1/app/token- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
emailrequiredrequired|string|max:190passwordrequiredrequired|stringdevice_namerequiredrequired|string|max:80codenullable|string|max:20device_idnullable|string|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/token" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"email":"...","password":"...","device_name":"...","code":"...","device_id":"..."}'
tools 4 endpoints
-
GET
/api/v1/tools/calculators- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/tools/calculators" \ -H "Accept: application/json" -
GET POST
/api/v1/tools/calculators/{tool}- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
toolstring · end-of-service|net-salary|gross-salary|overtime|leave|cost-to-company The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/tools/calculators/{tool}" \ -H "Accept: application/json" -
GET
/api/v1/tools/countriesEvery country with rules: the tools each can run, its variants and how many of its rules a...Every country with rules: the tools each can run, its variants and how many of its rules are verified.
- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/tools/countries" \ -H "Accept: application/json" -
GET
/api/v1/tools/countries/{country}A country's rules in force, with each rule's source and verified mark; a country with none...A country's rules in force, with each rule's source and verified mark; a country with none says so.
- Sign-in
- None
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
countrystring · [A-Za-z0-9-]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/tools/countries/{country}" \ -H "Accept: application/json"
App API
An app token or a company API key. Paths with {company} take the company's ID.
access 10 endpoints
-
GET
/api/v1/app/companies/{company}/access/time-zones- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/time-zones" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/access/time-zones- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)device_tz_idrequiredrequired|integer|between:2,50|unique:access_time_zonesschedulearrayschedule.*array|max:3schedule.*.*array|size:2schedule.*.*.*date_format:H:iholidays_closedsometimes|booleanbranch_idsometimes|nullable|integer|exists:branches,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/time-zones" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"device_tz_id":1,"schedule":[],"holidays_closed":true,"branch_id":1}' -
PUT
/api/v1/app/companies/{company}/access/time-zones/{zone}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.zoneinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)device_tz_idrequiredrequired|integer|between:2,50|unique:access_time_zonesschedulearrayschedule.*array|max:3schedule.*.*array|size:2schedule.*.*.*date_format:H:iholidays_closedsometimes|booleanbranch_idsometimes|nullable|integer|exists:branches,idExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/time-zones/{zone}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"device_tz_id":1,"schedule":[],"holidays_closed":true,"branch_id":1}' -
GET
/api/v1/app/companies/{company}/access/levels- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/levels" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/access/levels- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)access_time_zone_idnullable|integer|exists:access_time_zones,iddoorsrequiredrequired|array|min:1|max:200doors.*.device_idrequiredrequired|integer|exists:biometric_devices,iddoors.*.doornullable|integer|between:0,8branch_idsometimes|nullable|integer|exists:branches,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/levels" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"access_time_zone_id":1,"doors":[],"branch_id":1}' -
PUT
/api/v1/app/companies/{company}/access/levels/{level}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.levelinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)access_time_zone_idnullable|integer|exists:access_time_zones,iddoorsrequiredrequired|array|min:1|max:200doors.*.device_idrequiredrequired|integer|exists:biometric_devices,iddoors.*.doornullable|integer|between:0,8branch_idsometimes|nullable|integer|exists:branches,idExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/levels/{level}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"access_time_zone_id":1,"doors":[],"branch_id":1}' -
GET
/api/v1/app/companies/{company}/access/assignments- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/access/assignments- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
access_level_idnullable|required_unless:effect,deny|integer|exists:access_levels,idtarget_typerequiredrequired|in:employee,group,department,branch,position,all,visitoreffectrequiredrequired|in:allow,denytarget_idnullable|Rule::requiredIf(fn() => in_array($input['target_type'] ?? '', ['employee', 'gro...|integerbiometric_device_idnullable|integer|exists:biometric_devices,idvisitor_namenullable|required_if:target_type,visitor|string|max:100visitor_pinnullable|required_if:target_type,visitor|string|max:32|regex:/^[0-9]+$/visitor_cardnullable|string|max:32starts_atnullable|dateends_atnullable|date|after:starts_at|required_if:target_type,visitornotenullable|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"access_level_id":1,"target_type":"employee","effect":"allow","target_id":1,"biometric_device_id":1,"visitor_name":"...","visitor_pin":"...","visitor_card":"...","starts_at":"2026-11-01","ends_at":"2026-11-01","note":"..."}' -
PUT
/api/v1/app/companies/{company}/access/assignments/{assignment}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assignmentinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
access_level_idnullable|required_unless:effect,deny|integer|exists:access_levels,idtarget_typerequiredrequired|in:employee,group,department,branch,position,all,visitoreffectrequiredrequired|in:allow,denytarget_idnullable|Rule::requiredIf(fn() => in_array($input['target_type'] ?? '', ['employee', 'gro...|integerbiometric_device_idnullable|integer|exists:biometric_devices,idvisitor_namenullable|required_if:target_type,visitor|string|max:100visitor_pinnullable|required_if:target_type,visitor|string|max:32|regex:/^[0-9]+$/visitor_cardnullable|string|max:32starts_atnullable|dateends_atnullable|date|after:starts_at|required_if:target_type,visitornotenullable|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"access_level_id":1,"target_type":"employee","effect":"allow","target_id":1,"biometric_device_id":1,"visitor_name":"...","visitor_pin":"...","visitor_card":"...","starts_at":"2026-11-01","ends_at":"2026-11-01","note":"..."}' -
DELETE
/api/v1/app/companies/{company}/access/{kind}/{id}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · time-zones|levels|assignments The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/access/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
accounting 13 endpoints
-
GET
/api/v1/app/companies/{company}/accounting- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/accounting/{provider}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/accounting/{provider}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/accounting/{provider}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/accounting/{provider}/test- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/accounting/{provider}/refresh- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/refresh" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/accounting/{provider}/catalogThe ledger's accounts, analytics, partners and journals as last read.The ledger's accounts, analytics, partners and journals as last read.
- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/catalog" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/accounting/{provider}/oauth-urlOAuth 2 (QuickBooks, Xero): the consent link to open in a browser signed in to Mihnaro as...OAuth 2 (QuickBooks, Xero): the consent link to open in a browser signed in to Mihnaro as the same person.
- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/oauth-url" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/accounting/{provider}/mappings- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/mappings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/accounting/{provider}/mappingsPUT items: [{type, local_key, external_id}]; auto_match: true maps accounts whose codes ma...PUT items: [{type, local_key, external_id}]; auto_match: true maps accounts whose codes match.
- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/mappings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/accounting/{provider}/preview- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
run_idrequiredrequired|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/preview?run_id=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/accounting/{provider}/post- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
run_idrequiredrequired|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/post" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"run_id":1}' -
POST
/api/v1/app/companies/{company}/accounting/{provider}/sync-employees- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idssometimes|arrayemployee_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting/{provider}/sync-employees" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_ids":[]}'
accounting-postings 3 endpoints
-
GET
/api/v1/app/companies/{company}/accounting-postings- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting-postings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/accounting-postings/{posting}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.postinginteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting-postings/{posting}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/accounting-postings/{posting}/{action}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.postinginteger The record's ID. actionstring · retry|reverse|repost The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/accounting-postings/{posting}/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
activity-log 1 endpoint
-
GET
/api/v1/app/companies/{company}/activity-logGET activity-log?tab=changes|requests|sign_ins plus the tab's filtersGET activity-log?tab=changes|requests|sign_ins plus the tab's filters
- Sign-in
- App token or company API key
- Permission
activity.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/activity-log" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
air-ticket-policies 7 endpoints
-
GET
/api/v1/app/companies/{company}/air-ticket-policies- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/air-ticket-policies- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
apply_changesnullable|in:update,newbalance_daterequired_if:apply_changes,new|nullable|datename_arnullable|string|'max:' . \App\Support\Limits::chars(150)name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)ticketsrequiredrequired|numeric|min:0|max:20period_monthsrequiredrequired|integer|min:1|max:120period_anchorrequiredrequired|in:hire,calendaraccrualrequiredrequired|in:period_start,monthlyamountrequiredrequired|numeric|min:0family_membersnullable|integer|min:0|max:20eligible_after_monthsnullable|integer|min:0|max:120applies_torequiredrequired|in:all,assignedexpire_optionnullable|in:after,immediately,noneexpire_after_monthsrequired_if:expire_option,after|nullable|integer|min:1|max:120distributionnullable|in:per_person,shareddefault_payrollnullable|in:in_payroll,off_cycledefault_request_typenullable|in:cash_out,tickettransaction_type_idnullable|exists:transaction_types,idgl_identifiernullable|string|max:60clearance_accountnullable|string|max:60setupsnullable|array|max:30setups.*.position_idsnullable|arraysetups.*.position_ids.*integer|exists:positions,idsetups.*.nationalitiesnullable|string|max:500setups.*.years_fromnullable|numeric|min:0|max:60setups.*.years_tonullable|numeric|min:0|max:60setups.*.amountnullable|numeric|min:0setups.*.currencynullable|string|max:3setups.*.beneficiariesnullable|arraysetups.*.beneficiaries.*.relationnullable|in:parent,spouse,child,siblingsetups.*.beneficiaries.*.deductionnullable|numeric|min:0|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"apply_changes":"update","balance_date":"2026-11-01","name_ar":"...","name_en":"...","tickets":1.5,"period_months":1,"period_anchor":"hire","accrual":"period_start","amount":1.5,"family_members":1,"eligible_after_months":1,"applies_to":"all","expire_option":"after","expire_after_months":1,"distribution":"per_person","default_payroll":"in_payroll","default_request_type":"cash_out","transaction_type_id":"...","gl_identifier":"...","clearance_account":"...","setups":[]}' -
GET
/api/v1/app/companies/{company}/air-ticket-policies/{policy}The policy and the employees in my payroll.manage scope it was given to, with their openin...The policy and the employees in my payroll.manage scope it was given to, with their opening balance.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/air-ticket-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
apply_changesnullable|in:update,newbalance_daterequired_if:apply_changes,new|nullable|datename_arnullable|string|'max:' . \App\Support\Limits::chars(150)name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)ticketsrequiredrequired|numeric|min:0|max:20period_monthsrequiredrequired|integer|min:1|max:120period_anchorrequiredrequired|in:hire,calendaraccrualrequiredrequired|in:period_start,monthlyamountrequiredrequired|numeric|min:0family_membersnullable|integer|min:0|max:20eligible_after_monthsnullable|integer|min:0|max:120applies_torequiredrequired|in:all,assignedexpire_optionnullable|in:after,immediately,noneexpire_after_monthsrequired_if:expire_option,after|nullable|integer|min:1|max:120distributionnullable|in:per_person,shareddefault_payrollnullable|in:in_payroll,off_cycledefault_request_typenullable|in:cash_out,tickettransaction_type_idnullable|exists:transaction_types,idgl_identifiernullable|string|max:60clearance_accountnullable|string|max:60setupsnullable|array|max:30setups.*.position_idsnullable|arraysetups.*.position_ids.*integer|exists:positions,idsetups.*.nationalitiesnullable|string|max:500setups.*.years_fromnullable|numeric|min:0|max:60setups.*.years_tonullable|numeric|min:0|max:60setups.*.amountnullable|numeric|min:0setups.*.currencynullable|string|max:3setups.*.beneficiariesnullable|arraysetups.*.beneficiaries.*.relationnullable|in:parent,spouse,child,siblingsetups.*.beneficiaries.*.deductionnullable|numeric|min:0|max:100Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"apply_changes":"update","balance_date":"2026-11-01","name_ar":"...","name_en":"...","tickets":1.5,"period_months":1,"period_anchor":"hire","accrual":"period_start","amount":1.5,"family_members":1,"eligible_after_months":1,"applies_to":"all","expire_option":"after","expire_after_months":1,"distribution":"per_person","default_payroll":"in_payroll","default_request_type":"cash_out","transaction_type_id":"...","gl_identifier":"...","clearance_account":"...","setups":[]}' -
DELETE
/api/v1/app/companies/{company}/air-ticket-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/air-ticket-policies/{policy}/assignscope all | selected (employee_ids[]), opening_balance.scope all | selected (employee_ids[]), opening_balance.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
scoperequiredrequired|in:all,selectedemployee_idsrequired_if:scope,selected|arrayemployee_ids.*integeropening_balancenullable|numeric|min:0|max:99Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies/{policy}/assign" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"scope":"all","employee_ids":[],"opening_balance":1.5}' -
DELETE
/api/v1/app/companies/{company}/air-ticket-policies/{policy}/employees/{employee}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. employeeinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-ticket-policies/{policy}/employees/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
air-tickets 6 endpoints
-
GET
/api/v1/app/companies/{company}/air-ticketsTransactions in my scope with the screen's filters (employee_id, policy, status, payment,...Transactions in my scope with the screen's filters (employee_id, policy, status, payment, payroll, request_status, from, to, paid_from, paid_to, resident_id).
- Sign-in
- App token or company API key
- Permission
payroll.air_tickets.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-tickets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/air-tickets/balancesEvery active employee's balance in my scope under each of their policies (policy filters o...Every active employee's balance in my scope under each of their policies (policy filters one).
- Sign-in
- App token or company API key
- Permission
payroll.air_tickets.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-tickets/balances" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/air-tickets- Sign-in
- App token or company API key
- Permission
payroll.air_tickets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerpolicy_idnullable|integerslicenullable|integer|min:0ticketsrequired_without:owners|nullable|array|min:1|max:20tickets.*.ownerrequiredrequired|string|max:20|distincttickets.*.countnullable|numeric|gt:0|max:50tickets.*.amountnullable|numeric|min:0ownersrequired_without:tickets|nullable|array|min:1owners.*string|max:20cash_outnullable|booleanamountnullable|numeric|min:0destinationnullable|string|max:150travel_daterequiredrequired|datereturn_datenullable|date|after_or_equal:travel_datenotesnullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-tickets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"policy_id":1,"slice":1,"tickets":[],"owners":[],"cash_out":true,"amount":1.5,"destination":"...","travel_date":"2026-11-01","return_date":"2026-11-01","notes":"..."}' -
POST
/api/v1/app/companies/{company}/air-tickets/paidids[], paid_at, payment_reference: booked (not cash out) unpaid ones are marked.ids[], paid_at, payment_reference: booked (not cash out) unpaid ones are marked.
- Sign-in
- App token or company API key
- Permission
payroll.air_tickets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
idsrequiredrequired|array|min:1ids.*integerpaid_atrequiredrequired|datepayment_referencenullable|string|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-tickets/paid" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ids":[],"paid_at":"2026-11-01","payment_reference":"..."}' -
POST
/api/v1/app/companies/{company}/air-tickets/bulk-deleteids[]: the unpaid ones are deleted; returns how many.ids[]: the unpaid ones are deleted; returns how many.
- Sign-in
- App token or company API key
- Permission
payroll.air_tickets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
idsrequiredrequired|arrayids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-tickets/bulk-delete" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ids":[]}' -
DELETE
/api/v1/app/companies/{company}/air-tickets/{transaction}- Sign-in
- App token or company API key
- Permission
payroll.air_tickets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.transactioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/air-tickets/{transaction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
announcements 9 endpoints
-
GET
/api/v1/app/companies/{company}/announcementsq: search; show; per_page. Only those the person may read (their targets; all with announc...q: search; show; per_page. Only those the person may read (their targets; all with announcements.manage).
- Sign-in
- App token or company API key
- Permission
self.announcements | announcements.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/announcements/{announcement}- Sign-in
- App token or company API key
- Permission
self.announcements | announcements.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.announcementinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/{announcement}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/announcements/{announcement}/readMarks one the person may read as read (their bell notice of it), as opening it on the scre...Marks one the person may read as read (their bell notice of it), as opening it on the screen does.
- Sign-in
- App token or company API key
- Permission
self.announcements | announcements.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.announcementinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/{announcement}/read" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/announcements/images/{file}A picture of the company's announcements (their text and galleries).A picture of the company's announcements (their text and galleries).
- Sign-in
- App token or company API key
- Permission
self.announcements | announcements.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.filestring · [A-Za-z0-9_-]+\.(png|jpe?g|gif|webp) The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/images/{file}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/announcements/{announcement}/attachments/{index}An attached file of an announcement the person may read (copied from ZenHR or added in Mih...An attached file of an announcement the person may read (copied from ZenHR or added in Mihnaro).
- Sign-in
- App token or company API key
- Permission
self.announcements | announcements.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.announcementinteger The record's ID. indexinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/{announcement}/attachments/{index}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/announcements/mediaMultipart: file, kind (image: for the text or the gallery; file: an attachment). Returns t...Multipart: file, kind (image: for the text or the gallery; file: an attachment). Returns the file to save with.
- Sign-in
- App token or company API key
- Permission
announcements.create | announcements.edit- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/media" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/announcementstitle {en, ar}, body {en, ar}, pinned, starts_on, expires_on, gallery, attachments, target...title {en, ar}, body {en, ar}, pinned, starts_on, expires_on, gallery, attachments, targets (Announcements::save). The people it is for are notified.
- Sign-in
- App token or company API key
- Permission
announcements.create- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(200)title.arnullable|string|'max:' . \App\Support\Limits::chars(200)bodyrequiredrequired|arraybody.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(200000)body.arnullable|string|'max:' . \App\Support\Limits::chars(200000)starts_onnullable|dateexpires_onnullable|date|after_or_equal:starts_onExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"body":{"en":"...","ar":"..."},"starts_on":"2026-11-01","expires_on":"2026-11-01"}' -
PATCH PUT
/api/v1/app/companies/{company}/announcements/{announcement}- Sign-in
- App token or company API key
- Permission
announcements.edit- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.announcementinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/{announcement}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/announcements/{announcement}- Sign-in
- App token or company API key
- Permission
announcements.delete- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.announcementinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/announcements/{announcement}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
api-keys 4 endpoints
-
GET
/api/v1/app/companies/{company}/api-keys- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/api-keys" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/api-keysPOST api-keys: the token is in the answer this once.POST api-keys: the token is in the answer this once.
- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$req|string|max:100abilities$req|array|min:1abilities.*in:read,write,update,deleteip_addressessometimes|nullable|string|max:1000expires_onsometimes|nullable|date|after:todayuser_idsometimes|nullable|integerauth_typesometimes|in:basic,oauth1,oauth2,credentialsconsumer_keysometimes|nullable|string|max:190consumer_secretsometimes|nullable|string|max:500realmsometimes|nullable|string|max:190client_idsometimes|nullable|string|max:190client_secretsometimes|nullable|string|max:500usernamesometimes|nullable|string|max:190passwordsometimes|nullable|string|max:500Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/api-keys" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","abilities":[],"ip_addresses":"...","expires_on":"2026-11-01","user_id":1,"auth_type":"basic","consumer_key":"...","consumer_secret":"...","realm":"...","client_id":"...","client_secret":"...","username":"...","password":"..."}' -
PATCH PUT
/api/v1/app/companies/{company}/api-keys/{apiKey}- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.apiKeyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$req|string|max:100abilities$req|array|min:1abilities.*in:read,write,update,deleteip_addressessometimes|nullable|string|max:1000expires_onsometimes|nullable|date|after:todayuser_idsometimes|nullable|integerauth_typesometimes|in:basic,oauth1,oauth2,credentialsconsumer_keysometimes|nullable|string|max:190consumer_secretsometimes|nullable|string|max:500realmsometimes|nullable|string|max:190client_idsometimes|nullable|string|max:190client_secretsometimes|nullable|string|max:500usernamesometimes|nullable|string|max:190passwordsometimes|nullable|string|max:500Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/api-keys/{apiKey}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","abilities":[],"ip_addresses":"...","expires_on":"2026-11-01","user_id":1,"auth_type":"basic","consumer_key":"...","consumer_secret":"...","realm":"...","client_id":"...","client_secret":"...","username":"...","password":"..."}' -
POST
/api/v1/app/companies/{company}/api-keys/{apiKey}/revoke- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.apiKeyinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/api-keys/{apiKey}/revoke" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
app-activity 1 endpoint
-
GET
/api/v1/app/companies/{company}/app-activityGET app-activity: the sign-in activity of the people in the app_devices.view scope (filter...GET app-activity: the sign-in activity of the people in the app_devices.view scope (filters: user_id, install_id, device_id, event, result, from, to).
- Sign-in
- App token or company API key
- Permission
app_devices.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-activity" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
app-devices 10 endpoints
-
GET
/api/v1/app/companies/{company}/app-devicesGET app-devices: the phones of the people in the app_devices.view scope, with the summary...GET app-devices: the phones of the people in the app_devices.view scope, with the summary (docs/platform-control.md).
- Sign-in
- App token or company API key
- Permission
app_devices.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/app-devices/people/{user}GET app-devices/people/{user}: one person's phones with their IPs and timelines (the perso...GET app-devices/people/{user}: one person's phones with their IPs and timelines (the person themselves, or app_devices.view in scope).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/people/{user}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/app-devices/people/{user}/contextGET app-devices/people/{user}/context (app_devices.context, docs/platform-control.md «بيان...GET app-devices/people/{user}/context (app_devices.context, docs/platform-control.md «بيانات الهاتف»): the phone details this company's switches collected for a person in scope, latest per phone and the history.
- Sign-in
- App token or company API key
- Permission
app_devices.context- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/people/{user}/context" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/app-devices/phones/{install}/test-pushPOST app-devices/phones/{install}/test-push (app_devices.test_push, docs/notifications.md...POST app-devices/phones/{install}/test-push (app_devices.test_push, docs/notifications.md «الإشعار التجريبي»): what Apple or Google answered.
- Sign-in
- App token or company API key
- Permission
app_devices.test_push- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.installinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/phones/{install}/test-push" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/app-devices/allowancesGET app-devices/allowances (?phone_key=, ?active=1): HR's exceptions for the people in sco...GET app-devices/allowances (?phone_key=, ?active=1): HR's exceptions for the people in scope.
- Sign-in
- App token or company API key
- Permission
app_devices.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/allowances" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/app-devices/allowancesPOST app-devices/allowances: user_id, install_id (or phone_key), reason.POST app-devices/allowances: user_id, install_id (or phone_key), reason.
- Sign-in
- App token or company API key
- Permission
app_devices.allow_shared- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
user_idrequiredrequired|integerinstall_idnullable|integer|required_without:phone_keyphone_keynullable|string|max:140|required_without:install_idreasonrequiredrequired|string|min:3|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/allowances" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"user_id":1,"install_id":1,"phone_key":"...","reason":"..."}' -
DELETE
/api/v1/app/companies/{company}/app-devices/allowances/{allowance}DELETE app-devices/allowances/{id}: takes the exception back.DELETE app-devices/allowances/{id}: takes the exception back.
- Sign-in
- App token or company API key
- Permission
app_devices.allow_shared- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.allowanceinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/allowances/{allowance}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/app-devices/not-on-appGET app-devices/not-on-app: q, branch_id, account (yes|no); page, per_page.GET app-devices/not-on-app: q, branch_id, account (yes|no); page, per_page.
- Sign-in
- App token or company API key
- Permission
app_devices.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/not-on-app" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/app-devices/remindersPOST app-devices/reminders: channel (email|whatsapp), employee_ids[] or all=true (with fil...POST app-devices/reminders: channel (email|whatsapp), employee_ids[] or all=true (with filters {q, branch_id, account}).
- Sign-in
- App token or company API key
- Permission
app_devices.remind- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
channelrequiredrequired|in:email,whatsappallsometimes|booleanemployee_idsrequired_without:all|array|max:500employee_ids.*integerfilterssometimes|arrayqnullable|string|'max:' . \App\Support\Limits::chars(100)branch_idnullable|integeraccountnullable|in:yes,noExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-devices/reminders" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"channel":"email","all":true,"employee_ids":[],"filters":[],"q":"...","branch_id":1,"account":"yes"}'
app-policy 2 endpoints
-
GET
/api/v1/app/companies/{company}/app-policyEvery mobile app rule for the signed-in employee: {live_location, app_lock, punch_auth} (d...Every mobile app rule for the signed-in employee: {live_location, app_lock, punch_auth} (docs/live-location.md).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-policy" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/app-policy/screen-captures/{kind}The app saw a screenshot (iOS can't stop one, only black it out) or a screen recording sta...The app saw a screenshot (iOS can't stop one, only black it out) or a screen recording start while it blocks them. Nothing is stored here: the activity log keeps the request (route app-policy.screen-captures, the kind in the path).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · screenshot|recording The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/app-policy/screen-captures/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
approval-chains 1 endpoint
-
PUT
/api/v1/app/companies/{company}/approval-chainschain_<kind> per kind: a CHAINS value, "tpl:<id>", or "none" (salary batches).chain_<kind> per kind: a CHAINS value, "tpl:<id>", or "none" (salary batches).
- Sign-in
- App token or company API key
- Permission
approval_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approval-chains" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
approval-setup 2 endpoints
-
GET
/api/v1/app/companies/{company}/approval-setupApproval chains of each request kind ('' = the kind's default), and the approval templates...Approval chains of each request kind ('' = the kind's default), and the approval templates.
- Sign-in
- App token or company API key
- Permission
approval_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approval-setup" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/approval-setup/approversGET approval-setup/approvers: who "Approved By" can name for a template (template_id) or a...GET approval-setup/approvers: who "Approved By" can name for a template (template_id) or a new one, from its own branch only.
- Sign-in
- App token or company API key
- Permission
approval_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approval-setup/approvers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
approval-templates 3 endpoints
-
POST
/api/v1/app/companies/{company}/approval-templates- Sign-in
- App token or company API key
- Permission
approval_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)object_typenullable|in:leave,transaction,overtime,general,air_ticket,payroll_batch,in_advance_salary,loan,salary_adjustment,missing_punch,business_trip,suspension,expense,vacation_resumption,vacation_encashment,hr_letter,timesheetobject_idnullable|integerassignnullable|arrayassign.*nullable|arraystepsrequiredrequired|array|min:1|max:8steps.*.kindrequiredrequired|stringsteps.*.membersnullable|arrayskip_afternullable|integer|min:0|max:720skip_after_unitnullable|in:days,hoursnotify_user_idsnullable|arrayoverrider_idsnullable|arrayExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approval-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"object_type":"leave","object_id":1,"assign":[],"steps":[],"skip_after":1,"skip_after_unit":"days","notify_user_ids":[],"overrider_ids":[]}' -
PATCH PUT
/api/v1/app/companies/{company}/approval-templates/{template}- Sign-in
- App token or company API key
- Permission
approval_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approval-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/approval-templates/{template}- Sign-in
- App token or company API key
- Permission
approval_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approval-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
approvals 6 endpoints
-
GET
/api/v1/app/companies/{company}/approvalsThe approvals page: tab (approvals, my, team, override), status, type. Leave requests and...The approvals page: tab (approvals, my, team, override), status, type. Leave requests and employee requests together.
- Sign-in
- App token or company API key
- Permission
self.approvals.decide | requests.view | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
tabnullable|'in:' . implode(',', $tabs)statusnullable|in:all,pending,approved,rejected,withdrawn,cancelledtypenullable|stringmy_actionnullable|in:waiting,pending,approved,rejected,withdrawn,approved_non_deduct,added_by_hr,delegated,skipped,cancelled,cancel_requested,nonefnullable|arrayaction_typenullable|in:approval,cancellationemployeenullable|integersortnullable|in:employee,serial,requested,received,my_actiondirnullable|in:asc,descExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approvals?tab=...&status=all&type=...&my_action=waiting" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/approvals/overrideOverride approvals: decide a request waiting on someone else. item is "leave:ID" or "reque...Override approvals: decide a request waiting on someone else. item is "leave:ID" or "request:ID".
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
itemrequiredrequired|string|regex:/^(leave|request):\d+$/decisionrequiredrequired|in:approved,rejecteddecision_notenullable|string|max:500Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approvals/override" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"item":"...","decision":"approved","decision_note":"..."}' -
POST
/api/v1/app/companies/{company}/approvals/bulkApprove or reject several items; the ones that can't be decided are skipped.Approve or reject several items; the ones that can't be decided are skipped.
- Sign-in
- App token or company API key
- Permission
self.approvals.decide | requests.view | requests.manage- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
itemsrequiredrequired|array|min:1|max:200items.*string|regex:/^(leave|request):\d+$/decisionrequiredrequired|in:approved,rejecteddecision_notenullable|string|max:500Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approvals/bulk" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"items":[],"decision":"approved","decision_note":"..."}' -
GET
/api/v1/app/companies/{company}/approvals/delegationsApproval delegations I gave or received (ZenHR's "Delegated").Approval delegations I gave or received (ZenHR's "Delegated").
- Sign-in
- App token or company API key
- Permission
self.approvals.delegate | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approvals/delegations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/approvals/delegationsDelegate my approvals: delegate_id (a user of the company), starts_on, ends_on (empty = un...Delegate my approvals: delegate_id (a user of the company), starts_on, ends_on (empty = until ended), note.
- Sign-in
- App token or company API key
- Permission
self.approvals.delegate | requests.manage- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
delegate_idrequiredrequired|integer|Rule::notIn([$user->id])|exists:company_user,user_idstarts_onrequiredrequired|dateends_onnullable|date|after_or_equal:starts_onnotenullable|string|'max:' . \App\Support\Limits::chars(300)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approvals/delegations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"delegate_id":1,"starts_on":"2026-11-01","ends_on":"2026-11-01","note":"..."}' -
DELETE
/api/v1/app/companies/{company}/approvals/delegations/{delegation}- Sign-in
- App token or company API key
- Permission
self.approvals.delegate | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.delegationinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/approvals/delegations/{delegation}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
assessments 28 endpoints
-
GET
/api/v1/app/companies/{company}/assessments/summary- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/summary" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/gradingAttempts waiting for a person, with the answers to grade.Attempts waiting for a person, with the answers to grade.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/grading" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/attempts/{attempt}An attempt with every answer, the right ones and the anti-cheating log.An attempt with every answer, the right ones and the anti-cheating log.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.attemptinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/attempts/{attempt}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/answers/{answer}/gradepoints (0 to the question's points), note; reason when changing a grade already given (an...points (0 to the question's points), note; reason when changing a grade already given (an automatic one too).
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.answerinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
pointsrequiredrequired|numeric|min:0|'max:' . $maxnotenullable|string|'max:' . \App\Support\Limits::chars(2000)reasonRule::requiredIf($changing)|nullable|string|min:3|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/answers/{answer}/grade" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"points":1.5,"note":"...","reason":"..."}' -
GET
/api/v1/app/companies/{company}/assessments/answers/{answer}/media- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.answerinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/answers/{answer}/media" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/tests/{test}/resultsEvery attempt with its score and checks, and how each question did.Every attempt with its score and checks, and how each question did.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.testinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests/{test}/results" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/tests/{test}/export- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.testinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests/{test}/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/invitationsFilters: test, status, candidate, employee.Filters: test, status, candidate, employee.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.grade- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/invitations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/templates- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/templates/{key}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.keystring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/templates/{key}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/categories- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/categories" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/categoriesname {en, ar}, description {en, ar}, competency_id.name {en, ar}, description {en, ar}, competency_id.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)descriptionnullable|arraydescription.ennullable|string|'max:' . \App\Support\Limits::chars(1000)description.arnullable|string|'max:' . \App\Support\Limits::chars(1000)competency_idnullable|integer|exists:competencies,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/categories" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":{"en":"...","ar":"..."},"competency_id":1}' -
PATCH PUT
/api/v1/app/companies/{company}/assessments/categories/{category}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.categoryinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/categories/{category}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/assessments/categories/{category}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.categoryinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/categories/{category}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/questionsFilters: category, type, difficulty, active, q.Filters: category, type, difficulty, active, q.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/questions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/questions/{question}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.questioninteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/questions/{question}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/questions/{question}/media- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.questioninteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/questions/{question}/media" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/questionstype, assessment_category_id, difficulty, prompt {en, ar}, options [{key?, text {en, ar}}]...type, assessment_category_id, difficulty, prompt {en, ar}, options [{key?, text {en, ar}}], targets, answer, points, time_limit_seconds, explanation, is_active.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
typerequiredrequired|in:single,multiple,true_false,short_text,long_text,ordering,matching,numeric,file_uploadassessment_category_idnullable|integer|exists:assessment_categories,iddifficultyrequiredrequired|in:easy,medium,hardpromptrequiredrequired|arrayprompt.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(5000)prompt.arnullable|string|'max:' . \App\Support\Limits::chars(5000)explanationnullable|arrayexplanation.ennullable|string|'max:' . \App\Support\Limits::chars(2000)explanation.arnullable|string|'max:' . \App\Support\Limits::chars(2000)pointsrequiredrequired|numeric|min:0.25|max:100time_limit_secondsnullable|integer|between:10,3600is_activesometimes|booleanoptionsRule::requiredIf(in_array($type, ['single', 'multiple', 'ordering', 'matching'],...|nullable|array|max:12options.*.keynullable|string|max:20options.*.textrequiredrequired|arrayoptions.*.text.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(500)options.*.text.arnullable|string|'max:' . \App\Support\Limits::chars(500)targetsRule::requiredIf($type === 'matching')|nullable|array|max:12targets.*.keynullable|string|max:20targets.*.textrequiredrequired|arraytargets.*.text.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(500)targets.*.text.arnullable|string|'max:' . \App\Support\Limits::chars(500)answernullablecorrectnullableremove_medianullable|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/questions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"type":"single","assessment_category_id":1,"difficulty":"easy","prompt":{"en":"...","ar":"..."},"explanation":{"en":"...","ar":"..."},"points":1.5,"time_limit_seconds":1,"is_active":true,"options":[],"targets":[],"answer":"...","correct":"...","remove_media":true}' -
PATCH PUT
/api/v1/app/companies/{company}/assessments/questions/{question}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.questioninteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/questions/{question}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/assessments/questions/{question}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.questions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.questioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/questions/{question}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/testsFilters: status, purpose, q.Filters: status, purpose, q.
- Sign-in
- App token or company API key
- Permission
assessments.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/assessments/tests/{test}A test with its items.A test with its items.
- Sign-in
- App token or company API key
- Permission
assessments.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.testinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests/{test}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/teststitle, description, instructions ({en, ar}), purpose, time_limit_minutes, shuffle_question...title, description, instructions ({en, ar}), purpose, time_limit_minutes, shuffle_questions, shuffle_options, attempts_allowed, pass_mark, negative_marking, negative_ratio, show_score, competency_id, pass_stage, fail_stage, status, items.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.tests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)title.arnullable|string|'max:' . \App\Support\Limits::chars(150)descriptionnullable|arraydescription.ennullable|string|'max:' . \App\Support\Limits::chars(2000)description.arnullable|string|'max:' . \App\Support\Limits::chars(2000)instructionsnullable|arrayinstructions.ennullable|string|'max:' . \App\Support\Limits::chars(3000)instructions.arnullable|string|'max:' . \App\Support\Limits::chars(3000)purposerequiredrequired|in:pre_employment,post_employmenttime_limit_minutesnullable|integer|between:1,480shuffle_questionsbooleanshuffle_optionsbooleannegative_markingbooleanshow_scorebooleanattempts_allowedrequiredrequired|integer|between:1,10pass_markrequiredrequired|numeric|between:0,100negative_rationullable|numeric|between:0,1competency_idnullable|integer|exists:competencies,idpass_stagenullable|Rule::in($stages)fail_stagenullable|Rule::in($stages)statusrequiredrequired|in:draft,active,archiveditemsnullable|array|max:200items.*.kindrequiredrequired|in:question,randomitems.*.assessment_question_idrequired_if:items.*.kind,question|nullable|integer|exists:assessment_questions,iditems.*.assessment_category_idrequired_if:items.*.kind,random|nullable|integer|exists:assessment_categories,iditems.*.difficultynullable|in:easy,medium,harditems.*.draw_countrequired_if:items.*.kind,random|nullable|integer|between:1,100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"description":{"en":"...","ar":"..."},"instructions":{"en":"...","ar":"..."},"purpose":"pre_employment","time_limit_minutes":1,"shuffle_questions":true,"shuffle_options":true,"negative_marking":true,"show_score":true,"attempts_allowed":1,"pass_mark":1.5,"negative_ratio":1.5,"competency_id":1,"pass_stage":"...","fail_stage":"...","status":"draft","items":[]}' -
PATCH PUT
/api/v1/app/companies/{company}/assessments/tests/{test}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.tests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.testinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests/{test}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/assessments/tests/{test}- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.tests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.testinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests/{test}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/tests/{test}/invitationscandidate_ids, employee_ids, expires_at, locale. The candidates' links are in the answer.candidate_ids, employee_ids, expires_at, locale. The candidates' links are in the answer.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.invite- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.testinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
candidate_idsnullable|array|max:200candidate_ids.*integer|exists:candidates,idemployee_idsnullable|array|max:500employee_ids.*integer|exists:employees,idexpires_atnullable|date|after:nowlocalenullable|in:en,arpass_stagenullable|Rule::in(array_diff(\App\Models\Candidate::STAGES, ['hired']))fail_stagenullable|Rule::in(array_diff(\App\Models\Candidate::STAGES, ['hired']))Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/tests/{test}/invitations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"candidate_ids":[],"employee_ids":[],"expires_at":"2026-11-01","locale":"en","pass_stage":"...","fail_stage":"..."}' -
POST
/api/v1/app/companies/{company}/assessments/invitations/{invitation}/cancel- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.invite- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.invitationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/invitations/{invitation}/cancel" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assessments/invitations/{invitation}/resendexpires_at (optional; required when the link has expired). sent and reason (sandbox, mail_...expires_at (optional; required when the link has expired). sent and reason (sandbox, mail_off, employees_held, no_email, failed) say what happened.
- Sign-in
- App token or company API key
- Permission
assessments.manage.* | assessments.invite- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.invitationinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
expires_atnullable|date|after:nowExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assessments/invitations/{invitation}/resend" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"expires_at":"2026-11-01"}'
asset-types 4 endpoints
-
GET
/api/v1/app/companies/{company}/asset-types- Sign-in
- App token or company API key
- Permission
assets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/asset-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/asset-typesname {en, ar}, branch_ids (ids, or ["all"]), active.name {en, ar}, branch_ids (ids, or ["all"]), active.
- Sign-in
- App token or company API key
- Permission
assets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)branch_idsrequiredrequired|array|min:1branch_ids.*stringExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/asset-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"branch_ids":[]}' -
PATCH PUT
/api/v1/app/companies/{company}/asset-types/{assetType}- Sign-in
- App token or company API key
- Permission
assets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetTypeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)branch_idsrequiredrequired|array|min:1branch_ids.*stringExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/asset-types/{assetType}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"branch_ids":[]}' -
DELETE
/api/v1/app/companies/{company}/asset-types/{assetType}- Sign-in
- App token or company API key
- Permission
assets.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetTypeinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/asset-types/{assetType}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
assets 8 endpoints
-
GET
/api/v1/app/companies/{company}/assetsThe list: status, type, owner (branch id or none), holder, expiry_from, expiry_to, q.The list: status, type, owner (branch id or none), holder, expiry_from, expiry_to, q.
- Sign-in
- App token or company API key
- Permission
assets.manage | assets.create | assets.edit | assets.delete | assets.assign | assets.status- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assets- Sign-in
- App token or company API key
- Permission
assets.create- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
asset_type_idrequiredrequired|integer|exists:asset_types,idnamerequiredrequired|string|max:150serial_numberrequiredrequired|string|max:100|unique:assets,serial_numberowner_branch_idnullable|integer|exists:branches,idpurchase_datenullable|date|before_or_equal:todayvaluenullable|numeric|min:0notesnullable|string|'max:' . \App\Support\Limits::chars(1000)descriptionnullable|string|'max:' . \App\Support\Limits::chars(1000)ownernullable|string|max:150production_datenullable|dateexpiry_datenullable|date|after_or_equal:production_dateattachmentsnullable|array|max:10attachments.*file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"asset_type_id":1,"name":"...","serial_number":"...","owner_branch_id":1,"purchase_date":"2026-11-01","value":1.5,"notes":"...","description":"...","owner":"...","production_date":"2026-11-01","expiry_date":"2026-11-01","attachments":[]}' -
GET
/api/v1/app/companies/{company}/assets/{asset}An asset and its history.An asset and its history.
- Sign-in
- App token or company API key
- Permission
assets.manage | assets.create | assets.edit | assets.delete | assets.assign | assets.status- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets/{asset}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/assets/{asset}- Sign-in
- App token or company API key
- Permission
assets.edit- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
asset_type_idrequiredrequired|integer|exists:asset_types,idnamerequiredrequired|string|max:150serial_numberrequiredrequired|string|max:100|unique:assets,serial_numberowner_branch_idnullable|integer|exists:branches,idpurchase_datenullable|date|before_or_equal:todayvaluenullable|numeric|min:0notesnullable|string|'max:' . \App\Support\Limits::chars(1000)descriptionnullable|string|'max:' . \App\Support\Limits::chars(1000)ownernullable|string|max:150production_datenullable|dateexpiry_datenullable|date|after_or_equal:production_dateattachmentsnullable|array|max:10attachments.*file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|max:10240Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets/{asset}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"asset_type_id":1,"name":"...","serial_number":"...","owner_branch_id":1,"purchase_date":"2026-11-01","value":1.5,"notes":"...","description":"...","owner":"...","production_date":"2026-11-01","expiry_date":"2026-11-01","attachments":[]}' -
DELETE
/api/v1/app/companies/{company}/assets/{asset}- Sign-in
- App token or company API key
- Permission
assets.delete- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets/{asset}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assets/{asset}/assignHand it to an employee in scope: assigned_to, assigned_at, return_date, notes, attachments...Hand it to an employee in scope: assigned_to, assigned_at, return_date, notes, attachments[].
- Sign-in
- App token or company API key
- Permission
assets.assign- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
assigned_torequiredrequired|integerassigned_atnullable|datereturn_datenullable|date|after_or_equal:assigned_atnotesnullable|string|max:10240attachmentsnullable|array|max:10attachments.*file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets/{asset}/assign" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"assigned_to":1,"assigned_at":"2026-11-01","return_date":"2026-11-01","notes":"...","attachments":[]}' -
POST
/api/v1/app/companies/{company}/assets/{asset}/releaseTake it back: it becomes available.Take it back: it becomes available.
- Sign-in
- App token or company API key
- Permission
assets.assign- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets/{asset}/release" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/assets/{asset}/statusstatus: damaged, under_repair, archived or available.status: damaged, under_repair, archived or available.
- Sign-in
- App token or company API key
- Permission
assets.status- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assetinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/assets/{asset}/status" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
attendance 19 endpoints
-
POST
/api/v1/app/companies/{company}/attendance/clock-in- Sign-in
- App token or company API key
- Permission
self.clock- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
attendance_function_idnullable|integer|exists:attendance_functions,idphotorequiredrequired|image|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/clock-in" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "attendance_function_id=1" \ -F "[email protected]" -
POST
/api/v1/app/companies/{company}/attendance/clock-out- Sign-in
- App token or company API key
- Permission
self.clock- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
photorequiredrequired|image|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/clock-out" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" -
POST
/api/v1/app/companies/{company}/attendance/scanScanning a work location's QR code (the mobile app reads the code's link /clock/qr/{token}...Scanning a work location's QR code (the mobile app reads the code's link /clock/qr/{token}?t=&s=): clocks out if a shift is open, otherwise in, with the same checks as the link. token, t and s from the code.
- Sign-in
- App token or company API key
- Permission
self.clock- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
tokenrequiredrequired|string|max:100tnullable|integersnullable|string|max:64attendance_function_idnullable|integer|exists:attendance_functions,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/scan" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"token":"...","t":1,"s":"...","attendance_function_id":1}' -
GET
/api/v1/app/companies/{company}/attendance/punch-logThe punch log: employee, branch, from, to, channel, device, ip, flagged, status, review; f...The punch log: employee, branch, from, to, channel, device, ip, flagged, status, review; format=csv|xlsx for the branded export.
- Sign-in
- App token or company API key
- Permission
attendance.security.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
fromnullable|date_format:Y-m-dtonullable|date_format:Y-m-demployeenullable|integerbranchnullable|integerformatnullable|in:json,csv,xlsxExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/punch-log?from=2026-11-01&to=2026-11-01&employee=1&branch=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/punch-log/{context}- Sign-in
- App token or company API key
- Permission
attendance.security.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.contextinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/punch-log/{context}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/attendance/punch-log/{context}/decidedecision: approve or reject; note; approve_device to approve its pending device too.decision: approve or reject; note; approve_device to approve its pending device too.
- Sign-in
- App token or company API key
- Permission
attendance.security.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.contextinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
decisionrequiredrequired|in:approve,rejectnotenullable|string|'max:' . \App\Support\Limits::chars(500)approve_devicenullable|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/punch-log/{context}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"decision":"approve","note":"...","approve_device":true}' -
GET
/api/v1/app/companies/{company}/attendance/teamThe team's month: totals per employee in reach (attendance.view).The team's month: totals per employee in reach (attendance.view).
- Sign-in
- App token or company API key
- Permission
attendance.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/team" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/todayOne day of the team (docs/mobile-hrm.md): date (today by default).One day of the team (docs/mobile-hrm.md): date (today by default).
- Sign-in
- App token or company API key
- Permission
attendance.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
datenullable|date_format:Y-m-dExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/today?date=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/recordsAttendance records: from, to, employee, shift (work shift id), state (incomplete, complete...Attendance records: from, to, employee, shift (work shift id), state (incomplete, complete, trusted).
- Sign-in
- App token or company API key
- Permission
attendance.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
fromnullable|datetonullable|dateemployeenullable|integershiftnullable|integerstatenullable|in:incomplete,complete,trustedExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/records?from=2026-11-01&to=2026-11-01&employee=1&shift=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/attendance/recordsAdd a record, or with "replace": true correct the day (its records are replaced).Add a record, or with "replace": true correct the day (its records are replaced).
- Sign-in
- App token or company API key
- Permission
attendance.records.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerwork_daterequiredrequired|date|before_or_equal:todayclock_inrequiredrequired|date_format:H:iclock_outnullable|date_format:H:i|after:clock_inExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/records" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"work_date":"2026-11-01","clock_in":"2026-11-01","clock_out":"2026-11-01"}' -
POST
/api/v1/app/companies/{company}/attendance/records/{record}/trust- Sign-in
- App token or company API key
- Permission
attendance.records.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.recordinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/records/{record}/trust" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/sheetsZenHR's Attendance Sheets: sheets imported from machines. Filters: machine (device id), st...ZenHR's Attendance Sheets: sheets imported from machines. Filters: machine (device id), status, from, to (import date).
- Sign-in
- App token or company API key
- Permission
attendance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
machinenullable|integerstatusnullable|in:completed,with_errors,failedfromnullable|date_format:Y-m-dtonullable|date_format:Y-m-dExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/sheets?machine=1&status=completed&from=2026-11-01&to=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/sheets/template/{device}A machine's blank attendance sheet in its template (rows of cells; the first is the headin...A machine's blank attendance sheet in its template (rows of cells; the first is the headings).
- Sign-in
- App token or company API key
- Permission
attendance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/sheets/template/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/day-analysisZenHR history (docs/zenhr-import.md): kind days (day analysis) or punches (punch details)...ZenHR history (docs/zenhr-import.md): kind days (day analysis) or punches (punch details) for attendance.view, balances (vacation balances by year) for leaves.manage. Filters: employee, from, to, status (days), type, year (balances).
- Sign-in
- App token or company API key
- Permission
attendance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeenullable|integerfromnullable|date_format:Y-m-dtonullable|date_format:Y-m-dstatusnullable|in:present,absent,partialtypenullable|integeryearnullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/day-analysis?employee=1&from=2026-11-01&to=2026-11-01&status=present" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/punchesZenHR history (docs/zenhr-import.md): kind days (day analysis) or punches (punch details)...ZenHR history (docs/zenhr-import.md): kind days (day analysis) or punches (punch details) for attendance.view, balances (vacation balances by year) for leaves.manage. Filters: employee, from, to, status (days), type, year (balances).
- Sign-in
- App token or company API key
- Permission
attendance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeenullable|integerfromnullable|date_format:Y-m-dtonullable|date_format:Y-m-dstatusnullable|in:present,absent,partialtypenullable|integeryearnullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/punches?employee=1&from=2026-11-01&to=2026-11-01&status=present" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/recommendationsRecommendations of the employees in reach: status (pending, applied, ignored), kind, from,...Recommendations of the employees in reach: status (pending, applied, ignored), kind, from, to.
- Sign-in
- App token or company API key
- Permission
attendance.recommendations.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusnullable|in:pending,applied,ignoredkindnullable|in:absence,lateness,early_out,incomplete,overtime,leavefromnullable|datetonullable|dateExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/recommendations?status=pending&kind=absence&from=2026-11-01&to=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/attendance/recommendations/refresh- Sign-in
- App token or company API key
- Permission
attendance.recommendations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/recommendations/refresh" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/attendance/recommendations/actApply, ignore or tell the manager: ids and action.Apply, ignore or tell the manager: ids and action.
- Sign-in
- App token or company API key
- Permission
attendance.recommendations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/recommendations/act" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/attendance/missing-punchesZenHR Manage missing punches: status, punch dates from / to, employee; 50 a page.ZenHR Manage missing punches: status, punch dates from / to, employee; 50 a page.
- Sign-in
- App token or company API key
- Permission
attendance.missing_punches.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusnullable|in:pending,approved,rejected,cancelled,withdrawnfromnullable|date_format:Y-m-dtonullable|date_format:Y-m-demployeenullable|integeremployee_statusnullable|in:active,suspended,terminatedExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/attendance/missing-punches?status=pending&from=2026-11-01&to=2026-11-01&employee=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
attest 2 endpoints
-
POST
/api/v1/app/attest/challengeApp Attest: a one-time challenge for the next attestation (five minutes).App Attest: a one-time challenge for the next attestation (five minutes).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 20 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/attest/challenge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/attest/registerApp Attest: key_id, attestation (base64), challenge, device_id (the device.id sent with pu...App Attest: key_id, attestation (base64), challenge, device_id (the device.id sent with punches).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
key_idrequiredrequired|string|max:100attestationrequiredrequired|string|max:20000challengerequiredrequired|string|max:100device_idrequiredrequired|string|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/attest/register" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"key_id":"...","attestation":"...","challenge":"...","device_id":"..."}'
biometric-devices 9 endpoints
-
GET
/api/v1/app/companies/{company}/biometric-devices- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/biometric-devices/detectedClocks calling in from the caller's own public IP that no company has added yet (docs/devi...Clocks calling in from the caller's own public IP that no company has added yet (docs/devices.md).
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/detected" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/biometric-devices- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/biometric-devices/{device}Send only what changes.Send only what changes.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/biometric-devices/{device}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/biometric-devices/{device}/tokenA new secret for the punches endpoint, shown this once.A new secret for the punches endpoint, shown this once.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/{device}/token" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/biometric-devices/{device}/usersGET biometric-devices/{id}/users: the machine's users and the numbers it sent, each with t...GET biometric-devices/{id}/users: the machine's users and the numbers it sent, each with the employee it links to.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/{device}/users" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/biometric-devices/{device}/sheetPOST biometric-devices/{id}/sheet (multipart sheet): reads an attendance sheet exported fr...POST biometric-devices/{id}/sheet (multipart sheet): reads an attendance sheet exported from the machine.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
sheetrequiredrequired|file|mimes:csv,txt,xlsx|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/{device}/sheet" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" -
POST
/api/v1/app/companies/{company}/biometric-devices/reprocessMatches punches whose number now belongs to an employee.Matches punches whose number now belongs to an employee.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-devices/reprocess" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
biometric-templates 3 endpoints
-
POST
/api/v1/app/companies/{company}/biometric-templates/{template}/resolveversion_id: keep that version everywhere; or re_enroll_device_id: ask that device to enrol...version_id: keep that version everywhere; or re_enroll_device_id: ask that device to enrol the slot again.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
version_idnullable|integer|required_without:re_enroll_device_idre_enroll_device_idnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-templates/{template}/resolve" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"version_id":1,"re_enroll_device_id":1}' -
POST
/api/v1/app/companies/{company}/biometric-templates/{template}/publish- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-templates/{template}/publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/biometric-templates/{template}/removeRemove a slot from one device (device_id) or from the master set; needs confirm: true.Remove a slot from one device (device_id) or from the master set; needs confirm: true.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
confirmaccepteddevice_idnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/biometric-templates/{template}/remove" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"confirm":true,"device_id":1}'
boarding-templates 6 endpoints
-
GET
/api/v1/app/companies/{company}/boarding-templates- Sign-in
- App token or company API key
- Permission
employee_settings.boarding_templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boarding-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/boarding-templates- Sign-in
- App token or company API key
- Permission
employee_settings.boarding_templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
categoryrequiredrequired|in:onboarding,offboarding,clearance,resumptionnamerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arnullable|string|'max:' . \App\Support\Limits::chars(150)descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)when_to_sendnullable|in:on_date,beforedays_to_sendmatch ($category) { 'onboarding' => 'required_if:when_to_send,before', '...|nullable|integer|min:0|max:365arrive_bynullable|date_format:H:ilocation_namenullable|string|max:150contact_employee_idnullable|integer|$employeessequentialnullable|booleanmin_vacation_daysin_array($category, ['clearance', 'resumption'], true) ? 'required' : 'nullable'|nullable|integer|min:1|max:365leave_type_idnullable|integer|exists:leave_types,idresumption_trigger$category === 'resumption' ? 'required' : 'nullable'|nullable|in:first_punch,employee_request,auto_sendauto_adjustnullable|booleannotify_after_daysnullable|integer|min:0|max:365notify_user_idsnullable|array|max:50notify_user_ids.*integer|$employeesfiltersnullable|arrayfilters.*nullable|arrayfilters.*.*nullable|string|max:80tasksrequiredrequired|array|min:1|max:50tasks.*.kindrequiredrequired|Rule::in($kinds)tasks.*.titlenullable|required_if:tasks.*.kind,custom|string|max:200tasks.*.document_type_idnullable|required_if:tasks.*.kind,document_upload|integer|exists:document_types,idtasks.*.document_idnullable|required_if:tasks.*.kind,document_download|integer|exists:employee_documents,idtasks.*.asset_type_idnullable|required_if:tasks.*.kind,give_asset,take_asset|integer|exists:asset_types,idtasks.*.assigneenullable|in:employee,persontasks.*.assignee_employee_idnullable|required_if:tasks.*.kind,give_asset,take_asset|required_if:tasks.*.assignee,person|integer|$employeestasks.*.due_daysnullable|integer|min:0|max:365tasks.*.notesnullable|string|'max:' . \App\Support\Limits::chars(2000)tasks.*.notes_requirednullable|booleantasks.*.attachments_requirednullable|booleantasks.*.profile_fieldsnullable|required_if:tasks.*.kind,complete_profile|array|min:1tasks.*.profile_fields.*in:email,gender,mobile,religion,birth_date,national_id,nationality,marital_status,emergency_contactsExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boarding-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"category":"onboarding","name":{"en":"...","ar":"..."},"description":"...","when_to_send":"on_date","days_to_send":1,"arrive_by":"2026-11-01","location_name":"...","contact_employee_id":1,"sequential":true,"min_vacation_days":1,"leave_type_id":1,"resumption_trigger":"first_punch","auto_adjust":true,"notify_after_days":1,"notify_user_ids":[],"filters":[],"tasks":[]}' -
GET
/api/v1/app/companies/{company}/boarding-templates/{template}- Sign-in
- App token or company API key
- Permission
employee_settings.boarding_templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boarding-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/boarding-templates/{template}- Sign-in
- App token or company API key
- Permission
employee_settings.boarding_templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
categoryrequiredrequired|in:onboarding,offboarding,clearance,resumptionnamerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arnullable|string|'max:' . \App\Support\Limits::chars(150)descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)when_to_sendnullable|in:on_date,beforedays_to_sendmatch ($category) { 'onboarding' => 'required_if:when_to_send,before', '...|nullable|integer|min:0|max:365arrive_bynullable|date_format:H:ilocation_namenullable|string|max:150contact_employee_idnullable|integer|$employeessequentialnullable|booleanmin_vacation_daysin_array($category, ['clearance', 'resumption'], true) ? 'required' : 'nullable'|nullable|integer|min:1|max:365leave_type_idnullable|integer|exists:leave_types,idresumption_trigger$category === 'resumption' ? 'required' : 'nullable'|nullable|in:first_punch,employee_request,auto_sendauto_adjustnullable|booleannotify_after_daysnullable|integer|min:0|max:365notify_user_idsnullable|array|max:50notify_user_ids.*integer|$employeesfiltersnullable|arrayfilters.*nullable|arrayfilters.*.*nullable|string|max:80tasksrequiredrequired|array|min:1|max:50tasks.*.kindrequiredrequired|Rule::in($kinds)tasks.*.titlenullable|required_if:tasks.*.kind,custom|string|max:200tasks.*.document_type_idnullable|required_if:tasks.*.kind,document_upload|integer|exists:document_types,idtasks.*.document_idnullable|required_if:tasks.*.kind,document_download|integer|exists:employee_documents,idtasks.*.asset_type_idnullable|required_if:tasks.*.kind,give_asset,take_asset|integer|exists:asset_types,idtasks.*.assigneenullable|in:employee,persontasks.*.assignee_employee_idnullable|required_if:tasks.*.kind,give_asset,take_asset|required_if:tasks.*.assignee,person|integer|$employeestasks.*.due_daysnullable|integer|min:0|max:365tasks.*.notesnullable|string|'max:' . \App\Support\Limits::chars(2000)tasks.*.notes_requirednullable|booleantasks.*.attachments_requirednullable|booleantasks.*.profile_fieldsnullable|required_if:tasks.*.kind,complete_profile|array|min:1tasks.*.profile_fields.*in:email,gender,mobile,religion,birth_date,national_id,nationality,marital_status,emergency_contactsExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boarding-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"category":"onboarding","name":{"en":"...","ar":"..."},"description":"...","when_to_send":"on_date","days_to_send":1,"arrive_by":"2026-11-01","location_name":"...","contact_employee_id":1,"sequential":true,"min_vacation_days":1,"leave_type_id":1,"resumption_trigger":"first_punch","auto_adjust":true,"notify_after_days":1,"notify_user_ids":[],"filters":[],"tasks":[]}' -
POST
/api/v1/app/companies/{company}/boarding-templates/{template}/copy- Sign-in
- App token or company API key
- Permission
employee_settings.boarding_templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boarding-templates/{template}/copy" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/boarding-templates/{template}- Sign-in
- App token or company API key
- Permission
employee_settings.boarding_templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boarding-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
boardings 5 endpoints
-
GET
/api/v1/app/companies/{company}/boardings/{workflow}/pdfThe workflow as a PDF file (application/pdf); lang en|ar, else the reader's language.The workflow as a PDF file (application/pdf); lang en|ar, else the reader's language.
- Sign-in
- App token or company API key
- Permission
self.workflows | employees.view- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.workflowinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boardings/{workflow}/pdf" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/boardings- Sign-in
- App token or company API key
- Permission
employees.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boardings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/boardings/{workflow}- Sign-in
- App token or company API key
- Permission
employees.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.workflowinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boardings/{workflow}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/boardings/mass-onboard- Sign-in
- App token or company API key
- Permission
employees.boardings.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
boarding_template_idrequiredrequired|integer|exists:boarding_templates,iddescriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)notesnullable|string|'max:' . \App\Support\Limits::chars(2000)employee_idsrequiredrequired|array|min:1|max:500employee_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boardings/mass-onboard" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"boarding_template_id":1,"description":"...","notes":"...","employee_ids":[]}' -
DELETE
/api/v1/app/companies/{company}/boardings/{workflow}- Sign-in
- App token or company API key
- Permission
employees.boardings.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.workflowinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/boardings/{workflow}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
branch 2 endpoints
-
GET
/api/v1/app/companies/{company}/branch- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/branch- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
branchrequiredrequired|regex:/^(\d+|all)$/Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"branch":"..."}'
branches 5 endpoints
-
PUT PATCH
/api/v1/app/companies/{company}/branches/{branch}/regional-settings- Sign-in
- App token or company API key
- Permission
branches.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branches/{branch}/regional-settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/branches- Sign-in
- App token or company API key
- Permission
branches.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branches" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/branches- Sign-in
- App token or company API key
- Permission
branches.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branches" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/branches/{branch}- Sign-in
- App token or company API key
- Permission
branches.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/branches/{branch}/main- Sign-in
- App token or company API key
- Permission
branches.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/branches/{branch}/main" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
buddy-punching 13 endpoints
-
GET
/api/v1/app/companies/{company}/buddy-punching/peopleThe people with a score, highest first; format=csv|xlsx with attendance.buddy.export.The people with a score, highest first; format=csv|xlsx with attendance.buddy.export.
- Sign-in
- App token or company API key
- Permission
attendance.buddy.view | attendance.buddy.export- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/people" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/buddy-punching/signals- Sign-in
- App token or company API key
- Permission
attendance.buddy.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/signals" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/buddy-punching/signals/{signal}- Sign-in
- App token or company API key
- Permission
attendance.buddy.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.signalinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
decisionrequiredrequired|in:confirm,dismissnotenullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/signals/{signal}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"decision":"confirm","note":"..."}' -
GET
/api/v1/app/companies/{company}/buddy-punching/presence- Sign-in
- App token or company API key
- Permission
attendance.buddy.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/presence" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/buddy-punching/presence/{check}- Sign-in
- App token or company API key
- Permission
attendance.buddy.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.checkinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
decisionrequiredrequired|in:excuse,confirmnotenullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/presence/{check}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"decision":"excuse","note":"..."}' -
GET
/api/v1/app/companies/{company}/buddy-punching/faces- Sign-in
- App token or company API key
- Permission
attendance.face.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/faces" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/buddy-punching/faces/missingWho hasn't taken the biometric photo yet.Who hasn't taken the biometric photo yet.
- Sign-in
- App token or company API key
- Permission
attendance.face.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/faces/missing" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/buddy-punching/faces/{template}/photoThe photo waiting for HR's approval, as a JPEG. Each look goes in the audit trail.The photo waiting for HR's approval, as a JPEG. Each look goes in the audit trail.
- Sign-in
- App token or company API key
- Permission
attendance.face.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/faces/{template}/photo" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/buddy-punching/consents- Sign-in
- App token or company API key
- Permission
attendance.face.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/consents" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/buddy-punching/faces/{template}/approve- Sign-in
- App token or company API key
- Permission
attendance.face.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/faces/{template}/approve" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/buddy-punching/faces/reset/{employee}- Sign-in
- App token or company API key
- Permission
attendance.face.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/faces/reset/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/buddy-punching/keys- Sign-in
- App token or company API key
- Permission
attendance.buddy.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/keys" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/buddy-punching/keys/{key}- Sign-in
- App token or company API key
- Permission
attendance.device_key.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.keyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|in:approve,resetExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/buddy-punching/keys/{key}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"approve"}'
business-travel 7 endpoints
-
GET
/api/v1/app/companies/{company}/business-travel/setup- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/setup" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/business-travel/setup- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
trip_per_diem_type_idrequiredrequired|$typetrip_paymentrequiredrequired|in:in_payroll,off_cycletrip_air_ticket_type_idrequiredrequired|$typetrip_accommodation_type_idrequiredrequired|$typetrip_remind_daysrequiredrequired|integer|min:0|max:60trip_expense_type_idsnullable|arraytrip_expense_type_ids.*integer|$typecomponentsnullable|arraycomponents.*.idnullable|integercomponents.*.name_ennullable|string|'max:' . \App\Support\Limits::chars(100)components.*.name_arnullable|string|'max:' . \App\Support\Limits::chars(100)Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/setup" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"trip_per_diem_type_id":"...","trip_payment":"in_payroll","trip_air_ticket_type_id":"...","trip_accommodation_type_id":"...","trip_remind_days":1,"trip_expense_type_ids":[],"components":[]}' -
GET
/api/v1/app/companies/{company}/business-travel/policies- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/business-travel/policies- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arnullable|string|'max:' . \App\Support\Limits::chars(150)position_idsrequiredrequired|array|min:1position_ids.*integer|exists:positions,iddestinationsrequiredrequired|array|min:1|max:30destinations.*.categoryrequiredrequired|in:domestic,internationaldestinations.*.countrynullable|string|max:80destinations.*.departure_citiesnullable|string|'max:' . \App\Support\Limits::chars(500)destinations.*.arrival_citiesnullable|string|'max:' . \App\Support\Limits::chars(500)destinations.*.departure_countriesnullabledestinations.*.arrival_countriesnullabledestinations.*.departure_countries.*string|'max:' . \App\Support\Limits::chars(80)destinations.*.arrival_countries.*string|'max:' . \App\Support\Limits::chars(80)destinations.*.travel_typesnullable|arraydestinations.*.travel_types.*in:airplane,bus,car,traindestinations.*.air_classesnullable|arraydestinations.*.air_classes.*in:economy,business,firstdestinations.*.max_air_ticketnullable|numeric|min:0destinations.*.max_travel_costnullable|numeric|min:0destinations.*.hotel_tiersnullable|arraydestinations.*.hotel_tiers.*integer|between:1,5destinations.*.max_accommodationnullable|numeric|min:0destinations.*.componentsnullable|arraydestinations.*.components.*.type_idnullable|integer|exists:per_diem_types,iddestinations.*.components.*.amountnullable|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","position_ids":[],"destinations":[]}' -
GET
/api/v1/app/companies/{company}/business-travel/policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/business-travel/policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arnullable|string|'max:' . \App\Support\Limits::chars(150)position_idsrequiredrequired|array|min:1position_ids.*integer|exists:positions,iddestinationsrequiredrequired|array|min:1|max:30destinations.*.categoryrequiredrequired|in:domestic,internationaldestinations.*.countrynullable|string|max:80destinations.*.departure_citiesnullable|string|'max:' . \App\Support\Limits::chars(500)destinations.*.arrival_citiesnullable|string|'max:' . \App\Support\Limits::chars(500)destinations.*.departure_countriesnullabledestinations.*.arrival_countriesnullabledestinations.*.departure_countries.*string|'max:' . \App\Support\Limits::chars(80)destinations.*.arrival_countries.*string|'max:' . \App\Support\Limits::chars(80)destinations.*.travel_typesnullable|arraydestinations.*.travel_types.*in:airplane,bus,car,traindestinations.*.air_classesnullable|arraydestinations.*.air_classes.*in:economy,business,firstdestinations.*.max_air_ticketnullable|numeric|min:0destinations.*.max_travel_costnullable|numeric|min:0destinations.*.hotel_tiersnullable|arraydestinations.*.hotel_tiers.*integer|between:1,5destinations.*.max_accommodationnullable|numeric|min:0destinations.*.componentsnullable|arraydestinations.*.components.*.type_idnullable|integer|exists:per_diem_types,iddestinations.*.components.*.amountnullable|numeric|min:0Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","position_ids":[],"destinations":[]}' -
DELETE
/api/v1/app/companies/{company}/business-travel/policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/business-travel/policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
cancellations 3 endpoints
-
GET
/api/v1/app/companies/{company}/cancellations- Sign-in
- App token or company API key
- Permission
self.requests.cancel | self.leaves.cancel | requests.manage | leaves.manage | self.approvals.decide- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cancellations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/cancellations/{kind}/{id}- Sign-in
- App token or company API key
- Permission
self.requests.cancel | self.leaves.cancel | requests.manage | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · requests|leaves The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cancellations/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/cancellations/{kind}/{id}/decide- Sign-in
- App token or company API key
- Permission
self.approvals.decide | requests.manage | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · requests|leaves The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cancellations/{kind}/{id}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
checklist-items 2 endpoints
-
POST
/api/v1/app/companies/{company}/checklist-items/{item}/toggle- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.iteminteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/checklist-items/{item}/toggle" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/checklist-items/{item}- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.iteminteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/checklist-items/{item}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
checklists 1 endpoint
-
GET
/api/v1/app/companies/{company}/checklists- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/checklists" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
clocking-devices 2 endpoints
-
GET
/api/v1/app/companies/{company}/clocking-devicesDevices: employee, kind (phone, browser), status, device.Devices: employee, kind (phone, browser), status, device.
- Sign-in
- App token or company API key
- Permission
attendance.security.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/clocking-devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/clocking-devices/{device}action: approve, block, reset, rename (label) or share (shared, browsers only).action: approve, block, reset, rename (label) or share (shared, browsers only).
- Sign-in
- App token or company API key
- Permission
attendance.security.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/clocking-devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
clocking-wifi-networks 3 endpoints
-
GET
/api/v1/app/companies/{company}/clocking-wifi-networks- Sign-in
- App token or company API key
- Permission
attendance.security.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/clocking-wifi-networks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/clocking-wifi-networks- Sign-in
- App token or company API key
- Permission
attendance.security.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/clocking-wifi-networks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/clocking-wifi-networks/{network}- Sign-in
- App token or company API key
- Permission
attendance.security.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.networkinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/clocking-wifi-networks/{network}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
companies 1 endpoint
-
GET
/api/v1/app/companies/{company}What the company gives this user: license, modules, branches.What the company gives this user: license, modules, branches.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
competency-ratings 2 endpoints
-
GET
/api/v1/app/companies/{company}/competency-ratingsRatings of the employees in scope (employee filter).Ratings of the employees in scope (employee filter).
- Sign-in
- App token or company API key
- Permission
performance.view | performance.manage.* | performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/competency-ratings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/competency-ratingsemployee_id, competency_id, level.employee_id, competency_id, level.
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integer|exists:employees,idcompetency_idrequiredrequired|integer|exists:competencies,idlevelrequiredrequired|integer|'between:1,' . \App\Models\CompetencyLevel::scale()Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/competency-ratings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"competency_id":1,"level":1}'
competency-setup 3 endpoints
-
POST
/api/v1/app/companies/{company}/competency-setup/{kind}kind categories | levels | competencies: as on the competencies screen.kind categories | levels | competencies: as on the competencies screen.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · categories|levels|competencies The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/competency-setup/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/competency-setup/{kind}/{id}kind categories | levels | competencies: as on the competencies screen.kind categories | levels | competencies: as on the competencies screen.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · categories|levels|competencies The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/competency-setup/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/competency-setup/{kind}/{id}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · categories|levels|competencies The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/competency-setup/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
connected-apps 2 endpoints
-
GET
/api/v1/app/companies/{company}/connected-apps- Sign-in
- App token or company API key
- Permission
integrations.ai_apps.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/connected-apps" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/connected-apps/{grant}- Sign-in
- App token or company API key
- Permission
integrations.ai_apps.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.grantinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/connected-apps/{grant}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
cost-allocations 3 endpoints
-
GET
/api/v1/app/companies/{company}/cost-allocationsAllocations in scope: employee_id, status (active | inactive | upcoming), group (cost cent...Allocations in scope: employee_id, status (active | inactive | upcoming), group (cost center group id), and the org filters.
- Sign-in
- App token or company API key
- Permission
payroll.cost_allocations.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-allocations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/cost-allocations- Sign-in
- App token or company API key
- Permission
payroll.cost_allocations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerstart_daterequiredrequired|dateend_datenullable|date|after_or_equal:start_daterowsrequiredrequired|arrayrows.*.cost_center_idrequiredrequired|distinct|exists:cost_centers,idrows.*.percentrequiredrequired|numeric|between:0.01,100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-allocations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"start_date":"2026-11-01","end_date":"2026-11-01","rows":[]}' -
DELETE
/api/v1/app/companies/{company}/cost-allocations/{allocation}- Sign-in
- App token or company API key
- Permission
payroll.cost_allocations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.allocationinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-allocations/{allocation}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
cost-center-groups 5 endpoints
-
GET
/api/v1/app/companies/{company}/cost-center-groupsGroups with the cost centers they include: code, center (a cost center id).Groups with the cost centers they include: code, center (a cost center id).
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-center-groups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/cost-center-groups- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arnullable|string|'max:' . \App\Support\Limits::chars(150)codenullable|string|max:30Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-center-groups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","code":"..."}' -
GET
/api/v1/app/companies/{company}/cost-center-groups/{group}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-center-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/cost-center-groups/{group}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arnullable|string|'max:' . \App\Support\Limits::chars(150)codenullable|string|max:30Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-center-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","code":"..."}' -
DELETE
/api/v1/app/companies/{company}/cost-center-groups/{group}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/cost-center-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
custom-reports 6 endpoints
-
GET
/api/v1/app/companies/{company}/custom-reports- Sign-in
- App token or company API key
- Permission
reports.custom- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/custom-reports" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/custom-reportsPOST custom-reports: name {en, ar}, locale, employee_status, schedule, notify_user_ids, co...POST custom-reports: name {en, ar}, locale, employee_status, schedule, notify_user_ids, columns ["source.field", …] in order, shared_branch_ids (branches you work in).
- Sign-in
- App token or company API key
- Permission
reports.custom- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arnullable|string|'max:' . \App\Support\Limits::chars(150)localerequiredrequired|in:en,aremployee_statusrequiredrequired|in:active,inactive,bothschedulerequiredrequired|in:none,daily,weekly,monthly,annuallynotify_user_idsnullable|arraynotify_user_ids.*integershared_branch_idsnullable|arrayshared_branch_ids.*integercolumnsrequiredrequired|array|min:1|max:120columns.*string|max:60ordernullable|arrayorder.*nullable|integer|min:1|max:999Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/custom-reports" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"locale":"en","employee_status":"active","schedule":"none","notify_user_ids":[],"shared_branch_ids":[],"columns":[],"order":[]}' -
GET
/api/v1/app/companies/{company}/custom-reports/{report}- Sign-in
- App token or company API key
- Permission
reports.custom- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/custom-reports/{report}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/custom-reports/{report}- Sign-in
- App token or company API key
- Permission
reports.custom- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arnullable|string|'max:' . \App\Support\Limits::chars(150)localerequiredrequired|in:en,aremployee_statusrequiredrequired|in:active,inactive,bothschedulerequiredrequired|in:none,daily,weekly,monthly,annuallynotify_user_idsnullable|arraynotify_user_ids.*integershared_branch_idsnullable|arrayshared_branch_ids.*integercolumnsrequiredrequired|array|min:1|max:120columns.*string|max:60ordernullable|arrayorder.*nullable|integer|min:1|max:999Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/custom-reports/{report}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"locale":"en","employee_status":"active","schedule":"none","notify_user_ids":[],"shared_branch_ids":[],"columns":[],"order":[]}' -
DELETE
/api/v1/app/companies/{company}/custom-reports/{report}- Sign-in
- App token or company API key
- Permission
reports.custom- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/custom-reports/{report}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/custom-reports/{report}/runGET custom-reports/{id}/run: the rows (limit, 500 by default), or format=csv.GET custom-reports/{id}/run: the rows (limit, 500 by default), or format=csv.
- Sign-in
- App token or company API key
- Permission
reports.custom- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/custom-reports/{report}/run" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
dashboard-metrics 1 endpoint
-
GET
/api/v1/app/companies/{company}/dashboard-metrics- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/dashboard-metrics" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
dashboards 1 endpoint
-
GET
/api/v1/app/companies/{company}/dashboards/{section}GET dashboards/{section}: hr, attendance, payroll, assets or performance (403 without that...GET dashboards/{section}: hr, attendance, payroll, assets or performance (403 without that section's permission). For hr: only the widgets the person may see are computed (widgets=key,key narrows them further), with the filter period (this_month, last_month, last_30, this_quarter, this_year) or from/to, branch_id and department_id.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · hr|attendance|payroll|assets|performance The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/dashboards/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-audit-log 1 endpoint
-
GET
/api/v1/app/companies/{company}/device-audit-log- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-audit-log" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-batches 1 endpoint
-
GET
/api/v1/app/companies/{company}/device-batches/{batch}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.batchstring · [\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12} The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-batches/{batch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-commands 1 endpoint
-
POST
/api/v1/app/companies/{company}/device-commands/{command}/{do}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.commandinteger The record's ID. dostring · retry|cancel The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-commands/{command}/{do}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-compatibility 1 endpoint
-
GET
/api/v1/app/companies/{company}/device-compatibility- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-compatibility" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-enrollments 2 endpoints
-
POST
/api/v1/app/companies/{company}/device-enrollments- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
byrequiredrequired|Rule::in(['employees', ...\App\Models\DeviceEnrollmentRule::TARGETS])idsarrayids.*integerdevice_idsrequiredrequired|array|min:1device_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-enrollments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"by":"...","ids":[],"device_ids":[]}' -
DELETE
/api/v1/app/companies/{company}/device-enrollments- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequired_without:group_id|nullable|integergroup_idnullable|integerdevice_idsrequiredrequired|array|min:1device_ids.*integerExample request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-enrollments?employee_id=1&group_id=1&device_ids=..." \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-people 1 endpoint
-
GET
/api/v1/app/companies/{company}/device-peoplePeople on devices: q (number, biometric ID or name), department; paged.People on devices: q (number, biometric ID or name), department; paged.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-people" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-settings 2 endpoints
-
GET
/api/v1/app/companies/{company}/device-settings/auto-publish- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-settings/auto-publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/device-settings/auto-publish- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
auto_publishrequiredrequired|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-settings/auto-publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"auto_publish":true}'
device-sync-report 1 endpoint
-
GET
/api/v1/app/companies/{company}/device-sync-reportPeople whose devices are not all in sync; format=csv to export.People whose devices are not all in sync; format=csv to export.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/device-sync-report" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
devices 12 endpoints
-
GET
/api/v1/app/companies/{company}/devices- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/devices/{device}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/devices/{device}Settings and punch rules; recompute_from pairs the device's punches since that date again...Settings and punch rules; recompute_from pairs the device's punches since that date again under the rule.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
access_modesometimes|in:attendance,access,bothfamilysometimes|nullable|in:terminal,panelsync_enabledsometimes|booleanstrict_userssometimes|booleanlock_countsometimes|nullable|integer|between:0,8all_branchessometimes|booleanbranch_idssometimes|array|min:1branch_ids.*integer|distinct|exists:branches,idpunch_modesometimes|nullable|in:first_last,all,functionpair_breakssometimes|booleanbreak_function_idsometimes|nullable|integer|exists:attendance_functions,iddebounce_minutessometimes|nullable|integer|between:0,60punch_in_window_minutessometimes|nullable|integer|between:0,720punch_out_grace_minutessometimes|nullable|integer|between:0,720allowed_ipssometimes|nullable|string|max:1000|function ($attribute, $value, $fail) { foreach (array_filter(array_map('trim...confirm_ipsometimes|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"access_mode":"attendance","family":"terminal","sync_enabled":true,"strict_users":true,"lock_count":1,"all_branches":true,"branch_ids":[],"punch_mode":"first_last","pair_breaks":true,"break_function_id":1,"debounce_minutes":1,"punch_in_window_minutes":1,"punch_out_grace_minutes":1,"allowed_ips":"...","confirm_ip":true}' -
POST
/api/v1/app/companies/{company}/devices/{device}/recompute- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/recompute" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/devices/{device}/remove-usersRemove numbers from one device: people who left or numbers no employee owns (not current e...Remove numbers from one device: people who left or numbers no employee owns (not current employees).
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
pinsrequiredrequired|array|max:5000pins.*string|max:32Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/remove-users" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"pins":[]}' -
POST
/api/v1/app/companies/{company}/devices/{device}/actions/{action}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. actionstring · sync|pull|pull_logs|info|check|reboot|clear_log|open_door|close_door|set_time|duplicate_check The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
doornullable|integer|between:1,8secondsnullable|integer|between:1,254fromnullable|datetonullable|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/actions/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"door":1,"seconds":1,"from":"2026-11-01","to":"2026-11-01"}' -
GET
/api/v1/app/companies/{company}/devices/{device}/commands- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusnullable|in:queued,sent,done,failed,cancelledExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/commands?status=queued" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/devices/{device}/users- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/users" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/devices/{device}/plan- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/plan" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/devices/{device}/enrollment-rulesA device's enrolment rules and the people enrolled one by one.A device's enrolment rules and the people enrolled one by one.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/enrollment-rules" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/devices/{device}/enrollment-rulestarget_type department|branch|position|group|all with ids (include), or employee with ids...target_type department|branch|position|group|all with ids (include), or employee with ids and effect exclude.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
target_typerequiredrequired|Rule::in([...\App\Models\DeviceEnrollmentRule::TARGETS, 'employee'])idsarrayids.*integereffectnullable|in:include,excludeExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/{device}/enrollment-rules" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"target_type":"...","ids":[],"effect":"include"}' -
POST
/api/v1/app/companies/{company}/devices/update-all"Update all devices" for one employee or everyone in reach: returns the batch whose progre..."Update all devices" for one employee or everyone in reach: returns the batch whose progress device-batches/{batch} shows.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/devices/update-all" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
directory 1 endpoint
-
GET
/api/v1/app/companies/{company}/directory- Sign-in
- App token or company API key
- Permission
self.directory.view | employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/directory" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
disciplinary-action-types 3 endpoints
-
POST
/api/v1/app/companies/{company}/disciplinary-action-types- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)letter_template_idnullable|integer|exists:letter_templates,iddeduction_typerequiredrequired|in:none,balanced_vacation,fixed,salary_day,percentleave_type_idnullable|required_if:deduction_type,balanced_vacation|integer|exists:leave_types,idtransaction_type_idnullable|required_if:deduction_type,fixed|integer|exists:transaction_types,iddeduction_valuenullable|required_unless:deduction_type,none|numeric|min:0|($input['deduction_type'] ?? null) === 'percent' ? 'max:100' : 'max:100000000'allowance_type_idsnullable|arrayallowance_type_ids.*integer|exists:transaction_types,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-action-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"letter_template_id":1,"deduction_type":"none","leave_type_id":1,"transaction_type_id":1,"deduction_value":1.5,"allowance_type_ids":[]}' -
PUT PATCH
/api/v1/app/companies/{company}/disciplinary-action-types/{type}- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)letter_template_idnullable|integer|exists:letter_templates,iddeduction_typerequiredrequired|in:none,balanced_vacation,fixed,salary_day,percentleave_type_idnullable|required_if:deduction_type,balanced_vacation|integer|exists:leave_types,idtransaction_type_idnullable|required_if:deduction_type,fixed|integer|exists:transaction_types,iddeduction_valuenullable|required_unless:deduction_type,none|numeric|min:0|($input['deduction_type'] ?? null) === 'percent' ? 'max:100' : 'max:100000000'allowance_type_idsnullable|arrayallowance_type_ids.*integer|exists:transaction_types,idExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-action-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"letter_template_id":1,"deduction_type":"none","leave_type_id":1,"transaction_type_id":1,"deduction_value":1.5,"allowance_type_ids":[]}' -
DELETE
/api/v1/app/companies/{company}/disciplinary-action-types/{type}- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-action-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
disciplinary-actions 6 endpoints
-
GET
/api/v1/app/companies/{company}/disciplinary-actions- Sign-in
- App token or company API key
- Permission
discipline.view | discipline.manage | discipline.record | discipline.approve | discipline.delete- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-actions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/disciplinary-actions/suggest- Sign-in
- App token or company API key
- Permission
discipline.record- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerdisciplinary_type_idrequiredrequired|integerincident_datenullable|dateExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-actions/suggest?employee_id=1&disciplinary_type_id=1&incident_date=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/disciplinary-actions- Sign-in
- App token or company API key
- Permission
discipline.record- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerdisciplinary_type_idrequiredrequired|integer|exists:disciplinary_types,idincident_daterequiredrequired|date|before_or_equal:todaydescriptionrequiredrequired|string|'max:' . \App\Support\Limits::chars(2000)disciplinary_action_type_idnullable|integer|exists:disciplinary_action_types,idactionnullable|in:verbal_warning,written_warning,final_warning,deductiondeduction_amountnullable|numeric|min:0|max:100000000draftsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-actions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"disciplinary_type_id":1,"incident_date":"2026-11-01","description":"...","disciplinary_action_type_id":1,"action":"verbal_warning","deduction_amount":1.5,"draft":true}' -
POST
/api/v1/app/companies/{company}/disciplinary-actions/generate- Sign-in
- App token or company API key
- Permission
discipline.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
leave_type_idrequiredrequired|integer|exists:leave_types,idkindrequiredrequired|in:redundant,graceeffective_daterequiredrequired|datefromrequiredrequired|datetorequiredrequired|date|after_or_equal:fromemployee_idnullable|integerbranch_idnullable|integerdepartment_idnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-actions/generate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"leave_type_id":1,"kind":"redundant","effective_date":"2026-11-01","from":"2026-11-01","to":"2026-11-01","employee_id":1,"branch_id":1,"department_id":1}' -
POST
/api/v1/app/companies/{company}/disciplinary-actions/{action}/approve- Sign-in
- App token or company API key
- Permission
discipline.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.actioninteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-actions/{action}/approve" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/disciplinary-actions/{action}- Sign-in
- App token or company API key
- Permission
discipline.delete- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.actioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-actions/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
disciplinary-rules 3 endpoints
-
POST
/api/v1/app/companies/{company}/disciplinary-rules- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
disciplinary_type_id$rule ? 'sometimes' : 'required'|integer|exists:disciplinary_types,id|unique:disciplinary_rules,disciplinary_type_idnamerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)rule_typenullable|in:sequential,separatedrop_afternullable|integer|min:1|max:1000drop_unitnullable|in:day,month,yearprevent_repetitionnullable|integer|min:0|max:1000prevent_unitnullable|in:day,month,yearaction_type_idsrequiredrequired|array|min:1|max:20action_type_ids.*integer|exists:disciplinary_action_types,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-rules" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"disciplinary_type_id":1,"name":{"en":"...","ar":"..."},"rule_type":"sequential","drop_after":1,"drop_unit":"day","prevent_repetition":1,"prevent_unit":"day","action_type_ids":[]}' -
PUT PATCH
/api/v1/app/companies/{company}/disciplinary-rules/{rule}- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.ruleinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
disciplinary_type_id$rule ? 'sometimes' : 'required'|integer|exists:disciplinary_types,id|unique:disciplinary_rules,disciplinary_type_idnamerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)rule_typenullable|in:sequential,separatedrop_afternullable|integer|min:1|max:1000drop_unitnullable|in:day,month,yearprevent_repetitionnullable|integer|min:0|max:1000prevent_unitnullable|in:day,month,yearaction_type_idsrequiredrequired|array|min:1|max:20action_type_ids.*integer|exists:disciplinary_action_types,idExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-rules/{rule}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"disciplinary_type_id":1,"name":{"en":"...","ar":"..."},"rule_type":"sequential","drop_after":1,"drop_unit":"day","prevent_repetition":1,"prevent_unit":"day","action_type_ids":[]}' -
DELETE
/api/v1/app/companies/{company}/disciplinary-rules/{rule}- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.ruleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/disciplinary-rules/{rule}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
discipline-setup 1 endpoint
-
GET
/api/v1/app/companies/{company}/discipline-setup- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/discipline-setup" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
documents 4 endpoints
-
GET
/api/v1/app/companies/{company}/documents- Sign-in
- App token or company API key
- Permission
self.documents.view | employees.view_sensitive- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/documents" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/documents- Sign-in
- App token or company API key
- Permission
self.documents.upload | employees.view_sensitive- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/documents" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/documents/{document}/download- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.documentinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/documents/{document}/download" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/documents/{document}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.documentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/documents/{document}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
door-events 2 endpoints
-
GET
/api/v1/app/companies/{company}/door-events- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
resultnullable|in:granted,denied,alarm,state,infofromnullable|datetonullable|dateformatnullable|in:json,csvExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/door-events?result=granted&from=2026-11-01&to=2026-11-01&format=json" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/door-events/{event}/acknowledge- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.eventinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/door-events/{event}/acknowledge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
employee-geolocations 2 endpoints
-
POST
/api/v1/app/companies/{company}/employee-geolocationsEmployees' locations: action assign|unassign|replace, employees, locations.Employees' locations: action assign|unassign|replace, employees, locations.
- Sign-in
- App token or company API key
- Permission
attendance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|in:assign,unassign,replaceemployeesrequiredrequired|array|min:1employees.*integerlocationsrequired_unless:action,unassign|arraylocations.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-geolocations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"assign","employees":[],"locations":[]}' -
POST
/api/v1/app/companies/{company}/employee-geolocations/replace-allfrom_location → to_location for everyone in reach at from_location.from_location → to_location for everyone in reach at from_location.
- Sign-in
- App token or company API key
- Permission
attendance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
from_locationrequiredrequired|integerto_locationrequiredrequired|integer|different:from_locationExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-geolocations/replace-all" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"from_location":1,"to_location":1}'
employee-groups 6 endpoints
-
GET
/api/v1/app/companies/{company}/employee-groups- Sign-in
- App token or company API key
- Permission
employee_groups.manage | devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-groups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employee-groups- Sign-in
- App token or company API key
- Permission
employee_groups.manage | devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arnullable|string|'max:' . \App\Support\Limits::chars(100)descriptionnullable|arraydescription.ennullable|string|'max:' . \App\Support\Limits::chars(500)description.arnullable|string|'max:' . \App\Support\Limits::chars(500)colornullable|regex:/^#[0-9a-fA-F]{6}$/branch_idnullable|integer|exists:branches,idrulesnullable|arrayrules.departmentsnullable|arrayrules.departments.*integer|exists:org_units,idrules.positionsnullable|arrayrules.positions.*integer|exists:positions,idrules.branchesnullable|arrayrules.branches.*integer|exists:branches,idmember_idsnullable|arraymember_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-groups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":{"en":"...","ar":"..."},"color":"...","branch_id":1,"rules":{"departments":[],"positions":[],"branches":[]},"member_ids":[]}' -
GET
/api/v1/app/companies/{company}/employee-groups/{group}- Sign-in
- App token or company API key
- Permission
employee_groups.manage | devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/employee-groups/{group}- Sign-in
- App token or company API key
- Permission
employee_groups.manage | devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/employee-groups/{group}- Sign-in
- App token or company API key
- Permission
employee_groups.manage | devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST DELETE
/api/v1/app/companies/{company}/employee-groups/{group}/membersemployee_ids: added (POST) or removed (DELETE).employee_ids: added (POST) or removed (DELETE).
- Sign-in
- App token or company API key
- Permission
employee_groups.manage | devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idsrequiredrequired|array|min:1employee_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-groups/{group}/members" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_ids":[]}'
employee-invitations 3 endpoints
-
GET
/api/v1/app/companies/{company}/employee-invitations- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-invitations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employee-invitations/preview- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
channelrequiredrequired|Rule::in(self::CHANNELS)branch_idnullable|integer|exists:branches,iddepartment_idnullable|integer|exists:org_units,idExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-invitations/preview?channel=...&branch_id=1&department_id=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employee-invitations- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 5 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
expectedrequiredrequired|integer|min:1channelrequiredrequired|Rule::in(self::CHANNELS)branch_idnullable|integer|exists:branches,iddepartment_idnullable|integer|exists:org_units,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-invitations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"expected":1,"channel":"...","branch_id":1,"department_id":1}'
employee-numbering 3 endpoints
-
GET
/api/v1/app/companies/{company}/employee-numberingEmployee numbering: the company's settings and each branch's (docs/employee-numbering.md).Employee numbering: the company's settings and each branch's (docs/employee-numbering.md).
- Sign-in
- App token or company API key
- Permission
employee_settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-numbering" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/employee-numbering- Sign-in
- App token or company API key
- Permission
employee_settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-numbering" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/employee-numbering/branches/{branch}- Sign-in
- App token or company API key
- Permission
employee_settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-numbering/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
employee-settings 4 endpoints
-
GET
/api/v1/app/companies/{company}/employee-settings/{kind}- Sign-in
- App token or company API key
- Permission
employee_settings.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · contract_types|job_grades|document_types|custom_fields|org_levels|field_rules|e_signatures|banks The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-settings/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employee-settings/{kind}- Sign-in
- App token or company API key
- Permission
employee_settings.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · contract_types|job_grades|document_types|custom_fields|org_levels|field_rules|e_signatures|banks The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-settings/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/employee-settings/{kind}/{id}- Sign-in
- App token or company API key
- Permission
employee_settings.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · contract_types|job_grades|document_types|custom_fields|org_levels|field_rules|e_signatures|banks The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-settings/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employee-settings/e_signatures/{id}/imageZenHR E-Signatures: the signature image itself.ZenHR E-Signatures: the signature image itself.
- Sign-in
- App token or company API key
- Permission
employee_settings.e_signatures.manage | letters.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.idinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-settings/e_signatures/{id}/image" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
employee-shifts 6 endpoints
-
GET
/api/v1/app/companies/{company}/employee-shiftsThe schedule between from and to (a week by default) for the employees in reach.The schedule between from and to (a week by default) for the employees in reach.
- Sign-in
- App token or company API key
- Permission
attendance.shift_planner.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
fromnullable|datetonullable|date|after_or_equal:fromemployeenullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-shifts?from=2026-11-01&to=2026-11-01&employee=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employee-shifts/exportThe week (week=any date in it) as the Employee Shifts screen shows it, with its filters; f...The week (week=any date in it) as the Employee Shifts screen shows it, with its filters; format csv (default) or json.
- Sign-in
- App token or company API key
- Permission
attendance.shift_planner.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
weeknullable|dateformatnullable|in:csv,jsonExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-shifts/export?week=2026-11-01&format=csv" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employee-shifts/regularRegular (non-roster) shift assignments and each person's own default shift, with the Emplo...Regular (non-roster) shift assignments and each person's own default shift, with the Employee Shifts filters.
- Sign-in
- App token or company API key
- Permission
attendance.shift_planner.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-shifts/regular" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employee-shiftsAssign Shift: employees, shift_id (or "off"), start_date, end_date (none = open-ended), co...Assign Shift: employees, shift_id (or "off"), start_date, end_date (none = open-ended), conflict replace|keep, draft.
- Sign-in
- App token or company API key
- Permission
attendance.shift_planner.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeesrequiredrequired|array|min:1employees.*integershift_idrequiredrequired|$request->input('shift_id') === 'off' ? 'in:off' : Rule::exists('shifts', 'id')-...start_daterequiredrequired|dateend_datenullable|date|after_or_equal:start_dateconflictnullable|in:replace,keepdraftsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-shifts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employees":[],"shift_id":"...","start_date":"2026-11-01","end_date":"2026-11-01","conflict":"replace","draft":true}' -
POST
/api/v1/app/companies/{company}/employee-shifts/planShift planner (ZenHR's roster): drafts employees' days from start_date to end_date (at mos...Shift planner (ZenHR's roster): drafts employees' days from start_date to end_date (at most 62 days, e.g. a month) with the chosen shifts and rules. employees = ids (none = everyone the role reaches).
- Sign-in
- App token or company API key
- Permission
attendance.shift_planner.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
shift_idsrequiredrequired|array|min:1shift_ids.*exists:shifts,idstart_daterequiredrequired|dateend_daterequiredrequired|date|after_or_equal:start_dateemployeesnullable|arrayemployees.*integermax_in_a_rownullable|integer|between:1,14days_off_a_weeknullable|integer|between:0,6max_weekly_hoursnullable|numeric|between:1,168fair_nightssometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-shifts/plan" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"shift_ids":[],"start_date":"2026-11-01","end_date":"2026-11-01","employees":[],"max_in_a_row":1,"days_off_a_week":1,"max_weekly_hours":1.5,"fair_nights":true}' -
POST
/api/v1/app/companies/{company}/employee-shifts/publishPublishes the drafts between start_date and end_date (a week or a month), and tells those...Publishes the drafts between start_date and end_date (a week or a month), and tells those people when notify is true.
- Sign-in
- App token or company API key
- Permission
attendance.shift_planner.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
start_daterequiredrequired|dateend_daterequiredrequired|date|after_or_equal:start_dateemployeesnullable|arrayemployees.*integernotifysometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employee-shifts/publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"start_date":"2026-11-01","end_date":"2026-11-01","employees":[],"notify":true}'
employees 51 endpoints
-
GET
/api/v1/app/companies/{company}/employees/{employee}/professional-data- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/professional-data" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/professional-data- Sign-in
- App token or company API key
- Permission
employees.edit- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/professional-data" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/rehire- Sign-in
- App token or company API key
- Permission
employees.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
hire_daterequiredrequired|date|$old->terminated_on ? ['after:' . $old->terminated_on->toDateString()] : []copy_bank_accountssometimes|booleancopy_familysometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/rehire" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"hire_date":"2026-11-01","copy_bank_accounts":true,"copy_family":true}' -
GET
/api/v1/app/companies/{company}/employees/existing-users"Add Employee for an Existing User": ended records (latest per person) to rehire, and acco..."Add Employee for an Existing User": ended records (latest per person) to rehire, and accounts with no employee record; q searches.
- Sign-in
- App token or company API key
- Permission
employees.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/existing-users" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/temporary-passwordtemporary_password (the company's password policy); they change it after signing in. Not t...temporary_password (the company's password policy); they change it after signing in. Not the owner's or one's own account.
- Sign-in
- App token or company API key
- Permission
employees.manage- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
temporary_passwordrequiredrequired|string|\App\Support\PasswordPolicy::rule($record->user)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/temporary-password" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"temporary_password":"..."}' -
POST
/api/v1/app/companies/{company}/employees/{employee}/unlockUnlocks an account locked by failed sign-in attempts.Unlocks an account locked by failed sign-in attempts.
- Sign-in
- App token or company API key
- Permission
employees.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/unlock" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/termination-check- Sign-in
- App token or company API key
- Permission
employees.terminate- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/termination-check" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/termination-check/{action}substitute, withdraw-requests, take-asset, expire-insurance, pay-loans, deduct-loanssubstitute, withdraw-requests, take-asset, expire-insurance, pay-loans, deduct-loans
- Sign-in
- App token or company API key
- Permission
employees.terminate- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. actionstring · substitute|withdraw-requests|take-asset|expire-insurance|pay-loans|deduct-loans The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/termination-check/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/cancel-termination- Sign-in
- App token or company API key
- Permission
employees.terminate- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/cancel-termination" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/checklist- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/checklist" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/checklist- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
typerequiredrequired|in:onboarding,offboardingtitlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(200)title.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(200)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/checklist" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"type":"onboarding","title":{"en":"...","ar":"..."}}' -
POST
/api/v1/app/companies/{company}/employees/{employee}/boardings- Sign-in
- App token or company API key
- Permission
employees.boardings.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
categoryrequiredrequired|in:onboarding,offboardingboarding_template_idrequiredrequired|integer|exists:boarding_templates,idboarding_datenullable|datearrive_bynullable|date_format:H:ilocation_namenullable|string|max:150contact_employee_idnullable|integer|$employeesmanager_employee_idnullable|integer|$employeesdescriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)sequentialnullable|booleantasksnullable|arraytasks.*.includenullable|booleantasks.*.due_daysnullable|integer|min:0|max:365Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/boardings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"category":"onboarding","boarding_template_id":1,"boarding_date":"2026-11-01","arrive_by":"2026-11-01","location_name":"...","contact_employee_id":1,"manager_employee_id":1,"description":"...","sequential":true,"tasks":[]}' -
GET
/api/v1/app/companies/{company}/employees/{employee}/salary-packagesAn employee's salary packages, newest first, with the current one's id.An employee's salary packages, newest first, with the current one's id.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-packages" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/salary-packages- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
effective_onrequiredrequired|date|'after_or_equal:' . $employee->hire_date->toDateString()basic_salaryrequiredrequired|numeric|min:0currencynullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLsalary_countrequiredrequired|integer|between:12,16other_exemptionnullable|numeric|min:0ss_salarynullable|numeric|min:0ss_currencynullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLsocial_security_rule_idnullable|exists:social_security_rules,idss_participation_datenullable|datecompany_bank_account_idnullable|exists:company_bank_accounts,idtax_numbernullable|string|max:50ss_numbernullable|string|max:50gl_accountnullable|string|max:50notesnullable|string|'max:' . \App\Support\Limits::chars(500)itemsarrayitems.*.kindrequired_with:items.*.amount|in:allowance,deduction,company_expenseitems.*.transaction_type_idnullable|exists:transaction_types,iditems.*.name_ennullable|string|'max:' . \App\Support\Limits::chars(150)items.*.name_arnullable|string|'max:' . \App\Support\Limits::chars(150)items.*.amountnullable|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-packages" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"effective_on":"2026-11-01","basic_salary":1.5,"currency":"AED","salary_count":1,"other_exemption":1.5,"ss_salary":1.5,"ss_currency":"AED","social_security_rule_id":"...","ss_participation_date":"2026-11-01","company_bank_account_id":"...","tax_number":"...","ss_number":"...","gl_account":"...","notes":"...","items":[]}' -
DELETE
/api/v1/app/companies/{company}/employees/{employee}/salary-packages/{package}- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. packageinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-packages/{package}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/salary-stopStop (reason) or resume an employee's salary: action = stop | resume.Stop (reason) or resume an employee's salary: action = stop | resume.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|in:stop,resumereasonrequiredrequired|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-stop" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"stop","reason":"..."}' -
GET
/api/v1/app/companies/{company}/employees/{employee}/project-contributionsGET employees/{employee}/project-contributions?month=YYYY-MM: each project's contribution...GET employees/{employee}/project-contributions?month=YYYY-MM: each project's contribution and the month's timesheet hours on it.
- Sign-in
- App token or company API key
- Permission
payroll.cost_allocations.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/project-contributions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/employees/{employee}/project-contributionsPUT employees/{employee}/project-contributions {projects: [{project_id, contribution_perce...PUT employees/{employee}/project-contributions {projects: [{project_id, contribution_percent}]} adding up to 100.
- Sign-in
- App token or company API key
- Permission
payroll.cost_allocations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
projectsrequiredrequired|array|min:1projects.*.project_idrequiredrequired|integer|distinctprojects.*.contribution_percentrequiredrequired|numeric|between:0,100Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/project-contributions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"projects":[]}' -
GET
/api/v1/app/companies/{company}/employees/{employee}/salary-packages/{package}One salary package of an employee in scope, with its items and the package in force before...One salary package of an employee in scope, with its items and the package in force before it.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. packageinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-packages/{package}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/salary-scaleAn employee's placement (payroll.view or payroll.manage, in scope).An employee's placement (payroll.view or payroll.manage, in scope).
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-scale" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/employees/{employee}/salary-scalePlaces an employee in my payroll.manage scope; warning when the salary is outside the new...Places an employee in my payroll.manage scope; warning when the salary is outside the new enforced range.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
scale_level_idnullable|$in('scale_levels')scale_band_idnullable|$in('scale_bands')scale_grade_idnullable|$in('scale_grades')Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/salary-scale" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"scale_level_id":"...","scale_band_id":"...","scale_grade_id":"..."}' -
GET
/api/v1/app/companies/{company}/employees/{employee}/stb-encashmentWhat an employee in my scope could take now: years, accrued, taken, allowed, eligible, rea...What an employee in my scope could take now: years, accrued, taken, allowed, eligible, reason.
- Sign-in
- App token or company API key
- Permission
payroll.stb_encashments.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/stb-encashment" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/leave-balancesAn employee's balances (?year, ?as_of) and their time off setup rows.An employee's balances (?year, ?as_of) and their time off setup rows.
- Sign-in
- App token or company API key
- Permission
leaves.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/leave-balances" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/employees/{employee}/timeoff/{leaveType}One employee's setup for a leave type; with "reset": true back to the company setup.One employee's setup for a leave type; with "reset": true back to the company setup.
- Sign-in
- App token or company API key
- Permission
leaves.balance_corrections.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. leaveTypeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
entitlement_daysnullable|numeric|min:0|max:365open_balancenullable|numeric|min:-365|max:365carry_balancenullable|numeric|min:0|max:365balance_yearnullable|integer|min:2000|max:2100activenullable|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/timeoff/{leaveType}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"entitlement_days":1.5,"open_balance":1.5,"carry_balance":1.5,"balance_year":1,"active":true}' -
GET
/api/v1/app/companies/{company}/employees/{employee}/timeoff/{leaveType}/balanceZenHR's "Show balance": each year since hiring (up to ten), split into opening, previous,...ZenHR's "Show balance": each year since hiring (up to ten), split into opening, previous, adjustments, encashed, hourly, total, taken, pending, remaining.
- Sign-in
- App token or company API key
- Permission
leaves.balance_corrections.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. leaveTypeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/timeoff/{leaveType}/balance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/timeoff/{leaveType}/{action}Timeoff setup: cancel-future (ZenHR's Cancel all future transactions) or deactivate-move (...Timeoff setup: cancel-future (ZenHR's Cancel all future transactions) or deactivate-move (to_leave_type_id).
- Sign-in
- App token or company API key
- Permission
leaves.balance_corrections.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. leaveTypeinteger The record's ID. actionstring · cancel-future|deactivate-move The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
to_leave_type_idrequiredrequired|integer|exists:leave_types,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/timeoff/{leaveType}/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"to_leave_type_id":1}' -
POST
/api/v1/app/companies/{company}/employees/{employee}/clocking-devices/resetResets an employee's phone: the next phone they clock from needs approval.Resets an employee's phone: the next phone they clock from needs approval.
- Sign-in
- App token or company API key
- Permission
attendance.security.review- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/clocking-devices/reset" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/clocking-fromWhere one employee clocks from: their own choice, the branch's, and what applies.Where one employee clocks from: their own choice, the branch's, and what applies.
- Sign-in
- App token or company API key
- Permission
attendance.clocking_from.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/clocking-from" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/employees/{employee}/clocking-fromclocking_from: both, web, mobile or device; null or "follow" goes back to the branch's.clocking_from: both, web, mobile or device; null or "follow" goes back to the branch's.
- Sign-in
- App token or company API key
- Permission
attendance.clocking_from.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
clocking_frompresentExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/clocking-from" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"clocking_from":"..."}' -
GET
/api/v1/app/companies/{company}/employees/{employee}/devicesA person's devices: profile, enrolments, why they are (not) on each device, templates (no...A person's devices: profile, enrolments, why they are (not) on each device, templates (no data).
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/employees/{employee}/device-profile- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
cardsometimes|nullable|string|max:32|regex:/^[0-9A-Za-z]*$/passwordsometimes|nullable|string|max:8|regex:/^[0-9]*$/privilegesometimes|integer|in:0,2,6,14verify_modesometimes|in:default,any,finger,pin,password,card,finger_or_password,finger_or_card,card_or_password,pin_and_finger,finger_and_password,card_and_finger,card_and_password,finger_password_card,pin_finger_password,finger_and_card_or_pin,face,face_and_finger,face_and_password,face_and_card,face_finger_card,face_finger_password,vein,palmenabledsometimes|booleanpush_photosometimes|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/device-profile" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"card":"...","password":"...","privilege":1,"verify_mode":"default","enabled":true,"push_photo":true}' -
POST
/api/v1/app/companies/{company}/employees/{employee}/remove-from-devices- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/remove-from-devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/pull-templates- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/pull-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/biometric-templatesTemplates; the data itself only with include_data=1 and the permission to see sensitive em...Templates; the data itself only with include_data=1 and the permission to see sensitive employee data.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/biometric-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/biometric-matrixThe person's slots × devices (present, missing, outdated, conflict, pending, incompatible,...The person's slots × devices (present, missing, outdated, conflict, pending, incompatible, capacity…).
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/biometric-matrix" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/publish-missing- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/publish-missing" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/file/{kind}The employee's file: contracts, bank_accounts, family or documents (wave 1 of moving Mawar...The employee's file: contracts, bank_accounts, family or documents (wave 1 of moving Mawarid in).
- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. kindstring · contracts|bank_accounts|family|documents The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/file/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/file/{kind}- Sign-in
- App token or company API key
- Permission
employees.edit- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. kindstring · contracts|bank_accounts|family|documents The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/file/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/employees/{employee}/file/{kind}/{id}- Sign-in
- App token or company API key
- Permission
employees.edit- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. kindstring · contracts|bank_accounts|family|documents The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/file/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/employees/{employee}/file/{kind}/{id}- Sign-in
- App token or company API key
- Permission
employees.edit- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. kindstring · contracts|bank_accounts|family|documents The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/file/{kind}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/documents/{document}/download- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. documentinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/documents/{document}/download" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}/history- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/history" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/employees/{employee}- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees- Sign-in
- App token or company API key
- Permission
employees.create- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/employees/{employee}- Sign-in
- App token or company API key
- Permission
employees.edit- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/transfer- Sign-in
- App token or company API key
- Permission
employees.transfer- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
branch_idrequiredrequired|integer|exists:branches,ideffective_daterequiredrequired|date|'after_or_equal:' . $employee->started_on?->toDateString()position_idnullable|integer|exists:positions,idwork_location_id$unitRule('work_location')department_id$unitRule('department')section_id$unitRule('section')project_id$unitRule('project')notenullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/transfer" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"branch_id":1,"effective_date":"2026-11-01","position_id":1,"work_location_id":"...","department_id":"...","section_id":"...","project_id":"...","note":"..."}' -
GET
/api/v1/app/companies/{company}/employees/by-number/{number}One employee by the number people use (the current record first; ?branch_id= when numbers...One employee by the number people use (the current record first; ?branch_id= when numbers repeat across branches).
- Sign-in
- App token or company API key
- Permission
employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.numberstring The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/by-number/{number}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/archive"Delete": archives the record and keeps everything tied to it (docs/employee-numbering.md)..."Delete": archives the record and keeps everything tied to it (docs/employee-numbering.md).
- Sign-in
- App token or company API key
- Permission
employees.archive- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonnullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/archive" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}' -
POST
/api/v1/app/companies/{company}/employees/{employee}/restore- Sign-in
- App token or company API key
- Permission
employees.archive- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/restore" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/employees/{employee}/terminate- Sign-in
- App token or company API key
- Permission
employees.terminate- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
terminated_onrequiredrequired|date|'after_or_equal:' . ($employee->started_on ?? $employee->hire_date)?->toDateStri...termination_typerequiredrequired|in:resignation,dismissal,end_of_contract,other,retirement,transfernotenullable|string|'max:' . \App\Support\Limits::chars(500)termination_reason_idnullable|integer|exists:termination_reasons,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/employees/{employee}/terminate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"terminated_on":"2026-11-01","termination_type":"resignation","note":"...","termination_reason_id":1}'
engine 16 endpoints
-
GET
/api/v1/app/companies/{company}/engine/dashboardThe dashboard in the app (docs/mobile-dashboards.md): the widgets open to the person here,...The dashboard in the app (docs/mobile-dashboards.md): the widgets open to the person here, as blocks.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/dashboard" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/engine/dashboard/layoutPUT dashboard/layout: order [keys], show [keys], or reset; on the phone only.PUT dashboard/layout: order [keys], show [keys], or reset; on the phone only.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/dashboard/layout" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/linksGET links?url=: what a notice's or a result's link opens for this person, or why it can't.GET links?url=: what a notice's or a result's link opens for this person, or why it can't.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
urlnullable|string|max:500Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/links?url=..." \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/records- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/records" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/engine/sections/{section}/records- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/records" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/records/{record}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. recordinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/records/{record}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/engine/sections/{section}/records/{record}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. recordinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/records/{record}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/engine/sections/{section}/records/{record}/actions/{action}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. recordinteger The record's ID. actionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/records/{record}/actions/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/records/{record}/files/{field}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. recordinteger The record's ID. fieldstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/records/{record}/files/{field}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/engine/sections/{section}/bulk/{action}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. actionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/bulk/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/form- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/form" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/options/{field}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. fieldstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/options/{field}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/blocks- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/blocks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/engine/sections/{section}/export- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/engine/sections/{section}/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
enrollment-rules 1 endpoint
-
DELETE
/api/v1/app/companies/{company}/enrollment-rules/{rule}- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.ruleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/enrollment-rules/{rule}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
eos-policies 5 endpoints
-
GET
/api/v1/app/companies/{company}/eos-policiesFilters: name, category, contract_type (limited | unlimited), defaults_only.Filters: name, category, contract_type (limited | unlimited), defaults_only.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/eos-policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/eos-policies- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(120)name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(120)termination_categoryrequiredrequired|in:any,resignation,termination,end_of_contract,retirement,transfer,othermin_yearsrequiredrequired|integer|min:0|max:50tiersrequiredrequired|string|max:1000worth_tiersnullable|string|max:1000contract_typenullable|in:both,limited,unlimitedexclude_unpaidnullable|arrayexclude_unpaid.*stringnationalitiesnullable|arraynationalities.*string|max:60end_datenullable|dateallowance_type_idsnullable|arrayallowance_type_ids.*integer|exists:transaction_types,idcalc_basenullable|in:calendar,365,360year_definitionnullable|in:calendar,fixedfixed_year_daysnullable|required_if:year_definition,fixed|integer|between:300,400calc_typenullable|in:service,remaining,bothremaining_directionnullable|in:add,deductservice_min_salariesnullable|numeric|min:0service_max_salariesnullable|numeric|min:0remaining_min_salariesnullable|numeric|min:0remaining_max_salariesnullable|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/eos-policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","termination_category":"any","min_years":1,"tiers":"...","worth_tiers":"...","contract_type":"both","exclude_unpaid":[],"nationalities":[],"end_date":"2026-11-01","allowance_type_ids":[],"calc_base":"calendar","year_definition":"calendar","fixed_year_days":1,"calc_type":"service","remaining_direction":"add","service_min_salaries":1.5,"service_max_salaries":1.5,"remaining_min_salaries":1.5,"remaining_max_salaries":1.5}' -
GET
/api/v1/app/companies/{company}/eos-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/eos-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/eos-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(120)name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(120)termination_categoryrequiredrequired|in:any,resignation,termination,end_of_contract,retirement,transfer,othermin_yearsrequiredrequired|integer|min:0|max:50tiersrequiredrequired|string|max:1000worth_tiersnullable|string|max:1000contract_typenullable|in:both,limited,unlimitedexclude_unpaidnullable|arrayexclude_unpaid.*stringnationalitiesnullable|arraynationalities.*string|max:60end_datenullable|dateallowance_type_idsnullable|arrayallowance_type_ids.*integer|exists:transaction_types,idcalc_basenullable|in:calendar,365,360year_definitionnullable|in:calendar,fixedfixed_year_daysnullable|required_if:year_definition,fixed|integer|between:300,400calc_typenullable|in:service,remaining,bothremaining_directionnullable|in:add,deductservice_min_salariesnullable|numeric|min:0service_max_salariesnullable|numeric|min:0remaining_min_salariesnullable|numeric|min:0remaining_max_salariesnullable|numeric|min:0Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/eos-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","termination_category":"any","min_years":1,"tiers":"...","worth_tiers":"...","contract_type":"both","exclude_unpaid":[],"nationalities":[],"end_date":"2026-11-01","allowance_type_ids":[],"calc_base":"calendar","year_definition":"calendar","fixed_year_days":1,"calc_type":"service","remaining_direction":"add","service_min_salaries":1.5,"service_max_salaries":1.5,"remaining_min_salaries":1.5,"remaining_max_salaries":1.5}' -
DELETE
/api/v1/app/companies/{company}/eos-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/eos-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
evaluation-criteria 1 endpoint
-
DELETE
/api/v1/app/companies/{company}/evaluation-criteria/{criterion}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.criterioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-criteria/{criterion}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
evaluation-cycles 9 endpoints
-
GET
/api/v1/app/companies/{company}/evaluation-cyclesThe cycles, with the list's filters: q (name), status (draft, open, closed) and stage (cur...The cycles, with the list's filters: q (name), status (draft, open, closed) and stage (current stage).
- Sign-in
- App token or company API key
- Permission
performance.view | performance.manage.* | performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}The cycle and its evaluations in scope, with the cycle page's filters (q, branch, position...The cycle and its evaluations in scope, with the cycle page's filters (q, branch, position, work_location, department, section, project, hierarchy_group, stage, status, action, okrs, missing, employee_status).
- Sign-in
- App token or company API key
- Permission
performance.view | performance.manage.* | performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}/calibrationWho sits in which result band of a cycle, in what the person reaches, and whose result the...Who sits in which result band of a cycle, in what the person reaches, and whose result they may move.
- Sign-in
- App token or company API key
- Permission
performance.calibrate- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}/calibration" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluation-cyclesevaluation_template_id, name, branch_ids, year, evaluation_part, stages {stage: {start, en...evaluation_template_id, name, branch_ids, year, evaluation_part, stages {stage: {start, end}}.
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.cycles.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namenullable|string|max:150branch_idsnullable|arraybranch_ids.*integer|exists:branches,idyearrequiredrequired|integer|between:2000,2100evaluation_partrequiredrequired|Rule::in(array_keys(\App\Models\EvaluationCycle::parts($template->period)))stagesrequiredrequired|arraystages.*.startnullable|datestages.*.endnullable|datestages.*.on_start_endnullable|booleanstages.*.before_endnullable|booleanstages.*.on_submitnullable|booleanstages.*.before_end_daysnullable|integer|min:0|max:60stages.*.notify_idsnullable|arraystages.*.notify_ids.*integer|exists:employees,idsend_before_startnullable|booleansend_before_start_daysnullable|integer|min:1|max:60Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","branch_ids":[],"year":1,"evaluation_part":"...","stages":[],"send_before_start":true,"send_before_start_days":1}' -
POST
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}/launch- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.cycles.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}/launch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}/close- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.cycles.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}/close" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}/dates- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.cycles.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}/dates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}/employeesemployees (ids).employees (ids).
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.cycles.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}/employees" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/evaluation-cycles/{cycle}- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.cycles.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-cycles/{cycle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
evaluation-templates 4 endpoints
-
POST
/api/v1/app/companies/{company}/evaluation-templates- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/evaluation-templates/{template}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/evaluation-templates/{template}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluation-templates/{template}/criteriatitle {en, ar}, weight, kind factor|okr, target, measurement_unit_id.title {en, ar}, weight, kind factor|okr, target, measurement_unit_id.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(200)title.arnullable|string|'max:' . \App\Support\Limits::chars(200)weightrequiredrequired|numeric|min:0.01|max:100kindnullable|in:factor,okrtargetnullable|required_if:kind,okr|numeric|gt:0measurement_unit_idnullable|integer|exists:measurement_units,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluation-templates/{template}/criteria" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"weight":1.5,"kind":"factor","target":1.5,"measurement_unit_id":1}'
evaluations 11 endpoints
-
GET
/api/v1/app/companies/{company}/evaluations/{evaluation}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/self- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
attachmentsnullable|array|max:10attachments.*file|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/self" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"attachments":[]}' -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/review- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/review" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/objectivesobjective: name {en, ar}, description {en, ar}, weight, key_results [{name {en, ar}, weigh...objective: name {en, ar}, description {en, ar}, weight, key_results [{name {en, ar}, weight, measurement_unit_id, target}].
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/objectives" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/okrs/publish- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/okrs/publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/notesperformance_summary, key_strengths, weaknesses, recommendations, attachments[].performance_summary, key_strengths, weaknesses, recommendations, attachments[].
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/notes" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/finalfinal_rate_override (0–100), final_notes, notify_people.final_rate_override (0–100), final_notes, notify_people.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
final_rate_overriderequiredrequired|numeric|min:0|max:100final_notesnullable|string|max:3000Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/final" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"final_rate_override":1.5,"final_notes":"..."}' -
POST
/api/v1/app/companies/{company}/evaluations/{evaluation}/calibratescore (0–100), reason.score (0–100), reason.
- Sign-in
- App token or company API key
- Permission
performance.calibrate- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
scorerequiredrequired|numeric|min:0|max:100reasonrequiredrequired|string|min:3|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/calibrate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"score":1.5,"reason":"..."}' -
PUT
/api/v1/app/companies/{company}/evaluations/{evaluation}/task-holdersokr_writer_id, okr_auditor_ids, result_writer_id, result_auditor_ids (employee ids).okr_writer_id, okr_auditor_ids, result_writer_id, result_auditor_ids (employee ids).
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.evaluations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
okr_writer_idnullable|integer|$personokr_auditor_idsnullable|arrayokr_auditor_ids.*integer|$personresult_writer_idnullable|integer|$personresult_auditor_idsnullable|arrayresult_auditor_ids.*integer|$personExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/task-holders" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"okr_writer_id":1,"okr_auditor_ids":[],"result_writer_id":1,"result_auditor_ids":[]}' -
PUT
/api/v1/app/companies/{company}/evaluations/{evaluation}/datesstages {stage: {start, end}}.stages {stage: {start, end}}.
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.evaluations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}/dates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/evaluations/{evaluation}- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.evaluations.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evaluationinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/evaluations/{evaluation}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
events 4 endpoints
-
GET
/api/v1/app/companies/{company}/eventsmonth (YYYY-MM): coming up, past, the month's events by day and its holidays.month (YYYY-MM): coming up, past, the month's events by day and its holidays.
- Sign-in
- App token or company API key
- Permission
self.events | events.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/events" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/eventstitle {en, ar}, date, start_time (HH:MM), location, description.title {en, ar}, date, start_time (HH:MM), location, description.
- Sign-in
- App token or company API key
- Permission
events.create- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)title.arnullable|string|'max:' . \App\Support\Limits::chars(150)daterequiredrequired|datestart_timenullable|date_format:H:ilocationnullable|string|max:150descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/events" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"date":"2026-11-01","start_time":"2026-11-01","location":"...","description":"..."}' -
PATCH PUT
/api/v1/app/companies/{company}/events/{event}- Sign-in
- App token or company API key
- Permission
events.edit- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.eventinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)title.arnullable|string|'max:' . \App\Support\Limits::chars(150)daterequiredrequired|datestart_timenullable|date_format:H:ilocationnullable|string|max:150descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/events/{event}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"date":"2026-11-01","start_time":"2026-11-01","location":"...","description":"..."}' -
DELETE
/api/v1/app/companies/{company}/events/{event}- Sign-in
- App token or company API key
- Permission
events.delete- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.eventinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/events/{event}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
exchange-rates 5 endpoints
-
GET
/api/v1/app/companies/{company}/exchange-ratesRates, by pair and newest date first: currency (either side), branch (an id, or "company"...Rates, by pair and newest date first: currency (either side), branch (an id, or "company" for company-wide).
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/exchange-rates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/exchange-rates- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
from_currency$currencyto_currency$currency|different:from_currencyraterequiredrequired|numeric|gt:0effective_daterequiredrequired|datereverse_ratenullable|numeric|gt:0branch_idnullable|exists:branches,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/exchange-rates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"from_currency":"...","to_currency":"...","rate":1.5,"effective_date":"2026-11-01","reverse_rate":1.5,"branch_id":"..."}' -
PUT
/api/v1/app/companies/{company}/exchange-rates/multi-currency- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
multi_currencyrequiredrequired|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/exchange-rates/multi-currency" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"multi_currency":true}' -
POST
/api/v1/app/companies/{company}/exchange-rates/copy- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
branch_idsrequiredrequired|arraybranch_ids.*exists:branches,ideffective_daterequiredrequired|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/exchange-rates/copy" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"branch_ids":[],"effective_date":"2026-11-01"}' -
DELETE
/api/v1/app/companies/{company}/exchange-rates/{rate}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.rateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/exchange-rates/{rate}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
feedback-cycles 7 endpoints
-
GET
/api/v1/app/companies/{company}/feedback-cycles/{cycle}/results/{employee}One employee's summary per reviewer group (HR any time, the employee once the cycle is clo...One employee's summary per reviewer group (HR any time, the employee once the cycle is closed).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles/{cycle}/results/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/feedback-cycles- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/feedback-cyclesname, evaluation_template_id, due_date, peers_per_employee; or a survey cycle (Feedback::c...name, evaluation_template_id, due_date, peers_per_employee; or a survey cycle (Feedback::createSurveyCycle).
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:150evaluation_template_idrequiredrequired|integer|exists:evaluation_templates,iddue_daterequiredrequired|date|after_or_equal:todaypeers_per_employeerequiredrequired|integer|between:0,10descriptionrequiredrequired|string|'max:' . \App\Support\Limits::chars(2000)start_daterequiredrequired|dategroupsrequiredrequired|arraygroups.*nullable|arraygroups.report.countnullable|integer|between:1,10groups.peer.countnullable|integer|between:1,10groups.*.weightnullable|numeric|between:0,100assign_torequiredrequired|in:individual,groupemployeesrequiredexclude_unless:assign_to,individual|required|array|min:1employees.*integergroupnullable|arraygroup.*nullable|alpha_dash|max:30questionsrequiredrequired|array|min:1|max:60questions.*.typerequiredrequired|in:rating,openquestions.*.textrequiredrequired|string|'max:' . \App\Support\Limits::chars(300)questions.*.helpernullable|string|'max:' . \App\Support\Limits::chars(500)questions.*.maxnullable|integer|between:2,10questions.*.lownullable|string|'max:' . \App\Support\Limits::chars(40)questions.*.highnullable|string|'max:' . \App\Support\Limits::chars(40)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","evaluation_template_id":1,"due_date":"2026-11-01","peers_per_employee":1,"description":"...","start_date":"2026-11-01","groups":{"report":{"count":1},"peer":{"count":1}},"assign_to":"individual","employees":[],"group":[],"questions":[]}' -
GET
/api/v1/app/companies/{company}/feedback-cycles/{cycle}The cycle and, per employee in scope, how many were asked and answered.The cycle and, per employee in scope, how many were asked and answered.
- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles/{cycle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/feedback-cycles/{cycle}/launch- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles/{cycle}/launch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/feedback-cycles/{cycle}/close- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles/{cycle}/close" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/feedback-cycles/{cycle}- Sign-in
- App token or company API key
- Permission
performance.manage.* | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.cycleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-cycles/{cycle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
feedback-form-assignments 2 endpoints
-
GET
/api/v1/app/companies/{company}/feedback-form-assignments/{assignment}A feedback form assigned to me: its questions and my answers (403 for anyone else).A feedback form assigned to me: its questions and my answers (403 for anyone else).
- Sign-in
- App token or company API key
- Permission
self.performance.forms- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assignmentinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-form-assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/feedback-form-assignments/{assignment}- Sign-in
- App token or company API key
- Permission
self.performance.forms- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assignmentinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-form-assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
feedback-forms 4 endpoints
-
GET
/api/v1/app/companies/{company}/feedback-forms- Sign-in
- App token or company API key
- Permission
performance.feedback_forms.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-forms" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/feedback-forms/{form}The form, its questions and each question's answers (names hidden when anonymous).The form, its questions and each question's answers (names hidden when anonymous).
- Sign-in
- App token or company API key
- Permission
performance.feedback_forms.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.forminteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-forms/{form}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/feedback-formstitle, description, start_date, end_date, anonymous, questions [...], assign_to individual...title, description, start_date, end_date, anonymous, questions [...], assign_to individual (employees) | group (group).
- Sign-in
- App token or company API key
- Permission
performance.feedback_forms.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|string|max:200descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)start_daterequiredrequired|dateend_datenullable|date|after_or_equal:start_datequestionsrequiredrequired|array|min:1|max:100questions.*.typerequiredrequired|in:text,textarea,checkbox,radio,rating,yes_noquestions.*.labelrequiredrequired|string|max:300questions.*.helpernullable|string|max:300questions.*.weightnullable|numeric|min:0|max:1000questions.*.optionsnullable|array|max:50questions.*.options.*.labelrequiredrequired|string|max:150questions.*.options.*.valuerequiredrequired|string|max:150questions.*.min_ratingnullable|integer|between:0,100questions.*.max_ratingnullable|integer|between:1,100assign_torequiredrequired|in:individual,groupemployeesrequiredexclude_unless:assign_to,individual|required|array|min:1employees.*integergroupnullable|arraygroup.*nullable|alpha_dash|max:30Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-forms" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":"...","description":"...","start_date":"2026-11-01","end_date":"2026-11-01","questions":[],"assign_to":"individual","employees":[],"group":[]}' -
DELETE
/api/v1/app/companies/{company}/feedback-forms/{form}- Sign-in
- App token or company API key
- Permission
performance.feedback_forms.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.forminteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-forms/{form}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
feedback-requests 1 endpoint
-
POST
/api/v1/app/companies/{company}/feedback-requests/{feedbackRequest}scores {criterion id: 1–5}, comment.scores {criterion id: 1–5}, comment.
- Sign-in
- App token or company API key
- Permission
self.performance.feedback- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.feedbackRequestinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
scoresrequiredrequired|arraycommentnullable|string|'max:' . \App\Support\Limits::chars(2000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/feedback-requests/{feedbackRequest}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"scores":[],"comment":"..."}'
field 97 endpoints
-
GET
/api/v1/app/companies/{company}/field/my-jobsThe signed-in employee's jobs: open first, then the last 30 days.The signed-in employee's jobs: open first, then the last 30 days.
- Sign-in
- App token or company API key
- Permission
self.field_jobs | field.jobs.view | field.jobs.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/my-jobs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/my-jobs/{job}One of the employee's jobs with its photos.One of the employee's jobs with its photos.
- Sign-in
- App token or company API key
- Permission
self.field_jobs | field.jobs.view | field.jobs.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/my-jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/time-anchorbody: device_id, boot_id, elapsed_ms (the phone's since-boot clock as it asks).body: device_id, boot_id, elapsed_ms (the phone's since-boot clock as it asks).
- Sign-in
- App token or company API key
- Permission
self.field_jobs- Module
fsm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
device_idrequiredrequired|string|max:100boot_idnullable|string|max:100elapsed_msnullable|integer|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/time-anchor" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"device_id":"...","boot_id":"...","elapsed_ms":1}' -
POST
/api/v1/app/companies/{company}/field/device-keys/challenge- Sign-in
- App token or company API key
- Permission
self.field_jobs- Module
fsm- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/device-keys/challenge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/device-keysdevice_id, public_key (base64 SPKI P-256), platform, challenge, attestation {android_key_c...device_id, public_key (base64 SPKI P-256), platform, challenge, attestation {android_key_chain | ios_app_attest {key_id, attestation_object}}.
- Sign-in
- App token or company API key
- Permission
self.field_jobs- Module
fsm- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/device-keys" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/device-keysThe signed-in person's keys in this company.The signed-in person's keys in this company.
- Sign-in
- App token or company API key
- Permission
self.field_jobs- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/device-keys" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/jobs/{job}/evidencemultipart: photo (JPEG, as signed), meta (canonical JSON), signature (base64 ECDSA P-256 o...multipart: photo (JPEG, as signed), meta (canonical JSON), signature (base64 ECDSA P-256 over meta).
- Sign-in
- App token or company API key
- Permission
self.field_jobs- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
photorequiredrequired|file|mimetypes:image/jpeg|max:15360metarequiredrequired|string|max:20000signaturerequiredrequired|string|max:500Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/evidence" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" \ -F "meta=..." \ -F "signature=..." -
GET
/api/v1/app/companies/{company}/field/evidence/{evidence}/photoThe original JPEG (?size=thumb for the thumbnail): reviewers, and the employee who took it...The original JPEG (?size=thumb for the thumbnail): reviewers, and the employee who took it.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/evidence/{evidence}/photo" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/my-overtime- Sign-in
- App token or company API key
- Permission
self.field_overtime- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/my-overtime" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/overtime/{employeeRequest}/submitbody: reason (required), overtime_type_id (optional, a requestable type).body: reason (required), overtime_type_id (optional, a requestable type).
- Sign-in
- App token or company API key
- Permission
self.field_overtime- Module
fsm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonrequiredrequired|string|'max:' . \App\Support\Limits::chars(500)overtime_type_idnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/overtime/{employeeRequest}/submit" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"...","overtime_type_id":1}' -
POST
/api/v1/app/companies/{company}/field/overtime/{employeeRequest}/discard- Sign-in
- App token or company API key
- Permission
self.field_overtime- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/overtime/{employeeRequest}/discard" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/flagsEvery flag and reason code with its plain-language label and explanation in English and Ar...Every flag and reason code with its plain-language label and explanation in English and Arabic.
- Sign-in
- App token or company API key
- Permission
self.field_jobs | field.evidence.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/flags" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/geocode/searchq (2–200 characters), lang (en|ar, default the UI language), lat and lng (optional, to pre...q (2–200 characters), lang (en|ar, default the UI language), lat and lng (optional, to prefer results near them), limit (1–10).
- Sign-in
- App token or company API key
- Permission
self.field_jobs | field.jobs.view | field.jobs.manage | field_setup.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
qrequiredrequired|string|min:2|'max:' . \App\Support\Limits::chars(200)langnullable|in:en,arlatnullable|numeric|between:-90,90|required_with:lnglngnullable|numeric|between:-180,180|required_with:latlimitnullable|integer|between:1,10Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/geocode/search?q=...&lang=en&lat=1.5&lng=1.5" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/geocode/reverselat, lng, lang (en|ar, default the UI language).lat, lng, lang (en|ar, default the UI language).
- Sign-in
- App token or company API key
- Permission
self.field_jobs | field.jobs.view | field.jobs.manage | field_setup.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
latrequiredrequired|numeric|between:-90,90lngrequiredrequired|numeric|between:-180,180langnullable|in:en,arExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/geocode/reverse?lat=1.5&lng=1.5&lang=en" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/jobsstatus (one or a list), branch_id, site_id, employee_id, q, date, from, to, flagged, flag,...status (one or a list), branch_id, site_id, employee_id, q, date, from, to, flagged, flag, per_page; each job has flagged_count.
- Sign-in
- App token or company API key
- Permission
field.jobs.view | field.jobs.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/jobs/summaryThe board's counts (per status, today, in progress, awaiting review, flagged) under the sa...The board's counts (per status, today, in progress, awaiting review, flagged) under the same filters as jobs.
- Sign-in
- App token or company API key
- Permission
field.jobs.view | field.jobs.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/summary" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/jobs/{job}- Sign-in
- App token or company API key
- Permission
field.jobs.view | field.jobs.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/jobs/{job}/events- Sign-in
- App token or company API key
- Permission
field.jobs.view | field.jobs.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/events" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/jobs/{job}/overtime- Sign-in
- App token or company API key
- Permission
field.overtime.view- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/overtime" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/overtimeOvertime from field jobs in the person's branches. status (pending by default, or all), wa...Overtime from field jobs in the person's branches. status (pending by default, or all), waiting_on_me, q, per_page.
- Sign-in
- App token or company API key
- Permission
field.overtime.view- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/overtime" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/overtime/{employeeRequest}/decidedecision approved or rejected, note (required to reject).decision approved or rejected, note (required to reject).
- Sign-in
- App token or company API key
- Permission
field.overtime.approve- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
decisionrequiredrequired|in:approved,rejectednotenullable|string|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/overtime/{employeeRequest}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"decision":"approved","note":"..."}' -
GET
/api/v1/app/companies/{company}/field/sites- Sign-in
- App token or company API key
- Permission
field.sites.view- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/sites" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/dispatchdate (Y-m-d, default today), branch_id, status, q.date (Y-m-d, default today), branch_id, status, q.
- Sign-in
- App token or company API key
- Permission
field.dispatch.view- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/dispatch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/jobs/{job}/candidatesWho could take the job, best first. q: find someone else of the branch by name or number.Who could take the job, best first. q: find someone else of the branch by name or number.
- Sign-in
- App token or company API key
- Permission
field.dispatch.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/candidates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/map-tilesWhere the app's maps take their pictures from (config/mihnaro.php).Where the app's maps take their pictures from (config/mihnaro.php).
- Sign-in
- App token or company API key
- Permission
field.dispatch.view | field.evidence.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/map-tiles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/jobstitle, description, branch_id, field_site_id, priority, planned_start_at, planned_end_at,...title, description, branch_id, field_site_id, priority, planned_start_at, planned_end_at, estimated_minutes, assignee_ids.
- Sign-in
- App token or company API key
- Permission
field.jobs.create- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/jobs/{job}- Sign-in
- App token or company API key
- Permission
field.jobs.edit | field.dispatch.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/jobs/{job}- Sign-in
- App token or company API key
- Permission
field.jobs.delete- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/jobs/{job}/decideaction approve | reject | cancel, note (required to reject or cancel).action approve | reject | cancel, note (required to reject or cancel).
- Sign-in
- App token or company API key
- Permission
field.jobs.review | field.jobs.cancel- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|in:approve,reject,cancelnotenullable|string|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"approve","note":"..."}' -
POST
/api/v1/app/companies/{company}/field/jobs/{job}/submit-without-departurereason (required): a job waiting for its departure photo goes to review without it.reason (required): a job waiting for its departure photo goes to review without it.
- Sign-in
- App token or company API key
- Permission
field.jobs.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonrequiredrequired|string|min:3|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/submit-without-departure" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}' -
POST
/api/v1/app/companies/{company}/field/jobs/{job}/request-uploadnote (optional): tells the job's employees to upload what is still on their phones.note (optional): tells the job's employees to upload what is still on their phones.
- Sign-in
- App token or company API key
- Permission
field.jobs.request_upload- Module
fsm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
notenullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/request-upload" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"note":"..."}' -
POST
/api/v1/app/companies/{company}/field/jobs/{job}/reassignemployee_id, note (optional).employee_id, note (optional).
- Sign-in
- App token or company API key
- Permission
field.dispatch.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integernotenullable|string|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/reassign" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"note":"..."}' -
POST
/api/v1/app/companies/{company}/field/jobs/bulk-canceljob_ids[], reason → {cancelled: [ids], skipped: [{id, reason: not_found|not_open}]}.job_ids[], reason → {cancelled: [ids], skipped: [{id, reason: not_found|not_open}]}.
- Sign-in
- App token or company API key
- Permission
field.jobs.cancel- Module
fsm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/bulk-cancel" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/jobs/{job}/overtimeDraft the job's overtime now (e.g. switched on after the job was submitted). 422 when the...Draft the job's overtime now (e.g. switched on after the job was submitted). 422 when the job doesn't qualify.
- Sign-in
- App token or company API key
- Permission
field.jobs.overtime- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/jobs/{job}/overtime" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/sitesname, address, latitude, longitude, radius_m (empty = the company default), active, branch...name, address, latitude, longitude, radius_m (empty = the company default), active, branch_id (new only).
- Sign-in
- App token or company API key
- Permission
field.sites.create- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/sites" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/sites/{site}- Sign-in
- App token or company API key
- Permission
field.sites.edit- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.siteinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/sites/{site}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/sites/{site}- Sign-in
- App token or company API key
- Permission
field.sites.delete- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.siteinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/sites/{site}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/customersq, branch_id, active, per_page.q, branch_id, active, per_page.
- Sign-in
- App token or company API key
- Permission
field.customers.view- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/customers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/customers- Sign-in
- App token or company API key
- Permission
field.customers.create- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/customers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/customers/{customer}- Sign-in
- App token or company API key
- Permission
field.customers.view- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.customerinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/customers/{customer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/customers/{customer}- Sign-in
- App token or company API key
- Permission
field.customers.edit- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.customerinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/customers/{customer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/customers/{customer}- Sign-in
- App token or company API key
- Permission
field.customers.delete- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.customerinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/customers/{customer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/evidence/{evidence}/voidreason (required).reason (required).
- Sign-in
- App token or company API key
- Permission
field.evidence.void- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonrequiredrequired|string|min:3|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/evidence/{evidence}/void" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}' -
GET
/api/v1/app/companies/{company}/field/devicesEvery phone key in the reviewer's branches.Every phone key in the reviewer's branches.
- Sign-in
- App token or company API key
- Permission
field.evidence.devices- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/devices/{key}/revoke- Sign-in
- App token or company API key
- Permission
field.evidence.devices- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.keystring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/devices/{key}/revoke" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/evidencejob_id, stage, employee_id, accepted, flag, voided, per_page.job_id, stage, employee_id, accepted, flag, voided, per_page.
- Sign-in
- App token or company API key
- Permission
field.evidence.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/evidence" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/evidence/{evidence}- Sign-in
- App token or company API key
- Permission
field.evidence.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/evidence/{evidence}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/evidence/{evidence}/c2paThe photo's C2PA (Content Credentials) copy: its status, validation, trust and assertions...The photo's C2PA (Content Credentials) copy: its status, validation, trust and assertions (docs/field-proof.md §22).
- Sign-in
- App token or company API key
- Permission
field.evidence.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/evidence/{evidence}/c2pa" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/evidence/{evidence}/c2pa/downloadThe C2PA copy itself (JPEG with the embedded, server-signed manifest), when signed, valid...The C2PA copy itself (JPEG with the embedded, server-signed manifest), when signed, valid and the photo not voided.
- Sign-in
- App token or company API key
- Permission
field.evidence.review- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/evidence/{evidence}/c2pa/download" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/techniciansq, availability, skill, zone, branch_id, per_page. meta.options has the skills and zones i...q, availability, skill, zone, branch_id, per_page. meta.options has the skills and zones in use.
- Sign-in
- App token or company API key
- Permission
field.technicians.view | field.technicians.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/technicians" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/technicians/export- Sign-in
- App token or company API key
- Permission
field.technicians.export- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/technicians/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/techniciansemployee_id, skills, zones, availability, available_until, work_days (0 = Sunday), day_sta...employee_id, skills, zones, availability, available_until, work_days (0 = Sunday), day_start, day_end, max_daily_jobs, notes.
- Sign-in
- App token or company API key
- Permission
field.technicians.create- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/technicians" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/technicians/{technician}- Sign-in
- App token or company API key
- Permission
field.technicians.view | field.technicians.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.technicianinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/technicians/{technician}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/technicians/{technician}- Sign-in
- App token or company API key
- Permission
field.technicians.edit- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.technicianinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/technicians/{technician}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/technicians/{technician}- Sign-in
- App token or company API key
- Permission
field.technicians.delete- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.technicianinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/technicians/{technician}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/partsq, category, branch_id, low (1 = at or under the minimum), active, per_page.q, category, branch_id, low (1 = at or under the minimum), active, per_page.
- Sign-in
- App token or company API key
- Permission
field.inventory.view | field.inventory.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/parts/export- Sign-in
- App token or company API key
- Permission
field.inventory.export- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/partssku, name, category, unit, unit_cost, supplier, min_stock, notes, active, branch_id.sku, name, category, unit, unit_cost, supplier, min_stock, notes, active, branch_id.
- Sign-in
- App token or company API key
- Permission
field.inventory.create- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/parts/{part}- Sign-in
- App token or company API key
- Permission
field.inventory.view | field.inventory.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/inventory/parts/{part}- Sign-in
- App token or company API key
- Permission
field.inventory.edit- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/inventory/parts/{part}- Sign-in
- App token or company API key
- Permission
field.inventory.delete- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/parts/{part}/receivelocation_id, quantity, reference, note.location_id, quantity, reference, note.
- Sign-in
- App token or company API key
- Permission
field.inventory.receive- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}/receive" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/parts/{part}/adjustlocation_id, counted, note (required).location_id, counted, note (required).
- Sign-in
- App token or company API key
- Permission
field.inventory.adjust- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}/adjust" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/parts/{part}/transferfrom_location_id, to_location_id, quantity, note.from_location_id, to_location_id, quantity, note.
- Sign-in
- App token or company API key
- Permission
field.inventory.transfer- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}/transfer" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/parts/{part}/issuelocation_id, job_id, quantity, employee_id, note.location_id, job_id, quantity, employee_id, note.
- Sign-in
- App token or company API key
- Permission
field.inventory.issue- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}/issue" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/parts/{part}/returnlocation_id, job_id, quantity, note.location_id, job_id, quantity, note.
- Sign-in
- App token or company API key
- Permission
field.inventory.issue- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.partinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/parts/{part}/return" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/locationsq, active, branch_id.q, active, branch_id.
- Sign-in
- App token or company API key
- Permission
field.inventory.view | field.inventory.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/locations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/inventory/locationsname, kind (warehouse, van, site), address, active, branch_id.name, kind (warehouse, van, site), address, active, branch_id.
- Sign-in
- App token or company API key
- Permission
field.inventory.locations- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/locations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/locations/{location}The location and what it holds.The location and what it holds.
- Sign-in
- App token or company API key
- Permission
field.inventory.view | field.inventory.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.locationinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/locations/{location}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/inventory/locations/{location}- Sign-in
- App token or company API key
- Permission
field.inventory.locations- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.locationinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/locations/{location}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/inventory/locations/{location}- Sign-in
- App token or company API key
- Permission
field.inventory.locations- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.locationinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/locations/{location}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/movementspart_id, location_id, job_id, type, from, to, branch_id, q, per_page.part_id, location_id, job_id, type, from, to, branch_id, q, per_page.
- Sign-in
- App token or company API key
- Permission
field.inventory.view | field.inventory.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/movements" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/movements/export- Sign-in
- App token or company API key
- Permission
field.inventory.export- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/movements/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/inventory/jobs/{job}/partsThe parts on a work order, net of what came back.The parts on a work order, net of what came back.
- Sign-in
- App token or company API key
- Permission
field.inventory.view | field.inventory.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/inventory/jobs/{job}/parts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehiclesq, status, driver_id, branch_id, per_page.q, status, driver_id, branch_id, per_page.
- Sign-in
- App token or company API key
- Permission
field.vehicles.view | field.vehicles.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehicles/alerts- Sign-in
- App token or company API key
- Permission
field.vehicles.view | field.vehicles.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/alerts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehicles/export- Sign-in
- App token or company API key
- Permission
field.vehicles.export- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/vehiclesplate_number, make, model, year, vin, status, driver_employee_id, odometer_km, notes, bran...plate_number, make, model, year, vin, status, driver_employee_id, odometer_km, notes, branch_id.
- Sign-in
- App token or company API key
- Permission
field.vehicles.create- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehicles/{vehicle}- Sign-in
- App token or company API key
- Permission
field.vehicles.view | field.vehicles.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/vehicles/{vehicle}- Sign-in
- App token or company API key
- Permission
field.vehicles.edit | field.vehicles.driver- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/vehicles/{vehicle}- Sign-in
- App token or company API key
- Permission
field.vehicles.delete- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/documents- Sign-in
- App token or company API key
- Permission
field.vehicles.view | field.vehicles.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/documents" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/documentsdocuments: type, number, expires_on, note. maintenance: done_on, kind, description, vendor...documents: type, number, expires_on, note. maintenance: done_on, kind, description, vendor, cost, odometer_km, next_due_on. fuel: filled_on, liters, cost, odometer_km, station, employee_id.
- Sign-in
- App token or company API key
- Permission
field.vehicles.documents- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/documents" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/documents/{row}- Sign-in
- App token or company API key
- Permission
field.vehicles.documents- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. rowinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/documents/{row}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/documents/{row}- Sign-in
- App token or company API key
- Permission
field.vehicles.documents- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. rowinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/documents/{row}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/maintenance- Sign-in
- App token or company API key
- Permission
field.vehicles.view | field.vehicles.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/maintenance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/maintenancedocuments: type, number, expires_on, note. maintenance: done_on, kind, description, vendor...documents: type, number, expires_on, note. maintenance: done_on, kind, description, vendor, cost, odometer_km, next_due_on. fuel: filled_on, liters, cost, odometer_km, station, employee_id.
- Sign-in
- App token or company API key
- Permission
field.vehicles.maintenance- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/maintenance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/maintenance/{row}- Sign-in
- App token or company API key
- Permission
field.vehicles.maintenance- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. rowinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/maintenance/{row}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/maintenance/{row}- Sign-in
- App token or company API key
- Permission
field.vehicles.maintenance- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. rowinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/maintenance/{row}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/fuel- Sign-in
- App token or company API key
- Permission
field.vehicles.view | field.vehicles.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/fuel" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/fueldocuments: type, number, expires_on, note. maintenance: done_on, kind, description, vendor...documents: type, number, expires_on, note. maintenance: done_on, kind, description, vendor, cost, odometer_km, next_due_on. fuel: filled_on, liters, cost, odometer_km, station, employee_id.
- Sign-in
- App token or company API key
- Permission
field.vehicles.fuel- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/fuel" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/fuel/{row}- Sign-in
- App token or company API key
- Permission
field.vehicles.fuel- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. rowinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/fuel/{row}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/field/vehicles/{vehicle}/fuel/{row}- Sign-in
- App token or company API key
- Permission
field.vehicles.fuel- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.vehicleinteger The record's ID. rowinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/vehicles/{vehicle}/fuel/{row}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/settings- Sign-in
- App token or company API key
- Permission
field_setup.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/settingsAny field_* setting (docs/field-proof.md); the others keep their value.Any field_* setting (docs/field-proof.md); the others keep their value.
- Sign-in
- App token or company API key
- Permission
field_setup.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/field/settings/branches/{branch}Every key: {company, branch (null = inherited), effective, source}.Every key: {company, branch (null = inherited), effective, source}.
- Sign-in
- App token or company API key
- Permission
field_setup.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/settings/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/field/settings/branches/{branch}Any field_* key; null or "inherit" takes it back to the company's value.Any field_* key; null or "inherit" takes it back to the company's value.
- Sign-in
- App token or company API key
- Permission
field_setup.manage- Module
fsm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/field/settings/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
financial-transactions 8 endpoints
-
GET
/api/v1/app/companies/{company}/financial-transactionsFinancial transactions in my scope: month, employee_id, type (earning | deduction), off_cy...Financial transactions in my scope: month, employee_id, type (earning | deduction), off_cycle.
- Sign-in
- App token or company API key
- Permission
payroll.transactions.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/financial-transactions/{transaction}One transaction in my scope, with the employee and its attachments' names.One transaction in my scope, with the employee and its attachments' names.
- Sign-in
- App token or company API key
- Permission
payroll.transactions.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.transactioninteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions/{transaction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/financial-transactionsAs the Add new financial transaction page: effective_date (or month), off_cycle (with paid...As the Add new financial transaction page: effective_date (or month), off_cycle (with paid_cash, deduct_tax, amount_type total|net, mark_paid), and attachment or attachments[] files.
- Sign-in
- App token or company API key
- Permission
payroll.transactions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integertransaction_type_idnullable|integer|exists:transaction_types,idtyperequired_without:transaction_type_id|nullable|in:earning,deductioncategoryrequired_without:transaction_type_id|nullable|in:bonus,commission,overtime,expense,per_diem,air_ticket,penalty,otheramountrequiredrequired|numeric|min:0.01monthrequired_without:effective_date|nullable|date_format:Y-meffective_datenullable|date_format:Y-m-ddescriptionnullable|string|'max:' . \App\Support\Limits::chars(255)amount_typenullable|in:total,netExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"transaction_type_id":1,"type":"earning","category":"bonus","amount":1.5,"month":"2026-11-01","effective_date":"2026-11-01","description":"...","amount_type":"total"}' -
PUT
/api/v1/app/companies/{company}/financial-transactions/{transaction}Edit an unpaid transaction added by HR: the fields of storeTransaction; new files join its...Edit an unpaid transaction added by HR: the fields of storeTransaction; new files join its attachments.
- Sign-in
- App token or company API key
- Permission
payroll.transactions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.transactioninteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integertransaction_type_idnullable|integer|exists:transaction_types,idtyperequired_without:transaction_type_id|nullable|in:earning,deductioncategoryrequired_without:transaction_type_id|nullable|in:bonus,commission,overtime,expense,per_diem,air_ticket,penalty,otheramountrequiredrequired|numeric|min:0.01monthrequired_without:effective_date|nullable|date_format:Y-meffective_datenullable|date_format:Y-m-ddescriptionnullable|string|'max:' . \App\Support\Limits::chars(255)amount_typenullable|in:total,netExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions/{transaction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"transaction_type_id":1,"type":"earning","category":"bonus","amount":1.5,"month":"2026-11-01","effective_date":"2026-11-01","description":"...","amount_type":"total"}' -
DELETE
/api/v1/app/companies/{company}/financial-transactions/{transaction}- Sign-in
- App token or company API key
- Permission
payroll.transactions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.transactioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions/{transaction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/financial-transactions/bulk-deleteids: unpaid, regular-payroll transactions of employees in payroll.manage scope; returns ho...ids: unpaid, regular-payroll transactions of employees in payroll.manage scope; returns how many were deleted.
- Sign-in
- App token or company API key
- Permission
payroll.transactions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
idsrequiredrequired|array|min:1ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions/bulk-delete" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ids":[]}' -
POST
/api/v1/app/companies/{company}/financial-transactions/{transaction}/next-month- Sign-in
- App token or company API key
- Permission
payroll.transactions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.transactioninteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions/{transaction}/next-month" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/financial-transactions/amortizedemployee_id, type earning|deduction, amount, months (2-60), start_month (Y-m), description...employee_id, type earning|deduction, amount, months (2-60), start_month (Y-m), description.
- Sign-in
- App token or company API key
- Permission
payroll.expenses.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integertyperequiredrequired|in:earning,deductionamountrequiredrequired|numeric|gt:0monthsrequiredrequired|integer|min:2|max:60start_monthrequiredrequired|date_format:Y-mdescriptionrequiredrequired|string|'max:' . \App\Support\Limits::chars(190)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/financial-transactions/amortized" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"type":"earning","amount":1.5,"months":1,"start_month":"2026-11-01","description":"..."}'
general 2 endpoints
-
GET
/api/v1/app/companies/{company}/{kind}/{id}/comments- Sign-in
- App token or company API key
- Permission
self.requests.view | self.approvals.decide | requests.view | requests.manage | self.leaves.view | leaves.view | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · requests|leaves The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/{kind}/{id}/comments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/{kind}/{id}/comments- Sign-in
- App token or company API key
- Permission
self.requests.view | self.approvals.decide | requests.view | requests.manage | self.leaves.view | leaves.view | leaves.manage- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · requests|leaves The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/{kind}/{id}/comments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
general-factor-templates 3 endpoints
-
POST
/api/v1/app/companies/{company}/general-factor-templatesname {en, ar}, branch_ids, factors [{name {en, ar}, weight}].name {en, ar}, branch_ids, factors [{name {en, ar}, weight}].
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/general-factor-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/general-factor-templates/{template}name {en, ar}, branch_ids, factors [{name {en, ar}, weight}].name {en, ar}, branch_ids, factors [{name {en, ar}, weight}].
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/general-factor-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/general-factor-templates/{template}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/general-factor-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
geolocations 5 endpoints
-
GET
/api/v1/app/companies/{company}/geolocations- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/geolocations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/geolocations- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/geolocations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/geolocations/{location}Send only what changes.Send only what changes.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.locationinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/geolocations/{location}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/geolocations/{location}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.locationinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/geolocations/{location}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/geolocations/{location}/bulkaction assign|unassign|replace: this location for every active employee in reach (attendan...action assign|unassign|replace: this location for every active employee in reach (attendance.manage).
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.locationinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|in:assign,unassign,replaceExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/geolocations/{location}/bulk" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"assign"}'
goals 3 endpoints
-
POST
/api/v1/app/companies/{company}/goalsemployee_id or employee_ids (default: me), title, description, due_date.employee_id or employee_ids (default: me), title, description, due_date.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idnullable|integeremployee_idsnullable|arrayemployee_ids.*integertitlerequiredrequired|string|max:200descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)due_datenullable|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/goals" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"employee_ids":[],"title":"...","description":"...","due_date":"2026-11-01"}' -
PATCH
/api/v1/app/companies/{company}/goals/{goal}progress, status.progress, status.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.goalinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/goals/{goal}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/goals/{goal}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.goalinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/goals/{goal}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
help 1 endpoint
-
GET
/api/v1/app/companies/{company}/helpThe help center: the topics the person may use, in their language (docs/help.md).The help center: the topics the person may use, in their language (docs/help.md).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/help" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
holiday-calendar 1 endpoint
-
GET
/api/v1/app/companies/{company}/holiday-calendarGET holiday-calendar?month=YYYY-MMGET holiday-calendar?month=YYYY-MM
- Sign-in
- App token or company API key
- Permission
self.holiday_calendar | leaves.view | employees.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/holiday-calendar" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
holidays 4 endpoints
-
GET
/api/v1/app/companies/{company}/holidaysThe year's holidays (?year, this year by default).The year's holidays (?year, this year by default).
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/holidays" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/holidays- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)daterequiredrequired|date|unique:holidays,dateend_datenullable|date|after_or_equal:datereligionsnullable|arrayreligions.*in:muslim,christian,hindu,buddhist,sikh,otherExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/holidays" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"date":"2026-11-01","end_date":"2026-11-01","religions":[]}' -
PATCH
/api/v1/app/companies/{company}/holidays/{holiday}Send only what changes.Send only what changes.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.holidayinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/holidays/{holiday}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/holidays/{holiday}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.holidayinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/holidays/{holiday}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
import 3 endpoints
-
GET
/api/v1/app/companies/{company}/import- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/import" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/import/{type}/templateThe CSV template (language en|ar); existing=1 fills it with the current data. Preview is u...The CSV template (language en|ar); existing=1 fills it with the current data. Preview is upload without commit.
- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typestring The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/import/{type}/template" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/import/{type}- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typestring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
filerequiredrequired|file|max:10240|extensions:csv,xlsxmodenullable|in:create,updatelanguagenullable|in:en,armapnullable|arraycommitsometimes|booleanoptionsnullable|arrayExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/import/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" \ -F "mode=create" \ -F "language=en" \ -F "map=..." \ -F "commit=1" \ -F "options=..."
imported-sheets 1 endpoint
-
GET
/api/v1/app/companies/{company}/imported-sheets- Sign-in
- App token or company API key
- Permission
employees.import- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/imported-sheets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
insurance-members 1 endpoint
-
DELETE
/api/v1/app/companies/{company}/insurance-members/{member}- Sign-in
- App token or company API key
- Permission
payroll.insurance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.memberinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-members/{member}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
insurance-policies 6 endpoints
-
GET
/api/v1/app/companies/{company}/insurance-policiesPolicies, latest expiry first, each with its members in my scope; active=1 keeps the polic...Policies, latest expiry first, each with its members in my scope; active=1 keeps the policies in force today.
- Sign-in
- App token or company API key
- Permission
payroll.insurance.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/insurance-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll.insurance.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/insurance-policies/{policy}/members- Sign-in
- App token or company API key
- Permission
payroll.insurance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerfamily_member_idnullable|exists:family_members,idoffline_insurance_idnullable|string|max:60start_datenullable|dateend_datenullable|date|after_or_equal:start_dateadult_dependentsnullable|integer|min:0|max:20minor_dependentsnullable|integer|min:0|max:20custom_costnullable|required_if:custom_setup,1|numeric|min:0monthly_deductionnullable|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-policies/{policy}/members" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"family_member_id":"...","offline_insurance_id":"...","start_date":"2026-11-01","end_date":"2026-11-01","adult_dependents":1,"minor_dependents":1,"custom_cost":1.5,"monthly_deduction":1.5}' -
POST
/api/v1/app/companies/{company}/insurance-policies- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
insurerrequiredrequired|string|max:120policy_numbernullable|string|max:60start_daterequiredrequired|dateexpiry_daterequiredrequired|date|after:start_datecost_adultrequiredrequired|numeric|min:0cost_minorrequiredrequired|numeric|min:0currency_adultnullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLcurrency_minornullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLbranch_idnullable|exists:branches,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-policies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"insurer":"...","policy_number":"...","start_date":"2026-11-01","expiry_date":"2026-11-01","cost_adult":1.5,"cost_minor":1.5,"currency_adult":"AED","currency_minor":"AED","branch_id":"..."}' -
PUT
/api/v1/app/companies/{company}/insurance-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
insurerrequiredrequired|string|max:120policy_numbernullable|string|max:60start_daterequiredrequired|dateexpiry_daterequiredrequired|date|after:start_datecost_adultrequiredrequired|numeric|min:0cost_minorrequiredrequired|numeric|min:0currency_adultnullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLcurrency_minornullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLbranch_idnullable|exists:branches,idExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"insurer":"...","policy_number":"...","start_date":"2026-11-01","expiry_date":"2026-11-01","cost_adult":1.5,"cost_minor":1.5,"currency_adult":"AED","currency_minor":"AED","branch_id":"..."}' -
DELETE
/api/v1/app/companies/{company}/insurance-policies/{policy}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policyinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/insurance-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
integrations 7 endpoints
-
GET
/api/v1/app/companies/{company}/integrations/marketplaceGET integrations/marketplace?category=&active=active|inactive&q=: the connector catalogue...GET integrations/marketplace?category=&active=active|inactive&q=: the connector catalogue and each one's state.
- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/integrations/marketplace" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/integrations/connections- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/integrations/connections" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/integrations/connections/{provider}/mode- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/integrations/connections/{provider}/mode" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/integrations/connections/{provider}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
appsometimes|in:own,platformclient_idsometimes|nullable|string|max:190client_secretsometimes|nullable|string|max:500tenantsometimes|nullable|string|max:64|regex:/^[A-Za-z0-9.-]+$/organizationsometimes|nullable|digits_between:3,20Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/integrations/connections/{provider}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"app":"own","client_id":"...","client_secret":"...","tenant":"...","organization":"..."}' -
POST
/api/v1/app/companies/{company}/integrations/connections/{provider}/test- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/integrations/connections/{provider}/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/integrations/connections/{provider}- Sign-in
- App token or company API key
- Permission
integrations.manage.*- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.providerstring · zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/integrations/connections/{provider}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
job-grade-levels 1 endpoint
-
DELETE
/api/v1/app/companies/{company}/job-grade-levels/{level}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.levelinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/job-grade-levels/{level}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
job-grades 3 endpoints
-
GET
/api/v1/app/companies/{company}/job-gradesThe job grades with their ranges, levels, leave days, headcount, average, compa-ratio and...The job grades with their ranges, levels, leave days, headcount, average, compa-ratio and who is outside the range.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/job-grades" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/job-grades/{grade}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.gradeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
ideal_compa_ratiorequiredrequired|numeric|between:0.5,1.5benefitsnullable|string|max:2000leavearrayleave.*nullable|numeric|min:0|max:365Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/job-grades/{grade}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ideal_compa_ratio":1.5,"benefits":"...","leave":[]}' -
POST
/api/v1/app/companies/{company}/job-grades/{grade}/levels- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.gradeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)rankrequiredrequired|integer|min:1|max:100salaryrequiredrequired|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/job-grades/{grade}/levels" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_ar":"...","name_en":"...","rank":1,"salary":1.5}'
key-positions 7 endpoints
-
GET
/api/v1/app/companies/{company}/key-positions- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/key-positionstitle {en, ar}, position_id, department_id, holder_id, risk_of_loss, impact, notes.title {en, ar}, position_id, department_id, holder_id, risk_of_loss, impact, notes.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.positions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/key-positions/{position}title {en, ar}, position_id, department_id, holder_id, risk_of_loss, impact, notes.title {en, ar}, position_id, department_id, holder_id, risk_of_loss, impact, notes.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.positions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.positioninteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions/{position}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/key-positions/{position}- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.positions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.positioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions/{position}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/key-positions/{position}/successorsemployee_id, readiness, development_plan.employee_id, readiness, development_plan.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.successors.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.positioninteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integer|exists:employees,id|Rule::notIn(array_filter([$position->holder_id]))readinessrequiredrequired|in:ready_now,one_two_years,three_plus_yearsdevelopment_plannullable|string|max:255Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions/{position}/successors" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"readiness":"ready_now","development_plan":"..."}' -
GET
/api/v1/app/companies/{company}/key-positions/{position}/suggestionslimit (1–50, default 10).limit (1–50, default 10).
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.positioninteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions/{position}/suggestions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/key-positions/{position}/suggestions/{employee}/explain- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.positioninteger The record's ID. employeeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/key-positions/{position}/suggestions/{employee}/explain" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
leave-adjustments 3 endpoints
-
GET
/api/v1/app/companies/{company}/leave-adjustmentsZenHR Manage adjustments / Manage moved balances (kind=moved): type, year, employee; 50 a...ZenHR Manage adjustments / Manage moved balances (kind=moved): type, year, employee; 50 a page.
- Sign-in
- App token or company API key
- Permission
leaves.adjustments.view | leaves.moved_balances.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
kindnullable|in:adjustments,movedtypenullable|integeryearnullable|integeremployeenullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-adjustments?kind=adjustments&type=1&year=1&employee=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/leave-adjustments- Sign-in
- App token or company API key
- Permission
leaves.adjustments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerleave_type_idrequiredrequired|exists:leave_types,idyearrequiredrequired|integer|between:2000,2100daysrequiredrequired|numeric|not_in:0|between:-365,365reasonrequiredrequired|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-adjustments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"leave_type_id":"...","year":1,"days":1.5,"reason":"..."}' -
DELETE
/api/v1/app/companies/{company}/leave-adjustments/{adjustment}- Sign-in
- App token or company API key
- Permission
leaves.adjustments.manage | leaves.moved_balances.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.adjustmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-adjustments/{adjustment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
leave-balance-history 1 endpoint
-
GET
/api/v1/app/companies/{company}/leave-balance-historyZenHR history (docs/zenhr-import.md): kind days (day analysis) or punches (punch details)...ZenHR history (docs/zenhr-import.md): kind days (day analysis) or punches (punch details) for attendance.view, balances (vacation balances by year) for leaves.manage. Filters: employee, from, to, status (days), type, year (balances).
- Sign-in
- App token or company API key
- Permission
leaves.balance_corrections.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeenullable|integerfromnullable|date_format:Y-m-dtonullable|date_format:Y-m-dstatusnullable|in:present,absent,partialtypenullable|integeryearnullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-balance-history?employee=1&from=2026-11-01&to=2026-11-01&status=present" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
leave-balances 1 endpoint
-
POST
/api/v1/app/companies/{company}/leave-balances/moveMoves unused days of a type into next year: leave_type_id, year, max_days (leaves.moved_ba...Moves unused days of a type into next year: leave_type_id, year, max_days (leaves.moved_balances.manage over the company).
- Sign-in
- App token or company API key
- Permission
leaves.moved_balances.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
leave_type_idrequiredrequired|integeryearrequiredrequired|integer|between:2000,2100max_daysrequiredrequired|numeric|min:0|max:365Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-balances/move" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"leave_type_id":1,"year":1,"max_days":1.5}'
leave-encashments 3 endpoints
-
GET
/api/v1/app/companies/{company}/leave-encashments- Sign-in
- App token or company API key
- Permission
leaves.encashments.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-encashments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/leave-encashments- Sign-in
- App token or company API key
- Permission
leaves.encashments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerattachmentnullable|file|max:10240|mimes:pdf,jpg,jpeg,pngleave_type_idrequiredrequired|integer|exists:leave_types,iddaysrequiredrequired|numeric|min:0.5|max:365notesnullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-encashments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "employee_id=1" \ -F "[email protected]" \ -F "leave_type_id=1" \ -F "days=1.5" \ -F "notes=..." -
DELETE
/api/v1/app/companies/{company}/leave-encashments/{encashment}- Sign-in
- App token or company API key
- Permission
leaves.encashments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.encashmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-encashments/{encashment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
leave-types 6 endpoints
-
PUT PATCH
/api/v1/app/companies/{company}/leave-types/{type}/discipline- Sign-in
- App token or company API key
- Permission
discipline_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-types/{type}/discipline" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/leave-types/{leaveType}/applyGives a leave type to employees: scope all|selected, employee_ids, entitlement_days, open_...Gives a leave type to employees: scope all|selected, employee_ids, entitlement_days, open_balance, balance_year.
- Sign-in
- App token or company API key
- Permission
leaves.balance_corrections.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveTypeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
scoperequiredrequired|in:all,selectedemployee_idsrequired_if:scope,selected|arrayemployee_ids.*integerentitlement_daysnullable|numeric|min:0|max:365open_balancenullable|numeric|min:-365|max:365balance_yearnullable|integer|min:2000|max:2100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-types/{leaveType}/apply" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"scope":"all","employee_ids":[],"entitlement_days":1.5,"open_balance":1.5,"balance_year":1}' -
GET
/api/v1/app/companies/{company}/leave-typesLeave types, of one ?category, with how many employees have each.Leave types, of one ?category, with how many employees have each.
- Sign-in
- App token or company API key
- Permission
leave_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/leave-typesA new type: category and the whole form, as on the screen.A new type: category and the whole form, as on the screen.
- Sign-in
- App token or company API key
- Permission
leave_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)codenullable|alpha_dash|max:30|unique:leave_typescolornullable|regex:/^#[0-9a-fA-F]{6}$/iconnullable|in:⏳,✈️,❄️,🌴,🏖️,🏠,👋,📅,📚,🕗,🤒,🤓,🤰,🚘gl_identifiernullable|string|max:50balance_typenullable|in:contractual,normal,first_requestentitlement_daysnullable|numeric|min:0|max:365entitlement_hoursnullable|numeric|min:0|max:200allowed_after_valuenullable|integer|min:0|max:3650allowed_after_unitnullable|in:day,month,yearmax_consecutive_daysnullable|integer|min:1|max:365min_consecutive_daysnullable|integer|min:1|max:365max_consecutive_hoursnullable|numeric|min:0.25|max:24min_consecutive_hoursnullable|numeric|min:0.25|max:24min_notice_daysnullable|integer|min:0|max:365notice_slicesnullable|arraynotice_slices.*.fromnullable|numeric|min:0notice_slices.*.tonullable|numeric|min:0notice_slices.*.noticenullable|integer|min:0|max:365max_weekend_excludenullable|integer|min:0|max:365exceed_bynullable|numeric|min:0|max:365accrual_ratenullable|in:daily,monthlybalance_capnullable|numeric|min:0|max:999compensation_percentnullable|numeric|min:0|max:100compensation_allowance_idsnullable|arraycompensation_allowance_ids.*integer|exists:transaction_types,idbalance_setupsnullable|arraybalance_setups.*.fromnullable|integer|min:0|max:60balance_setups.*.tonullable|integer|min:0|max:60balance_setups.*.opennullable|numeric|min:0|max:365balance_setups.*.carrynullable|numeric|min:0|max:365encash_payrollnullable|in:in_payroll,off_cycleattachment_afternullable|numeric|min:0|max:999deduction_percentnullable|numeric|min:0|$hourly && ($input['deduction_type'] ?? null) === 'fixed' ? 'max:100000000' : 'm...deduction_typenullable|in:fixed,pro_ratagrace_amountnullable|integer|min:0|max:10000grace_intervalnullable|in:day,week,monthdisciplinary_type_idnullable|integerrequest_limitnullable|integer|min:1|max:100request_limit_typenullable|in:service,per_year,nonerulesnullable|arrayrules.*.typenullable|in:gender,religion,nationality,department,section,work_location,work_type,job_role,hierarchy_group,business_unit,division,segment,main_projectrules.*.valuesnullable|arrayminutes_allowednullable|integer|min:1|max:100000minutes_allowed_pernullable|in:day,week,monthtransactions_allowednullable|integer|min:1|max:1000transactions_allowed_pernullable|in:day,week,monthhourly_deductionsnullable|arrayhourly_deductions.*.leave_type_idnullable|integer|exists:leave_types,idhourly_deductions.*.percentnullable|numeric|min:0|max:100repeat_everynullable|integer|min:1|max:120repeat_unitnullable|in:month,year,oncesick_slicesnullable|arraysick_slices.*.fromnullable|integer|min:1|max:366sick_slices.*.tonullable|integer|min:1|max:366sick_slices.*.deductionnullable|numeric|min:0|max:100applies_tonullable|in:all,assignedeffective_datenullable|datebalance_update_typenullable|in:current,newExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"code":"...","color":"...","icon":"⏳","gl_identifier":"...","balance_type":"contractual","entitlement_days":1.5,"entitlement_hours":1.5,"allowed_after_value":1,"allowed_after_unit":"day","max_consecutive_days":1,"min_consecutive_days":1,"max_consecutive_hours":1.5,"min_consecutive_hours":1.5,"min_notice_days":1,"notice_slices":[],"max_weekend_exclude":1,"exceed_by":1.5,"accrual_rate":"daily","balance_cap":1.5,"compensation_percent":1.5,"compensation_allowance_ids":[],"balance_setups":[],"encash_payroll":"in_payroll","attachment_after":1.5,"deduction_percent":1.5,"deduction_type":"fixed","grace_amount":1,"grace_interval":"day","disciplinary_type_id":1,"request_limit":1,"request_limit_type":"service","rules":[],"minutes_allowed":1,"minutes_allowed_per":"day","transactions_allowed":1,"transactions_allowed_per":"day","hourly_deductions":[],"repeat_every":1,"repeat_unit":"month","sick_slices":[],"applies_to":"all","effective_date":"2026-11-01","balance_update_type":"current"}' -
PUT
/api/v1/app/companies/{company}/leave-types/{leaveType}A type's whole form, as on the screen (balance_update_type and effective_date for a new ba...A type's whole form, as on the screen (balance_update_type and effective_date for a new balance from a date).
- Sign-in
- App token or company API key
- Permission
leave_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveTypeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(100)codenullable|alpha_dash|max:30|unique:leave_typescolornullable|regex:/^#[0-9a-fA-F]{6}$/iconnullable|in:⏳,✈️,❄️,🌴,🏖️,🏠,👋,📅,📚,🕗,🤒,🤓,🤰,🚘gl_identifiernullable|string|max:50balance_typenullable|in:contractual,normal,first_requestentitlement_daysnullable|numeric|min:0|max:365entitlement_hoursnullable|numeric|min:0|max:200allowed_after_valuenullable|integer|min:0|max:3650allowed_after_unitnullable|in:day,month,yearmax_consecutive_daysnullable|integer|min:1|max:365min_consecutive_daysnullable|integer|min:1|max:365max_consecutive_hoursnullable|numeric|min:0.25|max:24min_consecutive_hoursnullable|numeric|min:0.25|max:24min_notice_daysnullable|integer|min:0|max:365notice_slicesnullable|arraynotice_slices.*.fromnullable|numeric|min:0notice_slices.*.tonullable|numeric|min:0notice_slices.*.noticenullable|integer|min:0|max:365max_weekend_excludenullable|integer|min:0|max:365exceed_bynullable|numeric|min:0|max:365accrual_ratenullable|in:daily,monthlybalance_capnullable|numeric|min:0|max:999compensation_percentnullable|numeric|min:0|max:100compensation_allowance_idsnullable|arraycompensation_allowance_ids.*integer|exists:transaction_types,idbalance_setupsnullable|arraybalance_setups.*.fromnullable|integer|min:0|max:60balance_setups.*.tonullable|integer|min:0|max:60balance_setups.*.opennullable|numeric|min:0|max:365balance_setups.*.carrynullable|numeric|min:0|max:365encash_payrollnullable|in:in_payroll,off_cycleattachment_afternullable|numeric|min:0|max:999deduction_percentnullable|numeric|min:0|$hourly && ($input['deduction_type'] ?? null) === 'fixed' ? 'max:100000000' : 'm...deduction_typenullable|in:fixed,pro_ratagrace_amountnullable|integer|min:0|max:10000grace_intervalnullable|in:day,week,monthdisciplinary_type_idnullable|integerrequest_limitnullable|integer|min:1|max:100request_limit_typenullable|in:service,per_year,nonerulesnullable|arrayrules.*.typenullable|in:gender,religion,nationality,department,section,work_location,work_type,job_role,hierarchy_group,business_unit,division,segment,main_projectrules.*.valuesnullable|arrayminutes_allowednullable|integer|min:1|max:100000minutes_allowed_pernullable|in:day,week,monthtransactions_allowednullable|integer|min:1|max:1000transactions_allowed_pernullable|in:day,week,monthhourly_deductionsnullable|arrayhourly_deductions.*.leave_type_idnullable|integer|exists:leave_types,idhourly_deductions.*.percentnullable|numeric|min:0|max:100repeat_everynullable|integer|min:1|max:120repeat_unitnullable|in:month,year,oncesick_slicesnullable|arraysick_slices.*.fromnullable|integer|min:1|max:366sick_slices.*.tonullable|integer|min:1|max:366sick_slices.*.deductionnullable|numeric|min:0|max:100applies_tonullable|in:all,assignedeffective_datenullable|datebalance_update_typenullable|in:current,newExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-types/{leaveType}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"code":"...","color":"...","icon":"⏳","gl_identifier":"...","balance_type":"contractual","entitlement_days":1.5,"entitlement_hours":1.5,"allowed_after_value":1,"allowed_after_unit":"day","max_consecutive_days":1,"min_consecutive_days":1,"max_consecutive_hours":1.5,"min_consecutive_hours":1.5,"min_notice_days":1,"notice_slices":[],"max_weekend_exclude":1,"exceed_by":1.5,"accrual_rate":"daily","balance_cap":1.5,"compensation_percent":1.5,"compensation_allowance_ids":[],"balance_setups":[],"encash_payroll":"in_payroll","attachment_after":1.5,"deduction_percent":1.5,"deduction_type":"fixed","grace_amount":1,"grace_interval":"day","disciplinary_type_id":1,"request_limit":1,"request_limit_type":"service","rules":[],"minutes_allowed":1,"minutes_allowed_per":"day","transactions_allowed":1,"transactions_allowed_per":"day","hourly_deductions":[],"repeat_every":1,"repeat_unit":"month","sick_slices":[],"applies_to":"all","effective_date":"2026-11-01","balance_update_type":"current"}' -
DELETE
/api/v1/app/companies/{company}/leave-types/{leaveType}- Sign-in
- App token or company API key
- Permission
leave_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveTypeinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leave-types/{leaveType}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
leaves 6 endpoints
-
POST
/api/v1/app/companies/{company}/leavesAsk for time off (multipart with an attachment when the type needs one).Ask for time off (multipart with an attachment when the type needs one).
- Sign-in
- App token or company API key
- Permission
self.leaves.request- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
attachmentnullable|file|max:10240|mimes:pdf,jpg,jpeg,pnghalf_daynullable|booleanadvance_requestednullable|booleanstart_timerequiredrequiredend_timerequiredrequiredend_daterequiredrequiredleave_type_idrequiredrequired|exists:leave_types,idstart_daterequiredrequired|datereasonnullable|string|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leaves" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" \ -F "half_day=1" \ -F "advance_requested=1" \ -F "start_time=..." \ -F "end_time=..." \ -F "end_date=..." \ -F "leave_type_id=..." \ -F "start_date=2026-11-01" \ -F "reason=..." -
GET
/api/v1/app/companies/{company}/leaves/{leave}- Sign-in
- App token or company API key
- Permission
self.leaves.view | self.approvals.decide | leaves.view | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leaves/{leave}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/leaves/{leave}/attachmentGET leaves/{id}/attachment: the file, for the employee or whoever sees their leaves.GET leaves/{id}/attachment: the file, for the employee or whoever sees their leaves.
- Sign-in
- App token or company API key
- Permission
self.leaves.view | self.approvals.decide | leaves.view | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leaves/{leave}/attachment" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/leaves/{leave}/approval-cycleGET leaves/{id}/approval-cycle: ZenHR's "Approval Cycle" of a time off (ApprovalCycle), fo...GET leaves/{id}/approval-cycle: ZenHR's "Approval Cycle" of a time off (ApprovalCycle), for the employee, whoever sees their leaves, or an approver.
- Sign-in
- App token or company API key
- Permission
self.leaves.view | self.approvals.decide | leaves.view | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leaves/{leave}/approval-cycle" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/leaves/{leave}/withdraw- Sign-in
- App token or company API key
- Permission
self.leaves.cancel | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leaves/{leave}/withdraw" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/leaves/{leave}/decideDecide the step it waits on: decision approved|rejected, decision_note, non_deduct (leaves...Decide the step it waits on: decision approved|rejected, decision_note, non_deduct (leaves.manage).
- Sign-in
- App token or company API key
- Permission
self.approvals.decide | requests.manage | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.leaveinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/leaves/{leave}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
legal-rules 3 endpoints
-
GET
/api/v1/app/companies/{company}/legal-rules- Sign-in
- App token or company API key
- Permission
payroll_setup.manage | legal_rules.validate- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/legal-rules" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/legal-rules/{rule}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage | legal_rules.validate- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.rulestring · overtime_to_leave|rest_day_overtime|holiday_overtime|loan_settlement_deduction|eos_formula|tax_scale|day_divisor The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
validated_byrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)referencerequiredrequired|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/legal-rules/{rule}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"validated_by":"...","reference":"..."}' -
DELETE
/api/v1/app/companies/{company}/legal-rules/{rule}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage | legal_rules.validate- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.rulestring · overtime_to_leave|rest_day_overtime|holiday_overtime|loan_settlement_deduction|eos_formula|tax_scale|day_divisor The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/legal-rules/{rule}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
letter-templates 9 endpoints
-
GET
/api/v1/app/companies/{company}/letter-templatesLetter templates: all for letters.manage, else the self-service ones I can generate.Letter templates: all for letters.manage, else the self-service ones I can generate.
- Sign-in
- App token or company API key
- Permission
self.letters.request | letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/letter-templates/{template}One template with its body (letters.manage).One template with its body (letters.manage).
- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/letter-templates/placeholdersWhat the editor can insert: the {placeholders} with their names, and the active e-signatur...What the editor can insert: the {placeholders} with their names, and the active e-signatures as {signature:ID}.
- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/placeholders" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/letter-templates/imagesA picture for a template, uploaded into Mihnaro (file, or data as a data: URL or base64 wi...A picture for a template, uploaded into Mihnaro (file, or data as a data: URL or base64 with name); put its url in the body as <img src>.
- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/images" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/letter-templates/previewA body as its letter prints, before saving: body, language, employee_id (none: placeholder...A body as its letter prints, before saving: body, language, employee_id (none: placeholders shown by name); format=pdf for the PDF.
- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
bodynullable|string|max:200000languagenullable|in:ar,enemployee_idnullable|integeraddressed_tonullable|string|'max:' . \App\Support\Limits::chars(150)effective_datenullable|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/preview" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"body":"...","language":"ar","employee_id":1,"addressed_to":"...","effective_date":"2026-11-01"}' -
POST
/api/v1/app/companies/{company}/letter-templates- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)descriptionnullable|arraydescription.ennullable|string|'max:' . \App\Support\Limits::chars(1000)description.arnullable|string|'max:' . \App\Support\Limits::chars(1000)languagerequiredrequired|in:ar,enletter_category_idnullable|exists:letter_categories,idbodyrequiredrequired|string|max:200000direct_accessnullable|in:no,yes,notify,approvalconfirmation_daysnullable|integer|min:1|max:365branch_idsnullable|arraybranch_ids.*integer|exists:branches,idnotify_employee_idsnullable|arraynotify_employee_ids.*integer|exists:employees,idfinancialsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":{"en":"...","ar":"..."},"language":"ar","letter_category_id":"...","body":"...","direct_access":"no","confirmation_days":1,"branch_ids":[],"notify_employee_ids":[],"financial":true}' -
PATCH PUT
/api/v1/app/companies/{company}/letter-templates/{template}- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/letter-templates/{template}/duplicate- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/{template}/duplicate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/letter-templates/{template}/favorite- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letter-templates/{template}/favorite" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
letters 7 endpoints
-
GET
/api/v1/app/companies/{company}/lettersLetters I may see (mine once released, and those in my letters scope): status, employee_id...Letters I may see (mine once released, and those in my letters scope): status, employee_id.
- Sign-in
- App token or company API key
- Permission
self.letters.view | letters.view | letters.manage | letters.issue | letters.decide- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/letters/{letter}A letter with its text; opening my own marks it seen.A letter with its text; opening my own marks it seen.
- Sign-in
- App token or company API key
- Permission
self.letters.view | letters.view | letters.manage | letters.issue | letters.decide- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.letterinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters/{letter}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/letters/{letter}/pdfThe letter as a PDF file (application/pdf), in the letter's language.The letter as a PDF file (application/pdf), in the letter's language.
- Sign-in
- App token or company API key
- Permission
self.letters.download | letters.view | letters.manage- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.letterinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters/{letter}/pdf" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/letters/generateGenerate a self-service letter for myself.Generate a self-service letter for myself.
- Sign-in
- App token or company API key
- Permission
self.letters.request | letters.manage- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
letter_template_idrequiredrequired|integeraddressed_tonullable|string|max:150effective_datenullable|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters/generate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"letter_template_id":1,"addressed_to":"...","effective_date":"2026-11-01"}' -
POST
/api/v1/app/companies/{company}/letters/{letter}/confirm- Sign-in
- App token or company API key
- Permission
self.letters.request | letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.letterinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters/{letter}/confirm" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/lettersIssue a letter from a template to an employee in scope (letters.manage).Issue a letter from a template to an employee in scope (letters.manage).
- Sign-in
- App token or company API key
- Permission
letters.issue- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerletter_template_idrequiredrequired|integeraddressed_tonullable|string|max:150effective_datenullable|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"letter_template_id":1,"addressed_to":"...","effective_date":"2026-11-01"}' -
POST
/api/v1/app/companies/{company}/letters/{letter}/decideApprove or reject a letter waiting for approval: decision approved|rejected (letters.manag...Approve or reject a letter waiting for approval: decision approved|rejected (letters.manage, not one you issued).
- Sign-in
- App token or company API key
- Permission
letters.decide- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.letterinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/letters/{letter}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
line-manager-access 2 endpoints
-
GET
/api/v1/app/companies/{company}/line-manager-accessWhat direct managers may do for their reports (LineManagerAccess).What direct managers may do for their reports (LineManagerAccess).
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/line-manager-access" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/line-manager-accessTurns direct-manager items on or off; keys left out keep their value.Turns direct-manager items on or off; keys left out keep their value.
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/line-manager-access" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
live-location 4 endpoints
-
GET
/api/v1/app/companies/{company}/live-locationLatest positions: branch, department, group, status (online|lost|offline|none), q.Latest positions: branch, department, group, status (online|lost|offline|none), q.
- Sign-in
- App token or company API key
- Permission
live_location.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/live-location" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/live-location/employees/{employee}/trailOne employee's trail on a day (date, default today).One employee's trail on a day (date, default today).
- Sign-in
- App token or company API key
- Permission
live_location.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
datenullable|dateExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/live-location/employees/{employee}/trail?date=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/live-location/exportCSV: the positions by branch, department, group, status, q; or one employee's trail on dat...CSV: the positions by branch, department, group, status, q; or one employee's trail on date. Logged as an api export.
- Sign-in
- App token or company API key
- Permission
live_location.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeenullable|integerdatenullable|dateExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/live-location/export?employee=1&date=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/live-location/viewsWho looked at whose location (newest first).Who looked at whose location (newest first).
- Sign-in
- App token or company API key
- Permission
live_location.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/live-location/views" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
loans 6 endpoints
-
GET
/api/v1/app/companies/{company}/loansLoans in my scope: employee_id, status (active | settled).Loans in my scope: employee_id, status (active | settled).
- Sign-in
- App token or company API key
- Permission
payroll.loans.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/loans" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/loans/{loan}One loan with its installment schedule (made on first read for a loan from before schedule...One loan with its installment schedule (made on first read for a loan from before schedules were kept).
- Sign-in
- App token or company API key
- Permission
payroll.loans.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.loaninteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/loans/{loan}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/loans- Sign-in
- App token or company API key
- Permission
payroll.loans.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerloan_type_idnullable|integer|exists:loan_types,idamountrequiredrequired|numeric|min:1installmentsrequired_without:installment_amount|nullable|integer|min:1|max:120installment_amountnullable|numeric|gt:0|lte:amounteffective_datenullable|datefirst_installment_datenullable|date|'after_or_equal:' . \App\Support\PayrollMonth::open() . '-01'start_monthrequired_without:first_installment_date|nullable|date_format:Y-m|'after_or_equal:' . \App\Support\PayrollMonth::open()reasonnullable|string|'max:' . \App\Support\Limits::chars(255)payoutnullable|in:off_cycle,payrollcurrencynullable|in:AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLE,SOS,SRD,SSP,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWLattachmentsarray|max:10attachments.*file|max:10240|mimes:mp4,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zipExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/loans" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"loan_type_id":1,"amount":1.5,"installments":1,"installment_amount":1.5,"effective_date":"2026-11-01","first_installment_date":"2026-11-01","start_month":"2026-11-01","reason":"...","payout":"off_cycle","currency":"AED","attachments":[]}' -
DELETE
/api/v1/app/companies/{company}/loans/{loan}- Sign-in
- App token or company API key
- Permission
payroll.loans.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.loaninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/loans/{loan}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/loans/{loan}/rescheduleReschedule: installment_amount or number_of_payments for what is still owed.Reschedule: installment_amount or number_of_payments for what is still owed.
- Sign-in
- App token or company API key
- Permission
payroll.loans.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.loaninteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
installment_amountrequired_without:number_of_payments|nullable|numeric|gt:0number_of_paymentsrequired_without:installment_amount|nullable|integer|min:1|max:120Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/loans/{loan}/reschedule" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"installment_amount":1.5,"number_of_payments":1}' -
POST
/api/v1/app/companies/{company}/loans/{loan}/installments/{installment}/{action}Skip an unpaid installment (it moves to the end) or record it as paid in cash.Skip an unpaid installment (it moves to the end) or record it as paid in cash.
- Sign-in
- App token or company API key
- Permission
payroll.loans.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.loaninteger The record's ID. installmentinteger The record's ID. actionstring · skip|pay-cash The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/loans/{loan}/installments/{installment}/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
location 2 endpoints
-
GET
/api/v1/app/companies/{company}/location/policyThe signed-in employee's policy: required, mode, interval_seconds, distance_meters, max_si...The signed-in employee's policy: required, mode, interval_seconds, distance_meters, max_silence_minutes, reason_en, reason_ar, last_ping.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/location/policy" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/location/pingsA batch of pings: device {id, platform, app_version}, points [{lat, lng, accuracy, speed,...A batch of pings: device {id, platform, app_version}, points [{lat, lng, accuracy, speed, heading, altitude, recorded_at, mocked, battery, elapsed_ms}].
- Sign-in
- App token or company API key
- Permission
self.live_location- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
devicerequiredrequired|arraydevice.idrequiredrequired|string|max:100device.platformnullable|string|max:20device.app_versionnullable|string|max:40pointsrequiredrequired|array|min:1|max:500points.*.latrequiredrequired|numeric|between:-90,90points.*.lngrequiredrequired|numeric|between:-180,180points.*.accuracynullable|numeric|min:0|max:100000points.*.speednullable|numeric|min:0|max:1000points.*.headingnullable|numeric|between:0,360points.*.altitudenullable|numeric|between:-1000,20000points.*.recorded_atrequiredrequired|datepoints.*.mockednullable|booleanpoints.*.batterynullable|integer|between:0,100points.*.elapsed_msnullable|integer|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/location/pings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"device":{"id":"...","platform":"...","app_version":"..."},"points":[]}'
map-tiles 1 endpoint
-
GET
/api/v1/app/map-tilesGET /api/v1/app/map-tiles (signed in): where the app's in-app maps take their pictures fro...GET /api/v1/app/map-tiles (signed in): where the app's in-app maps take their pictures from (config/mihnaro.php map_tiles), for anyone signed in: the clock-in location map and a field job's site, not only field managers.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/map-tiles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
mass-actions 2 endpoints
-
GET
/api/v1/app/companies/{company}/mass-actionsGET mass-actions: the history.GET mass-actions: the history.
- Sign-in
- App token or company API key
- Permission
employees.edit | payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/mass-actions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/mass-actions/{tab}POST mass-actions/{tab}: the tab's fields and employee_ids; dry_run=1 only previews.POST mass-actions/{tab}: the tab's fields and employee_ids; dry_run=1 only previews.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.tabstring · personal|professional|financial The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idsrequiredrequired|array|min:1|max:1000employee_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/mass-actions/{tab}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_ids":[]}'
me 69 endpoints
-
GET
/api/v1/app/me/two-factorMy two-step verification: on or off, required or not, recovery codes left.My two-step verification: on or off, required or not, recovery codes left.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/two-factor" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/two-factorStarts setting it up: the key and the otpauth:// link for the authenticator app (only to t...Starts setting it up: the key and the otpauth:// link for the authenticator app (only to the user themself).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/two-factor" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/two-factor/confirmConfirms with a code from the app; the recovery codes are returned this once.Confirms with a code from the app; the recovery codes are returned this once.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
coderequiredrequired|string|max:20Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/two-factor/confirm" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"code":"..."}' -
DELETE
/api/v1/app/me/two-factor- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
passwordrequiredrequired|stringExample request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/me/two-factor?password=..." \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/two-factor/recovery-codes- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
passwordrequiredrequired|stringExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/two-factor/recovery-codes" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"password":"..."}' -
GET
/api/v1/app/me- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/me/password- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/me/password" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/me/preferences- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/me/preferences" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/me/list-columnsShow / hide columns: every list with the columns I hid (list= one list).Show / hide columns: every list with the columns I hid (list= one list).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/list-columns" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/me/list-columns/{list}Saves the columns I hide in a list: hidden[] (empty shows them all).Saves the columns I hide in a list: hidden[] (empty shows them all).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
liststring · [a-z_.]+ The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
hiddenpresent|arrayhidden.*string|max:60Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/me/list-columns/{list}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"hidden":[]}' -
GET
/api/v1/app/me/deletion-requestThis person's account-deletion requests, newest first (docs/account-deletion.md).This person's account-deletion requests, newest first (docs/account-deletion.md).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/deletion-request" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/deletion-requestAsks for the account and its data to be deleted: reason (optional). HR of each company and...Asks for the account and its data to be deleted: reason (optional). HR of each company and the Mihnaro team are told.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/deletion-request" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/me/devicesGET me/devices: the person's own phones, their IPs and sign-in activity (docs/platform-con...GET me/devices: the person's own phones, their IPs and sign-in activity (docs/platform-control.md, "Phone activity").
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/me/connected-apps- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/connected-apps" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/me/connected-apps/{grant}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
grantinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/me/connected-apps/{grant}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/connected-apps/tokensA token by hand, for a client without OAuth. Its value is in this answer only.A token by hand, for a client without OAuth. Its value is in this answer only.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
company_idrequiredrequired|integernamerequiredrequired|string|max:80Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/connected-apps/tokens" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"company_id":1,"name":"..."}' -
DELETE
/api/v1/app/me/connected-apps/tokens/{token}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
tokeninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/me/connected-apps/tokens/{token}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/me/push-tokensThe phones this person gets push notices on (docs/mobile-app.md).The phones this person gets push notices on (docs/mobile-app.md).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/push-tokens" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/push-tokens- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 20 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
platformrequiredrequired|in:ios,androidproviderrequiredrequired|in:fcm,apnstokenrequiredrequired|string|max:512|$input['provider'] === 'apns' ? 'regex:/^[0-9a-f]{64,200}$/' : 'regex:/^[A-Za-z0...device_namenullable|string|max:80apns_environmentnullable|in:production,sandboxExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/push-tokens" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"platform":"ios","provider":"fcm","token":"...","device_name":"...","apns_environment":"production"}' -
DELETE
/api/v1/app/me/push-tokens- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
tokenrequiredrequired|string|max:512Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/me/push-tokens?token=..." \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/me/debugGET me/debug: {on, until, send_requested}. Asked at the 15th tap and at each open; never c...GET me/debug: {on, until, send_requested}. Asked at the 15th tap and at each open; never cached.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/debug" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/debug/reportsPOST me/debug/reports: the phone's state and recent log, redacted. 403 while debug mode is...POST me/debug/reports: the phone's state and recent log, redacted. 403 while debug mode is off for this account.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 6 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/debug/reports" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/me/device-context- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 30 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
snapshotsrequiredrequired|array|min:1|max:20snapshots.*.triggerrequiredrequired|in:open,resume,sign_in,punchsnapshots.*.open_idnullable|string|max:64|regex:/^[A-Za-z0-9._:\-]+$/snapshots.*.company_idnullable|integersnapshots.*.locationnullable|arraysnapshots.*.contextnullable|arrayExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/me/device-context" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"snapshots":[]}' -
GET
/api/v1/app/me/appearance- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/me/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/me/appearance- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/me/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/me/appearance- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/me/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/permissionsWhat the token's user may do here, and where.What the token's user may do here, and where.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/permissions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/accessWhat the mobile app shows: modules, permissions with their scope, and the features they op...What the mobile app shows: modules, permissions with their scope, and the features they open (MyAccess).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/access" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/locale- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/locale" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/profileMy profile in this company (Mawarid's profile page).My profile in this company (Mawarid's profile page).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/profile" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/boardings- Sign-in
- App token or company API key
- Permission
self.workflows- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/boardings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET PUT
/api/v1/app/companies/{company}/me/dashboard-sectionsGET / PUT me/dashboard-sections: the HR dashboard sections this person shows ({key: bool})...GET / PUT me/dashboard-sections: the HR dashboard sections this person shows ({key: bool}); PUT with show [keys].
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboard-sections" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET PUT
/api/v1/app/companies/{company}/me/home-widgetsGET / PUT me/home-widgets: the Home Page widgets the person may see (the widget registry),...GET / PUT me/home-widgets: the Home Page widgets the person may see (the widget registry), in their order, with width, shown and the permission each needs; PUT with order [keys], show [keys] and widths {key: 1–4}.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/home-widgets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/report-filesGET me/report-files: the person's own background files.GET me/report-files: the person's own background files.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/report-files" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/report-files/{file}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.fileinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/report-files/{file}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/report-files/{file}/download- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.fileinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/report-files/{file}/download" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/attendanceMy attendance: a month of days and today's records.My attendance: a month of days and today's records.
- Sign-in
- App token or company API key
- Permission
self.attendance.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/attendance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/clockThe dashboard's clock card: today's shift, in or out, and what clocking needs here.The dashboard's clock card: today's shift, in or out, and what clocking needs here.
- Sign-in
- App token or company API key
- Permission
self.clock- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/clock" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/faceWhat the consent screen shows: the text, the answer so far, and whether a template exists.What the consent screen shows: the text, the answer so far, and whether a template exists.
- Sign-in
- App token or company API key
- Permission
self.face- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/face" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/face/consent- Sign-in
- App token or company API key
- Permission
self.face- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
decisionrequiredrequired|in:granted,refused,withdrawnExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/face/consent" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"decision":"granted"}' -
POST
/api/v1/app/companies/{company}/me/face/enrolThe biometric photo, before any punch (§20). Multipart: face_token, face_frames[] (3 JPEGs...The biometric photo, before any punch (§20). Multipart: face_token, face_frames[] (3 JPEGs), face_mirrored.
- Sign-in
- App token or company API key
- Permission
self.face- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/face/enrol" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/face/challenge- Sign-in
- App token or company API key
- Permission
self.clock | self.presence- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/face/challenge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/device-keyThe phone's new key: public_key (base64 of SubjectPublicKeyInfo or the X9.63 point), devic...The phone's new key: public_key (base64 of SubjectPublicKeyInfo or the X9.63 point), device_id, platform.
- Sign-in
- App token or company API key
- Permission
self.clock- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
public_keyrequiredrequired|string|max:1000device_idrequiredrequired|string|max:100platformnullable|in:ios,androidExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/device-key" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"public_key":"...","device_id":"...","platform":"ios"}' -
GET
/api/v1/app/companies/{company}/me/presence-check- Sign-in
- App token or company API key
- Permission
self.presence- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/presence-check" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/presence-check/{check}Multipart: face_token, face_frames[] (3 JPEGs), face_mirrored. Without consent, an empty b...Multipart: face_token, face_frames[] (3 JPEGs), face_mirrored. Without consent, an empty body counts as unverified.
- Sign-in
- App token or company API key
- Permission
self.presence- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.checkinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/presence-check/{check}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/scheduleGET me/schedule?from=&to= (YYYY-MM-DD, up to 62 days; this week by default): each day's sh...GET me/schedule?from=&to= (YYYY-MM-DD, up to 62 days; this week by default): each day's shift, day off, holiday and leave.
- Sign-in
- App token or company API key
- Permission
self.schedule- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/schedule" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/team-calendarGET me/team-calendar?month=YYYY-MM: who is off or remote, holidays and events (MyCalendar)...GET me/team-calendar?month=YYYY-MM: who is off or remote, holidays and events (MyCalendar).
- Sign-in
- App token or company API key
- Permission
self.team_calendar- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/team-calendar" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/requestsMy requests: status (all by default).My requests: status (all by default).
- Sign-in
- App token or company API key
- Permission
self.requests.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/requests" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/performanceMy evaluations, the reviews waiting for me, my goals, my feedback requests and feedback fo...My evaluations, the reviews waiting for me, my goals, my feedback requests and feedback forms.
- Sign-in
- App token or company API key
- Permission
self.performance.view | self.performance.review | self.performance.goals- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/performance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/assessmentsThe signed-in employee's own tests, with the page to take each.The signed-in employee's own tests, with the page to take each.
- Sign-in
- App token or company API key
- Permission
self.assessments- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/assessments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/payslipsMy payslips: the approved runs only.My payslips: the approved runs only.
- Sign-in
- App token or company API key
- Permission
self.payslips.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/payslips" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/earned-wage- Sign-in
- App token or company API key
- Permission
self.earned_wage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/earned-wage" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/leavesMy balances this year (or ?year) and my requests.My balances this year (or ?year) and my requests.
- Sign-in
- App token or company API key
- Permission
self.leaves.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/leaves" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/notificationsGET me/notifications?unread=1&category=&page=GET me/notifications?unread=1&category=&page=
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/notifications" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/notifications/read-all- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/notifications/read-all" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/notifications/{notice}/readPOST me/notifications/{notice}/read (unread=1 to mark it unread again)POST me/notifications/{notice}/read (unread=1 to mark it unread again)
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.noticeinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/notifications/{notice}/read" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/notification-preferences- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/notification-preferences" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/me/notification-preferencesPUT me/notification-preferences {categories: {requests: {in_app, email, whatsapp}, ...}}PUT me/notification-preferences {categories: {requests: {in_app, email, whatsapp}, ...}}
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/notification-preferences" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/me/dashboards- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/dashboards- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(60)name.arnullable|string|'max:' . \App\Support\Limits::chars(60)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."}}' -
GET
/api/v1/app/companies/{company}/me/dashboards/{dashboard}GET me/dashboards/{dashboard}: with every widget's figure.GET me/dashboards/{dashboard}: with every widget's figure.
- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.dashboardinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards/{dashboard}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/me/dashboards/{dashboard}- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.dashboardinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(60)name.arnullable|string|'max:' . \App\Support\Limits::chars(60)Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards/{dashboard}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."}}' -
DELETE
/api/v1/app/companies/{company}/me/dashboards/{dashboard}- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.dashboardinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards/{dashboard}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/me/dashboards/{dashboard}/orderPUT me/dashboards/{dashboard}/order {ids: [...]}PUT me/dashboards/{dashboard}/order {ids: [...]}
- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.dashboardinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards/{dashboard}/order" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/me/dashboards/{dashboard}/interval- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.dashboardinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards/{dashboard}/interval" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/me/dashboards-order- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards-order" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/me/dashboards/{dashboard}/widgets- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.dashboardinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
metric$widget ? 'sometimes' : 'required'|Rule::in(array_keys(self::METRICS))titlesometimes|nullable|arraytitle.ennullable|string|'max:' . \App\Support\Limits::chars(60)title.arnullable|string|'max:' . \App\Support\Limits::chars(60)chartsometimes|nullable|Rule::in($metric === 'report' ? array_keys(\App\Support\CommandCenter::CHARTS) :...widthsometimes|integer|in:1,2,3,4report_typerequiredrequired|in:approved_leaves,approved_vacations,contract_expiry,document_expiry,termination_reasons,end_of_probation,headcount,joiners_leavers,overtime_hours,pending_tasks,retention_rate,turnover,loans,net_salaries,overtime_paybreakdownnullable|in:none,age_group,gender,nationality,service_period,work_typelevelrequiredrequired|in:company,branch,work_location,department,section,group,project,job_roleunit_ids$hasUnits ? 'required' : 'nullable'|arrayunit_ids.*integer|Rule::in(array_keys(\App\Support\CommandCenter::units($level)))interval$intervals ? ['required', 'integer', Rule::in($intervals)] : ['nullable']upcomingnullable|booleanoptionsnullable|arrayExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboards/{dashboard}/widgets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"metric":"...","title":{"en":"...","ar":"..."},"chart":"...","width":1,"report_type":"approved_leaves","breakdown":"none","level":"company","unit_ids":[],"interval":"...","upcoming":true,"options":[]}' -
PATCH PUT
/api/v1/app/companies/{company}/me/dashboard-widgets/{widget}- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.widgetinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
metric$widget ? 'sometimes' : 'required'|Rule::in(array_keys(self::METRICS))titlesometimes|nullable|arraytitle.ennullable|string|'max:' . \App\Support\Limits::chars(60)title.arnullable|string|'max:' . \App\Support\Limits::chars(60)chartsometimes|nullable|Rule::in($metric === 'report' ? array_keys(\App\Support\CommandCenter::CHARTS) :...widthsometimes|integer|in:1,2,3,4report_typerequiredrequired|in:approved_leaves,approved_vacations,contract_expiry,document_expiry,termination_reasons,end_of_probation,headcount,joiners_leavers,overtime_hours,pending_tasks,retention_rate,turnover,loans,net_salaries,overtime_paybreakdownnullable|in:none,age_group,gender,nationality,service_period,work_typelevelrequiredrequired|in:company,branch,work_location,department,section,group,project,job_roleunit_ids$hasUnits ? 'required' : 'nullable'|arrayunit_ids.*integer|Rule::in(array_keys(\App\Support\CommandCenter::units($level)))interval$intervals ? ['required', 'integer', Rule::in($intervals)] : ['nullable']upcomingnullable|booleanoptionsnullable|arrayExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboard-widgets/{widget}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"metric":"...","title":{"en":"...","ar":"..."},"chart":"...","width":1,"report_type":"approved_leaves","breakdown":"none","level":"company","unit_ids":[],"interval":"...","upcoming":true,"options":[]}' -
DELETE
/api/v1/app/companies/{company}/me/dashboard-widgets/{widget}- Sign-in
- App token or company API key
- Permission
self.dashboard- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.widgetinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/me/dashboard-widgets/{widget}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
miscellaneous-requests 3 endpoints
-
GET
/api/v1/app/companies/{company}/miscellaneous-requests- Sign-in
- App token or company API key
- Permission
requests.miscellaneous.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/miscellaneous-requests" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/miscellaneous-requests/{employeeRequest}- Sign-in
- App token or company API key
- Permission
requests.miscellaneous.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/miscellaneous-requests/{employeeRequest}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/miscellaneous-requests/{employeeRequest}- Sign-in
- App token or company API key
- Permission
requests.miscellaneous.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/miscellaneous-requests/{employeeRequest}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
nine-box 2 endpoints
-
GET
/api/v1/app/companies/{company}/nine-box/employees/{employee}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/nine-box/employees/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/nine-boxcycle_id, branch_id, department_id, position_id; box narrows to one box. format=csv downlo...cycle_id, branch_id, department_id, position_id; box narrows to one box. format=csv downloads it.
- Sign-in
- App token or company API key
- Permission
performance.view | performance.manage | performance.nine_box.view | performance.nine_box.assess- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/nine-box" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
notification-events 1 endpoint
-
GET
/api/v1/app/companies/{company}/notification-eventsGET notification-events?kind=&category=&q= — which events notify whom (notifications.manag...GET notification-events?kind=&category=&q= — which events notify whom (notifications.manage).
- Sign-in
- App token or company API key
- Permission
notifications.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/notification-events" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
notification-log 3 endpoints
-
GET
/api/v1/app/companies/{company}/notification-logGET notification-log?from=&to=&category=&channel=&status=&person=&branch=&kind=&actor=&q=&...GET notification-log?from=&to=&category=&channel=&status=&person=&branch=&kind=&actor=&q=&per_page=&summary=1
- Sign-in
- App token or company API key
- Permission
notifications.log.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/notification-log" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/notification-log/exportGET notification-log/export?format=csv|xlsx&…filters, or with send= one send's recipients.GET notification-log/export?format=csv|xlsx&…filters, or with send= one send's recipients.
- Sign-in
- App token or company API key
- Permission
notifications.log.view- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
formatnullable|in:csv,xlsxsendnullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/notification-log/export?format=csv&send=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/notification-log/{send}GET notification-log/{send}: the send with every person in scope and what each channel ans...GET notification-log/{send}: the send with every person in scope and what each channel answered.
- Sign-in
- App token or company API key
- Permission
notifications.log.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sendinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/notification-log/{send}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
notification-setup 2 endpoints
-
GET
/api/v1/app/companies/{company}/notification-setup- Sign-in
- App token or company API key
- Permission
notifications.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/notification-setup" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/notification-setupPUT notification-setup {categories_off, receiver_emails, email_everyone, reminders}PUT notification-setup {categories_off, receiver_emails, email_everyone, reminders}
- Sign-in
- App token or company API key
- Permission
notifications.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/notification-setup" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
objectives 2 endpoints
-
PATCH PUT
/api/v1/app/companies/{company}/objectives/{objective}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.objectiveinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/objectives/{objective}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/objectives/{objective}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.objectiveinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/objectives/{objective}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
off-cycle-settlements 1 endpoint
-
POST
/api/v1/app/companies/{company}/off-cycle-settlementsids: unpaid off-cycle transactions marked paid.ids: unpaid off-cycle transactions marked paid.
- Sign-in
- App token or company API key
- Permission
payroll.transactions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
idsrequiredrequired|array|min:1ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/off-cycle-settlements" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ids":[]}'
okr-templates 6 endpoints
-
POST
/api/v1/app/companies/{company}/okr-templatesname {en, ar}; objectives are added one by one.name {en, ar}; objectives are added one by one.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okr-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/okr-templates/{template}name {en, ar}; objectives are added one by one.name {en, ar}; objectives are added one by one.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okr-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/okr-templates/{template}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okr-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/okr-templates/{template}/objectivesAn objective (as for an employee's OKRs) added, or replaced at index.An objective (as for an employee's OKRs) added, or replaced at index.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okr-templates/{template}/objectives" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/okr-templates/{template}/objectives/{index}An objective (as for an employee's OKRs) added, or replaced at index.An objective (as for an employee's OKRs) added, or replaced at index.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. indexinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okr-templates/{template}/objectives/{index}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/okr-templates/{template}/objectives/{index}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. indexinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okr-templates/{template}/objectives/{index}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
okrs 1 endpoint
-
POST
/api/v1/app/companies/{company}/okrs/mass-assigntemplate_id, evaluations (ids).template_id, evaluations (ids).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/okrs/mass-assign" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
org-chart 1 endpoint
-
GET
/api/v1/app/companies/{company}/org-chart- Sign-in
- App token or company API key
- Permission
self.org_chart | employees.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/org-chart" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
org-units 5 endpoints
-
GET
/api/v1/app/companies/{company}/org-units- Sign-in
- App token or company API key
- Permission
structure.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/org-units" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/org-units- Sign-in
- App token or company API key
- Permission
structure.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
type$unit ? 'sometimes' : 'required'|in:work_location,department,section,project,hierarchy_group,business_unit,division,segmentname$unit ? 'sometimes' : 'required'|arrayname.en$unit ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)codenullable|alpha_dash|max:30establishment_numbernullable|string|max:60subsidiary_idnullable|string|max:60external_refnullable|string|max:64logonullable|image|mimes:png,jpg,jpeg,webp,svg|max:10240remove_logosometimes|booleanestablishment_namenullable|string|max:150governance_locationnullable|string|max:100ss_numbernullable|string|max:60tax_numbernullable|string|max:60addressnullable|string|max:255po_boxnullable|string|max:30branch_idnullable|integer|exists:branches,idparent_id$type === 'section' && !$unit?->parent_id ? 'required' : 'nullable'|integer|exists:org_units,idis_activesometimes|booleansort_ordersometimes|integer|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/org-units" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "type=work_location" \ -F "name=..." \ -F "name.en=..." \ -F "name.ar=..." \ -F "code=..." \ -F "establishment_number=..." \ -F "subsidiary_id=..." \ -F "external_ref=..." \ -F "[email protected]" \ -F "remove_logo=1" \ -F "establishment_name=..." \ -F "governance_location=..." \ -F "ss_number=..." \ -F "tax_number=..." \ -F "address=..." \ -F "po_box=..." \ -F "branch_id=1" \ -F "parent_id=1" \ -F "is_active=1" \ -F "sort_order=1" -
POST
/api/v1/app/companies/{company}/org-units/inlineAdds a missing level for an employee's job details, where the branch allows it (AddOrgLeve...Adds a missing level for an employee's job details, where the branch allows it (AddOrgLevel).
- Sign-in
- App token or company API key
- Permission
structure.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
typerequiredrequired|in:work_location,department,section,project,hierarchy_group,business_unit,division,segmentemployee_idnullable|integer|exists:employees,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/org-units/inline" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"type":"work_location","employee_id":1}' -
PATCH
/api/v1/app/companies/{company}/org-units/{unit}- Sign-in
- App token or company API key
- Permission
structure.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.unitinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
type$unit ? 'sometimes' : 'required'|in:work_location,department,section,project,hierarchy_group,business_unit,division,segmentname$unit ? 'sometimes' : 'required'|arrayname.en$unit ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)codenullable|alpha_dash|max:30establishment_numbernullable|string|max:60subsidiary_idnullable|string|max:60external_refnullable|string|max:64logonullable|image|mimes:png,jpg,jpeg,webp,svg|max:10240remove_logosometimes|booleanestablishment_namenullable|string|max:150governance_locationnullable|string|max:100ss_numbernullable|string|max:60tax_numbernullable|string|max:60addressnullable|string|max:255po_boxnullable|string|max:30branch_idnullable|integer|exists:branches,idparent_id$type === 'section' && !$unit?->parent_id ? 'required' : 'nullable'|integer|exists:org_units,idis_activesometimes|booleansort_ordersometimes|integer|min:0Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/org-units/{unit}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "type=work_location" \ -F "name=..." \ -F "name.en=..." \ -F "name.ar=..." \ -F "code=..." \ -F "establishment_number=..." \ -F "subsidiary_id=..." \ -F "external_ref=..." \ -F "[email protected]" \ -F "remove_logo=1" \ -F "establishment_name=..." \ -F "governance_location=..." \ -F "ss_number=..." \ -F "tax_number=..." \ -F "address=..." \ -F "po_box=..." \ -F "branch_id=1" \ -F "parent_id=1" \ -F "is_active=1" \ -F "sort_order=1" -
DELETE
/api/v1/app/companies/{company}/org-units/{unit}- Sign-in
- App token or company API key
- Permission
structure.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.unitinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/org-units/{unit}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
overtime-types 4 endpoints
-
GET
/api/v1/app/companies/{company}/overtime-types- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtime-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/overtime-types- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)applies_onrequiredrequired|in:any,workday,weekend,holidayraterequiredrequired|numeric|min:0|max:20allowance_methodrequiredrequired|in:hourly,dailyallowances_ratenullable|numeric|min:0|max:20allowance_type_idsnullable|arrayallowance_type_ids.*integer|exists:transaction_types,idtransaction_type_idnullable|integer|exists:transaction_types,idlimit_hoursnullable|numeric|min:0|max:744limit_periodnullable|in:day,week,monthexceptionsnullable|arrayexceptions.*.daynullable|in:0,1,2,3,4,5,6,offexceptions.*.fromnullable|date_format:H:iexceptions.*.tonullable|date_format:H:iexceptions.*.basic_ratenullable|numeric|min:0|max:20exceptions.*.allowances_ratenullable|numeric|min:0|max:20exceptions.*.methodnullable|in:hourly,dailyExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtime-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"applies_on":"any","rate":1.5,"allowance_method":"hourly","allowances_rate":1.5,"allowance_type_ids":[],"transaction_type_id":1,"limit_hours":1.5,"limit_period":"day","exceptions":[]}' -
PUT
/api/v1/app/companies/{company}/overtime-types/{type}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)applies_onrequiredrequired|in:any,workday,weekend,holidayraterequiredrequired|numeric|min:0|max:20allowance_methodrequiredrequired|in:hourly,dailyallowances_ratenullable|numeric|min:0|max:20allowance_type_idsnullable|arrayallowance_type_ids.*integer|exists:transaction_types,idtransaction_type_idnullable|integer|exists:transaction_types,idlimit_hoursnullable|numeric|min:0|max:744limit_periodnullable|in:day,week,monthexceptionsnullable|arrayexceptions.*.daynullable|in:0,1,2,3,4,5,6,offexceptions.*.fromnullable|date_format:H:iexceptions.*.tonullable|date_format:H:iexceptions.*.basic_ratenullable|numeric|min:0|max:20exceptions.*.allowances_ratenullable|numeric|min:0|max:20exceptions.*.methodnullable|in:hourly,dailyExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtime-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"applies_on":"any","rate":1.5,"allowance_method":"hourly","allowances_rate":1.5,"allowance_type_ids":[],"transaction_type_id":1,"limit_hours":1.5,"limit_period":"day","exceptions":[]}' -
DELETE
/api/v1/app/companies/{company}/overtime-types/{type}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtime-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
overtimes 5 endpoints
-
GET
/api/v1/app/companies/{company}/overtimesOvertimes in scope, newest first: employee_id, status, overtime_type, from / to (the overt...Overtimes in scope, newest first: employee_id, status, overtime_type, from / to (the overtime date).
- Sign-in
- App token or company API key
- Permission
payroll.overtime.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtimes" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/overtimes- Sign-in
- App token or company API key
- Permission
payroll.overtime.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
effective_datenullable|dateout_of_payrollnullable|booleanattachmentnullable|file|max:10240|mimes:mp4,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zipExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtimes" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "effective_date=2026-11-01" \ -F "out_of_payroll=1" \ -F "[email protected]" -
PUT
/api/v1/app/companies/{company}/overtimes/{overtime}- Sign-in
- App token or company API key
- Permission
payroll.overtime.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.overtimeinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
effective_datenullable|dateout_of_payrollnullable|booleanattachmentnullable|file|max:10240|mimes:mp4,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zipExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtimes/{overtime}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "effective_date=2026-11-01" \ -F "out_of_payroll=1" \ -F "[email protected]" -
POST
/api/v1/app/companies/{company}/overtimes/convertOvertime → time off: from, to, leave_type_id, rate (%), effective_date, minimum_hours, com...Overtime → time off: from, to, leave_type_id, rate (%), effective_date, minimum_hours, combined, notes, department, work_location, section, main_project.
- Sign-in
- App token or company API key
- Permission
payroll.overtime.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
fromrequiredrequired|datetorequiredrequired|date|after_or_equal:fromleave_type_idrequiredrequired|integerraterequiredrequired|numeric|min:0.01|max:1000effective_daterequiredrequired|dateminimum_hoursrequiredrequired|numeric|min:0combinednullable|booleannotesnullable|string|'max:' . \App\Support\Limits::chars(500)departmentnullable|integerwork_locationnullable|integersectionnullable|integermain_projectnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtimes/convert" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"from":"2026-11-01","to":"2026-11-01","leave_type_id":1,"rate":1.5,"effective_date":"2026-11-01","minimum_hours":1.5,"combined":true,"notes":"...","department":1,"work_location":1,"section":1,"main_project":1}' -
POST
/api/v1/app/companies/{company}/overtimes/batch-as-incomeAn overtime batch as income: employee_id, transaction_type_id (an earning), overtime_type_...An overtime batch as income: employee_id, transaction_type_id (an earning), overtime_type_id, hours, date, description.
- Sign-in
- App token or company API key
- Permission
payroll.overtime.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integertransaction_type_idrequiredrequired|exists:transaction_types,idovertime_type_idnullable|integerhoursrequiredrequired|numeric|gt:0|max:744daterequiredrequired|datedescriptionnullable|string|'max:' . \App\Support\Limits::chars(190)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/overtimes/batch-as-income" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"transaction_type_id":"...","overtime_type_id":1,"hours":1.5,"date":"2026-11-01","description":"..."}'
part-time-assignments 4 endpoints
-
GET
/api/v1/app/companies/{company}/part-time-assignmentsAssignments in scope, newest first: employee_id, type (transaction type id), effective (a...Assignments in scope, newest first: employee_id, type (transaction type id), effective (a date), from / to, and the org filters.
- Sign-in
- App token or company API key
- Permission
payroll.part_time.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/part-time-assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/part-time-assignments- Sign-in
- App token or company API key
- Permission
payroll.part_time.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
transaction_type_idrequiredrequired|exists:transaction_types,idamountnullable|numeric|min:0recurring_valuenullable|numeric|min:0netnullable|booleaneffective_daterequiredrequired|dateend_datenullable|date|after_or_equal:effective_datenotenullable|string|'max:' . \App\Support\Limits::chars(255)attachmentnullable|file|max:10240|mimes:pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zipExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/part-time-assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "transaction_type_id=..." \ -F "amount=1.5" \ -F "recurring_value=1.5" \ -F "net=1" \ -F "effective_date=2026-11-01" \ -F "end_date=2026-11-01" \ -F "note=..." \ -F "[email protected]" -
DELETE
/api/v1/app/companies/{company}/part-time-assignments/{assignment}- Sign-in
- App token or company API key
- Permission
payroll.part_time.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assignmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/part-time-assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/part-time-assignments/{assignment}- Sign-in
- App token or company API key
- Permission
payroll.part_time.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assignmentinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
transaction_type_idrequiredrequired|exists:transaction_types,idamountnullable|numeric|min:0recurring_valuenullable|numeric|min:0netnullable|booleaneffective_daterequiredrequired|dateend_datenullable|date|after_or_equal:effective_datenotenullable|string|'max:' . \App\Support\Limits::chars(255)attachmentnullable|file|max:10240|mimes:pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zipExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/part-time-assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "transaction_type_id=..." \ -F "amount=1.5" \ -F "recurring_value=1.5" \ -F "net=1" \ -F "effective_date=2026-11-01" \ -F "end_date=2026-11-01" \ -F "note=..." \ -F "[email protected]"
payroll 1 endpoint
-
GET
/api/v1/app/companies/{company}/payroll/{month}Mawarid's GET payroll/{YYYY-MM}: the month's approved regular run with its payslips (404 u...Mawarid's GET payroll/{YYYY-MM}: the month's approved regular run with its payslips (404 until approved).
- Sign-in
- App token or company API key
- Permission
payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.monthstring · [0-9]{4}-[0-9]{2} The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll/{month}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
payroll-lists 1 endpoint
-
GET
/api/v1/app/companies/{company}/payroll-lists/{list}air-tickets, business-trips, expenses or missing-punches: status, from, to, travel_policy,...air-tickets, business-trips, expenses or missing-punches: status, from, to, travel_policy, travel_from, travel_to, expense_name; paged.
- Sign-in
- App token or company API key
- Permission
payroll.view | payroll.manage | payroll.business_trips.view | payroll.expenses.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.liststring · air-tickets|business-trips|expenses|missing-punches The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-lists/{list}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
payroll-rules 4 endpoints
-
GET
/api/v1/app/companies/{company}/payroll-rules/{section}A rules list; bank-accounts can be filtered by branch_id.A rules list; bank-accounts can be filtered by branch_id.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-rules/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/payroll-rules/{section}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)employee_percentrequiredrequired|numeric|min:0|max:100employer_percentrequiredrequired|numeric|min:0|max:100salary_fromnullable|numeric|min:0salary_tonullable|numeric|min:0|gte:salary_fromceilingnullable|numeric|min:0floornullable|numeric|min:0baserequiredrequired|in:basic,grossexternal_refnullable|string|max:64min_work_daysnullable|integer|min:0|max:31effective_fromrequiredrequired|dateeffective_tonullable|date|after_or_equal:effective_frompercentrequiredrequired|numeric|min:0|max:1000distributionrequiredrequired|in:once,monthlypay_monthrequiredrequired|integer|between:1,12countrynullable|string|max:60bank_namerequiredrequired|string|max:150bank_branchnullable|string|max:150account_namenullable|string|max:150account_numberrequiredrequired|string|max:60ibannullable|string|max:60exchange_accountnullable|string|max:60establishment_numbernullable|string|max:60currencynullable|alpha|size:3branch_idnullable|exists:branches,idbank_export_template_idnullable|exists:bank_export_templates,idbrackets$rows ? 'nullable' : 'required'|string|max:2000|regex:/^(\s*\d+(\.\d+)?\s*:\s*\d+(\.\d+)?\s*(\r?\n|$))+$/bracket_periodnullable|in:monthly,annualbracket_rowsarray|max:30bracket_rows.*.minnullable|numeric|min:0bracket_rows.*.maxnullable|numeric|min:0bracket_rows.*.raterequiredrequired|numeric|min:0|max:100bracket_rows.*.extra_exemptionnullable|numeric|min:0|max:100personal_exemptionnullable|numeric|min:0family_exemptionnullable|numeric|min:0other_exemptionnullable|numeric|min:0notesnullable|string|'max:' . \App\Support\Limits::chars(255)kindrequiredrequired|in:bank,wpsbanknullable|string|max:150extensionrequiredrequired|in:csv,txt,sif,xlsxdelimiterrequiredrequired|in:,,;,|,tabheader_linesnullable|string|max:2000footer_linesnullable|string|max:2000columns_textrequiredrequired|string|max:4000date_formatrequiredrequired|string|max:20amount_decimalsrequiredrequired|integer|between:0,4slip_typerequiredrequired|in:salary,settlementlanguagerequiredrequired|in:en,ar|unique:salary_slip_templatesheadernullable|string|max:5000footernullable|string|max:5000Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-rules/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_ar":"...","name_en":"...","employee_percent":1.5,"employer_percent":1.5,"salary_from":1.5,"salary_to":1.5,"ceiling":1.5,"floor":1.5,"base":"basic","external_ref":"...","min_work_days":1,"effective_from":"2026-11-01","effective_to":"2026-11-01","percent":1.5,"distribution":"once","pay_month":1,"country":"...","bank_name":"...","bank_branch":"...","account_name":"...","account_number":"...","iban":"...","exchange_account":"...","establishment_number":"...","currency":"...","branch_id":"...","bank_export_template_id":"...","brackets":"...","bracket_period":"monthly","bracket_rows":[],"personal_exemption":1.5,"family_exemption":1.5,"other_exemption":1.5,"notes":"...","kind":"bank","bank":"...","extension":"csv","delimiter":"","header_lines":"...","footer_lines":"...","columns_text":"...","date_format":"...","amount_decimals":1,"slip_type":"salary","language":"en","header":"...","footer":"..."}' -
PUT
/api/v1/app/companies/{company}/payroll-rules/{section}/{id}The whole record is sent, as on the screen (a switch left out is off).The whole record is sent, as on the screen (a switch left out is off).
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates The record's ID. idinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)employee_percentrequiredrequired|numeric|min:0|max:100employer_percentrequiredrequired|numeric|min:0|max:100salary_fromnullable|numeric|min:0salary_tonullable|numeric|min:0|gte:salary_fromceilingnullable|numeric|min:0floornullable|numeric|min:0baserequiredrequired|in:basic,grossexternal_refnullable|string|max:64min_work_daysnullable|integer|min:0|max:31effective_fromrequiredrequired|dateeffective_tonullable|date|after_or_equal:effective_frompercentrequiredrequired|numeric|min:0|max:1000distributionrequiredrequired|in:once,monthlypay_monthrequiredrequired|integer|between:1,12countrynullable|string|max:60bank_namerequiredrequired|string|max:150bank_branchnullable|string|max:150account_namenullable|string|max:150account_numberrequiredrequired|string|max:60ibannullable|string|max:60exchange_accountnullable|string|max:60establishment_numbernullable|string|max:60currencynullable|alpha|size:3branch_idnullable|exists:branches,idbank_export_template_idnullable|exists:bank_export_templates,idbrackets$rows ? 'nullable' : 'required'|string|max:2000|regex:/^(\s*\d+(\.\d+)?\s*:\s*\d+(\.\d+)?\s*(\r?\n|$))+$/bracket_periodnullable|in:monthly,annualbracket_rowsarray|max:30bracket_rows.*.minnullable|numeric|min:0bracket_rows.*.maxnullable|numeric|min:0bracket_rows.*.raterequiredrequired|numeric|min:0|max:100bracket_rows.*.extra_exemptionnullable|numeric|min:0|max:100personal_exemptionnullable|numeric|min:0family_exemptionnullable|numeric|min:0other_exemptionnullable|numeric|min:0notesnullable|string|'max:' . \App\Support\Limits::chars(255)kindrequiredrequired|in:bank,wpsbanknullable|string|max:150extensionrequiredrequired|in:csv,txt,sif,xlsxdelimiterrequiredrequired|in:,,;,|,tabheader_linesnullable|string|max:2000footer_linesnullable|string|max:2000columns_textrequiredrequired|string|max:4000date_formatrequiredrequired|string|max:20amount_decimalsrequiredrequired|integer|between:0,4slip_typerequiredrequired|in:salary,settlementlanguagerequiredrequired|in:en,ar|unique:salary_slip_templatesheadernullable|string|max:5000footernullable|string|max:5000Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-rules/{section}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_ar":"...","name_en":"...","employee_percent":1.5,"employer_percent":1.5,"salary_from":1.5,"salary_to":1.5,"ceiling":1.5,"floor":1.5,"base":"basic","external_ref":"...","min_work_days":1,"effective_from":"2026-11-01","effective_to":"2026-11-01","percent":1.5,"distribution":"once","pay_month":1,"country":"...","bank_name":"...","bank_branch":"...","account_name":"...","account_number":"...","iban":"...","exchange_account":"...","establishment_number":"...","currency":"...","branch_id":"...","bank_export_template_id":"...","brackets":"...","bracket_period":"monthly","bracket_rows":[],"personal_exemption":1.5,"family_exemption":1.5,"other_exemption":1.5,"notes":"...","kind":"bank","bank":"...","extension":"csv","delimiter":"","header_lines":"...","footer_lines":"...","columns_text":"...","date_format":"...","amount_decimals":1,"slip_type":"salary","language":"en","header":"...","footer":"..."}' -
DELETE
/api/v1/app/companies/{company}/payroll-rules/{section}/{id}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-rules/{section}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
payroll-runs 12 endpoints
-
GET
/api/v1/app/companies/{company}/payroll-runsPayroll runs, newest first: month, kind (regular | off_cycle), status.Payroll runs, newest first: month, kind (regular | off_cycle), status.
- Sign-in
- App token or company API key
- Permission
payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/payroll-runs/{run}/review- Sign-in
- App token or company API key
- Permission
payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/review" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/payroll-runs/{run}A run with its payslips (the ones in my scope).A run with its payslips (the ones in my scope).
- Sign-in
- App token or company API key
- Permission
payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/payroll-runs- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
monthrequiredrequired|date_format:Y-mdepartmentsnullable|arraydepartments.*integerbranchesnullable|arraybranches.*integeremployeesnullable|arrayemployees.*integerpicksnullable|arraypicks.*stringperiod_fromnullable|required_with:period_to|date_format:Y-m-dperiod_tonullable|required_with:period_from|date_format:Y-m-d|after_or_equal:period_frombatch_idnullable|integermove_pendingnullable|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"month":"2026-11-01","departments":[],"branches":[],"employees":[],"picks":[],"period_from":"2026-11-01","period_to":"2026-11-01","batch_id":1,"move_pending":true}' -
POST
/api/v1/app/companies/{company}/payroll-runs/off-cycle- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|string|max:100monthrequiredrequired|date_format:Y-mpercent_of_basicrequiredrequired|numeric|min:1|max:1000picksnullable|arraypicks.*stringExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/off-cycle" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":"...","month":"2026-11-01","percent_of_basic":1.5,"picks":[]}' -
POST
/api/v1/app/companies/{company}/payroll-runs/{run}/recalculate- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/recalculate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/payroll-runs/{run}/approveApprove, or send through the salary batch approval chain: result is "approved" or "sent".Approve, or send through the salary batch approval chain: result is "approved" or "sent".
- Sign-in
- App token or company API key
- Permission
payroll.runs.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/approve" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/payroll-runs/{run}/paid- Sign-in
- App token or company API key
- Permission
payroll.runs.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
paid_atrequiredrequired|datepayment_referencenullable|string|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/paid" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"paid_at":"2026-11-01","payment_reference":"..."}' -
DELETE
/api/v1/app/companies/{company}/payroll-runs/{run}/payslips/{payslip}Salary row → Delete: takes one employee out of a draft batch.Salary row → Delete: takes one employee out of a draft batch.
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. payslipinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/payslips/{payslip}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/payroll-runs/{run}/revertWhether an approved run can go back to draft: can_revert and the reasons it can't (blocker...Whether an approved run can go back to draft: can_revert and the reasons it can't (blockers, keyed).
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/revert" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/payroll-runs/{run}/revertRevert to draft: undoes what approving did (reason optional); 422 with the blockers when r...Revert to draft: undoes what approving did (reason optional); 422 with the blockers when refused.
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}/revert" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/payroll-runs/{run}- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-runs/{run}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
payroll-settings 2 endpoints
-
GET
/api/v1/app/companies/{company}/payroll-settings/{section}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · payroll-setup|in-advance|extra-salaries|tax-setup|journal|provision-setup The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-settings/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/payroll-settings/{section}Only the fields sent change; the others keep their values.Only the fields sent change; the others keep their values.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.sectionstring · payroll-setup|in-advance|extra-salaries|tax-setup|journal|provision-setup The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
payroll_cutoff_daynullable|integer|min:0|max:28day_base_absence$baseday_base_unpaid$baseday_base_overtime$baseday_base_vacation$baseabsence_calc_mode$modeunpaid_calc_mode$modegross_up_rate_onrequiredrequired|in:net,grossgross_up_type_idnullable|exists:transaction_types,idgross_up_excludedarraygross_up_excluded.*Rule::in(array_keys(self::GROSS_UP_EXCLUSIONS))tax_methodrequiredrequired|in:monthly,accumulative,distributedslip_annual_typesarrayslip_annual_types.*$leaveTypeslip_sick_typesarrayslip_sick_types.*$leaveTypeslip_taken_typesarrayslip_taken_types.*$leaveTypeneg_settlement_name_ennullable|string|'max:' . \App\Support\Limits::chars(100)neg_settlement_name_arnullable|string|'max:' . \App\Support\Limits::chars(100)neg_deduction_name_ennullable|string|'max:' . \App\Support\Limits::chars(100)neg_deduction_name_arnullable|string|'max:' . \App\Support\Limits::chars(100)payslip_headernullable|string|'max:' . \App\Support\Limits::chars(500)payslip_footernullable|string|'max:' . \App\Support\Limits::chars(500)ss_basenullable|in:basic,grossadvance_calc_baserequiredrequired|Rule::in(array_keys(self::advanceBases()))advance_sliprequiredrequired|in:regular,advanceadvance_allowance_type_idsnullable|arrayadvance_allowance_type_ids.*integer|exists:transaction_types,ides_reimburse_type_idRule::requiredIf($reimburse)|nullable|$typees_calc_baserequiredrequired|in:30,calendares_included_type_idsnullable|arrayes_included_type_ids.*integer|$typeExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payroll-settings/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"payroll_cutoff_day":1,"day_base_absence":"...","day_base_unpaid":"...","day_base_overtime":"...","day_base_vacation":"...","absence_calc_mode":"...","unpaid_calc_mode":"...","gross_up_rate_on":"net","gross_up_type_id":"...","gross_up_excluded":[],"tax_method":"monthly","slip_annual_types":[],"slip_sick_types":[],"slip_taken_types":[],"neg_settlement_name_en":"...","neg_settlement_name_ar":"...","neg_deduction_name_en":"...","neg_deduction_name_ar":"...","payslip_header":"...","payslip_footer":"...","ss_base":"basic","advance_calc_base":"...","advance_slip":"regular","advance_allowance_type_ids":[],"es_reimburse_type_id":"...","es_calc_base":"30","es_included_type_ids":[]}'
payslips 3 endpoints
-
GET
/api/v1/app/companies/{company}/payslips/{payslip}A payslip: my own once its run is approved, or any in my payroll scope.A payslip: my own once its run is approved, or any in my payroll scope.
- Sign-in
- App token or company API key
- Permission
self.payslips.view | payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.payslipinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payslips/{payslip}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/payslips/{payslip}/pdfThe payslip as a PDF file (application/pdf), with the same access as showPayslip; lang=en|...The payslip as a PDF file (application/pdf), with the same access as showPayslip; lang=en|ar picks its language.
- Sign-in
- App token or company API key
- Permission
self.payslips.download | payroll.runs.view- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.payslipinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payslips/{payslip}/pdf" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/payslips/{payslip}/adjustment- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.payslipinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
adjustmentrequiredrequired|numericnotenullable|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/payslips/{payslip}/adjustment" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"adjustment":1.5,"note":"..."}'
pending-biometrics 3 endpoints
-
GET
/api/v1/app/companies/{company}/pending-biometricsNew biometrics and conflicts waiting for HR, each with the devices a publish reaches and t...New biometrics and conflicts waiting for HR, each with the devices a publish reaches and the ones that can't take it.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/pending-biometrics" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/pending-biometrics/publish-allEvery pending biometric, one employee's (employee_id) or the ticked people's (employee_ids...Every pending biometric, one employee's (employee_id) or the ticked people's (employee_ids).
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idsnullable|arrayemployee_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/pending-biometrics/publish-all" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_ids":[]}' -
POST
/api/v1/app/companies/{company}/pending-biometrics/{template}/decideaction publish (device_ids for chosen devices only), source_only or reject.action publish (device_ids for chosen devices only), source_only or reject.
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|in:publish,source_only,rejectdevice_idsnullable|arraydevice_ids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/pending-biometrics/{template}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"publish","device_ids":[]}'
people 2 endpoints
-
GET
/api/v1/app/companies/{company}/people/{user}/accessSee as them: everything a person has on the web and in the app. ?about=employee id for the...See as them: everything a person has on the web and in the app. ?about=employee id for the field levels about one employee.
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/people/{user}/access" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/people/{user}/access/explainWhy is this open? ?permission=keyWhy is this open? ?permission=key
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userinteger The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
permissionrequiredrequired|string|Rule::in(\App\Models\Role::allPermissions())Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/people/{user}/access/explain?permission=..." \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
performance-kpis 1 endpoint
-
GET
/api/v1/app/companies/{company}/performance-kpis- Sign-in
- App token or company API key
- Permission
performance.view | performance.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/performance-kpis" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
performance-setup 1 endpoint
-
GET
/api/v1/app/companies/{company}/performance-setup/{kind}One list of setup records: templates, general_factors, okr_templates, rating_types, compet...One list of setup records: templates, general_factors, okr_templates, rating_types, competency categories, levels, competencies, position_competencies.
- Sign-in
- App token or company API key
- Permission
performance.view | performance.manage.* | performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.kindstring · evaluation-templates|general-factor-templates|okr-templates|rating-types|categories|levels|competencies|position-competencies The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/performance-setup/{kind}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
permission-groups 4 endpoints
-
GET
/api/v1/app/companies/{company}/permission-groups- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-groups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/permission-groups- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$group ? 'sometimes' : 'required'|arrayname.en$group ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)descriptionnullable|arraydescription.*nullable|string|max:300is_activesometimes|booleanbranch_idssometimes|nullable|arraybranch_ids.*integer|exists:branches,idunit_rulessometimes|nullable|arrayunit_rules.*arrayunit_rules.*.*integer|exists:org_units,idpeoplesometimes|nullable|arraypeople.*integer|exists:employees,idmanager_role_idsometimes|$roleRuleteam_leader_role_idsometimes|$roleRuleemployee_role_idsometimes|$roleRuleExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-groups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":[],"is_active":true,"branch_ids":[],"unit_rules":[],"people":[],"manager_role_id":"...","team_leader_role_id":"...","employee_role_id":"..."}' -
PATCH
/api/v1/app/companies/{company}/permission-groups/{group}- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$group ? 'sometimes' : 'required'|arrayname.en$group ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)descriptionnullable|arraydescription.*nullable|string|max:300is_activesometimes|booleanbranch_idssometimes|nullable|arraybranch_ids.*integer|exists:branches,idunit_rulessometimes|nullable|arrayunit_rules.*arrayunit_rules.*.*integer|exists:org_units,idpeoplesometimes|nullable|arraypeople.*integer|exists:employees,idmanager_role_idsometimes|$roleRuleteam_leader_role_idsometimes|$roleRuleemployee_role_idsometimes|$roleRuleExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":[],"is_active":true,"branch_ids":[],"unit_rules":[],"people":[],"manager_role_id":"...","team_leader_role_id":"...","employee_role_id":"..."}' -
DELETE
/api/v1/app/companies/{company}/permission-groups/{group}- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.groupinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-groups/{group}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
permission-overrides 3 endpoints
-
GET
/api/v1/app/companies/{company}/permission-overridesOne person's exceptions, or everyone's.One person's exceptions, or everyone's.
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-overrides" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/permission-overridesSets a person's exception; both channels empty take it off (data is then null).Sets a person's exception; both channels empty take it off (data is then null).
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
user_idrequiredrequired|integerkindrequiredrequired|in:action,fieldsubjectrequiredrequired|string|Rule::in($kind === \App\Models\PermissionOverride::FIELD ? \App\Tenancy\FieldAcc...webnullable|Rule::in($values)appnullable|Rule::in($values)scopenullable|in:company,branch,department,work_location,section,project,hierarchy_group,business_unit,division,segment,reports,team,reports_ofscope_idnullable|integerreasonnullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-overrides" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"user_id":1,"kind":"action","subject":"...","web":"...","app":"...","scope":"company","scope_id":1,"reason":"..."}' -
DELETE
/api/v1/app/companies/{company}/permission-overrides/{override}- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.overrideinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/permission-overrides/{override}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
plan-actions 2 endpoints
-
PATCH PUT
/api/v1/app/companies/{company}/plan-actions/{action}Fields not sent stay as they are.Fields not sent stay as they are.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.successors.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.actioninteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|string|max:255kindnullable|in:training,mentoring,assignment,project,otherowner_idnullable|integer|exists:employees,iddue_datenullable|datestatusnullable|in:planned,in_progress,doneprogressnullable|integer|between:0,100competency_idnullable|integer|exists:competencies,idnotesnullable|string|'max:' . \App\Support\Limits::chars(2000)Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/plan-actions/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":"...","kind":"training","owner_id":1,"due_date":"2026-11-01","status":"planned","progress":1,"competency_id":1,"notes":"..."}' -
DELETE
/api/v1/app/companies/{company}/plan-actions/{action}- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.successors.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.actioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/plan-actions/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
position-competencies 2 endpoints
-
POST
/api/v1/app/companies/{company}/position-competenciesposition_id, competency_id, required_level, weight.position_id, competency_id, required_level, weight.
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
position_idrequiredrequired|integer|exists:positions,idcompetency_idrequiredrequired|integer|exists:competencies,idrequired_levelrequiredrequired|integer|'between:1,' . \App\Models\CompetencyLevel::scale()weightnullable|numeric|min:0|max:100Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/position-competencies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"position_id":1,"competency_id":1,"required_level":1,"weight":1.5}' -
DELETE
/api/v1/app/companies/{company}/position-competencies/{link}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.linkinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/position-competencies/{link}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
positions 3 endpoints
-
GET
/api/v1/app/companies/{company}/positions- Sign-in
- App token or company API key
- Permission
positions.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/positions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/positions- Sign-in
- App token or company API key
- Permission
positions.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$position ? 'sometimes' : 'required'|arrayname.en$position ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)codenullable|alpha_dash|max:30is_activesometimes|booleanjob_descriptionnullable|string|max:20000job_role_typesometimes|in:regular,hazardouscompany_levelsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/positions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"code":"...","is_active":true,"job_description":"...","job_role_type":"regular","company_level":true}' -
PATCH
/api/v1/app/companies/{company}/positions/{position}- Sign-in
- App token or company API key
- Permission
positions.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.positioninteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$position ? 'sometimes' : 'required'|arrayname.en$position ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(120)name.arnullable|string|'max:' . \App\Support\Limits::chars(120)codenullable|alpha_dash|max:30is_activesometimes|booleanjob_descriptionnullable|string|max:20000job_role_typesometimes|in:regular,hazardouscompany_levelsometimes|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/positions/{position}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"code":"...","is_active":true,"job_description":"...","job_role_type":"regular","company_level":true}'
potential-assessments 2 endpoints
-
POST
/api/v1/app/companies/{company}/potential-assessmentsemployee_id, rating (low|medium|high), criteria {learning_agility, leadership, drive, adap...employee_id, rating (low|medium|high), criteria {learning_agility, leadership, drive, adaptability, aspiration: 1–5}, notes, evaluation_cycle_id, assessed_on.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integer|exists:employees,idratingrequiredrequired|in:low,medium,highcriterianullable|arraycriteria.*nullable|integer|between:1,5notesnullable|string|'max:' . \App\Support\Limits::chars(2000)evaluation_cycle_idnullable|integer|exists:evaluation_cycles,idassessed_onnullable|date|before_or_equal:todayExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/potential-assessments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"rating":"low","criteria":[],"notes":"...","evaluation_cycle_id":1,"assessed_on":"2026-11-01"}' -
DELETE
/api/v1/app/companies/{company}/potential-assessments/{assessment}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assessmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/potential-assessments/{assessment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
professional-data 3 endpoints
-
POST
/api/v1/app/companies/{company}/professional-data/{record}/cancel- Sign-in
- App token or company API key
- Permission
employees.edit- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.recordinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/professional-data/{record}/cancel" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/professional-data/{record}- Sign-in
- App token or company API key
- Permission
employees.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.recordinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/professional-data/{record}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/professional-data/{record}- Sign-in
- App token or company API key
- Permission
employees.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.recordinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/professional-data/{record}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
projects 6 endpoints
-
GET
/api/v1/app/companies/{company}/projects- Sign-in
- App token or company API key
- Permission
projects.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/projects" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/projects- Sign-in
- App token or company API key
- Permission
projects.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
coderequiredrequired|string|max:30|unique:org_units,codenamerequiredrequired|arrayname.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)clientnullable|string|max:150group_namenullable|string|max:150group_codenullable|string|max:30entity_codenullable|string|max:30manager_idnullable|integer|exists:employees,idstart_datenullable|dateend_datenullable|date|after_or_equal:start_datebudget_hoursnullable|numeric|min:0cost_center_idnullable|integer|exists:cost_centers,idstatusrequiredrequired|Rule::in(self::STATUSES)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/projects" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"code":"...","name":{"ar":"...","en":"..."},"client":"...","group_name":"...","group_code":"...","entity_code":"...","manager_id":1,"start_date":"2026-11-01","end_date":"2026-11-01","budget_hours":1.5,"cost_center_id":1,"status":"..."}' -
GET
/api/v1/app/companies/{company}/projects/{project}- Sign-in
- App token or company API key
- Permission
projects.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.projectinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/projects/{project}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/projects/{project}- Sign-in
- App token or company API key
- Permission
projects.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.projectinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/projects/{project}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/projects/{project}/assignments- Sign-in
- App token or company API key
- Permission
projects.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.projectinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerposition_idnullable|integer|exists:positions,idcontribution_percentrequiredrequired|numeric|min:0|max:100staff_codenullable|string|max:30start_datenullable|dateend_datenullable|date|after_or_equal:start_dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/projects/{project}/assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"position_id":1,"contribution_percent":1.5,"staff_code":"...","start_date":"2026-11-01","end_date":"2026-11-01"}' -
DELETE
/api/v1/app/companies/{company}/projects/{project}/assignments/{assignment}- Sign-in
- App token or company API key
- Permission
projects.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.projectinteger The record's ID. assignmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/projects/{project}/assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
proof 3 endpoints
-
POST
/api/v1/app/companies/{company}/proof/time-anchorbody: device_id, boot_id, elapsed_ms (the phone's since-boot clock as it asks).body: device_id, boot_id, elapsed_ms (the phone's since-boot clock as it asks).
- Sign-in
- App token or company API key
- Permission
self.tasks.capture | self.field_capture- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
device_idrequiredrequired|string|max:100boot_idnullable|string|max:100elapsed_msnullable|integer|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/proof/time-anchor" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"device_id":"...","boot_id":"...","elapsed_ms":1}' -
POST
/api/v1/app/companies/{company}/proof/device-keys/challenge- Sign-in
- App token or company API key
- Permission
self.tasks.capture | self.field_capture- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/proof/device-keys/challenge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/proof/device-keysdevice_id, public_key (base64 SPKI P-256), platform, challenge, attestation {android_key_c...device_id, public_key (base64 SPKI P-256), platform, challenge, attestation {android_key_chain | ios_app_attest {key_id, attestation_object}}.
- Sign-in
- App token or company API key
- Permission
self.tasks.capture | self.field_capture- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/proof/device-keys" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
provisions 5 endpoints
-
GET
/api/v1/app/companies/{company}/provisionsRows: month (YYYY-MM, default this month) or from / to; stb_types[], contract_type, employ...Rows: month (YYYY-MM, default this month) or from / to; stb_types[], contract_type, employee_status, kind, and the org filters (branch, department, …) of the screens.
- Sign-in
- App token or company API key
- Permission
payroll.provisions.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/provisions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/provisions/monthsThe calculated months (last 24) with the people, the month's provisions and the running to...The calculated months (last 24) with the people, the month's provisions and the running total, for the employees in scope.
- Sign-in
- App token or company API key
- Permission
payroll.provisions.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/provisions/months" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/provisions- Sign-in
- App token or company API key
- Permission
payroll.provisions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/provisions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/provisions/bulk-deleteids[]: an earlier month a later one builds on stays (deleted < chosen).ids[]: an earlier month a later one builds on stays (deleted < chosen).
- Sign-in
- App token or company API key
- Permission
payroll.provisions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
idsrequiredrequired|arrayids.*integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/provisions/bulk-delete" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ids":[]}' -
DELETE
/api/v1/app/companies/{company}/provisions/{month}- Sign-in
- App token or company API key
- Permission
payroll.provisions.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.monthstring · [0-9]{4}-[0-9]{2} The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/provisions/{month}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
rating-types 3 endpoints
-
POST
/api/v1/app/companies/{company}/rating-typesname {en, ar}, units [{id?, name {en, ar}}].name {en, ar}, units [{id?, name {en, ar}}].
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/rating-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/rating-types/{type}name {en, ar}, units [{id?, name {en, ar}}].name {en, ar}, units [{id?, name {en, ar}}].
- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/rating-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/rating-types/{type}- Sign-in
- App token or company API key
- Permission
performance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typeinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/rating-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
recruitment 56 endpoints
-
POST
/api/v1/app/companies/{company}/recruitment/interviews/{interview}/scorecardA panel member's own scorecard: ratings [{criterion, rating}], overall 1–5, recommendation...A panel member's own scorecard: ratings [{criterion, rating}], overall 1–5, recommendation, notes.
- Sign-in
- App token or company API key
- Permission
self.interviews | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.interviewinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
ratingsnullable|array|max:20ratings.*.criterionrequiredrequired|string|'max:' . \App\Support\Limits::chars(120)ratings.*.ratingrequiredrequired|integer|between:1,5overallrequiredrequired|integer|between:1,5recommendationrequiredrequired|in:strong_yes,yes,no,strong_nonotesnullable|string|'max:' . \App\Support\Limits::chars(5000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/interviews/{interview}/scorecard" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ratings":[],"overall":1,"recommendation":"strong_yes","notes":"..."}' -
POST
/api/v1/app/companies/{company}/recruitment/offers/{offer}/decidedecision: approve or reject, note (needed to reject). Needs recruitment.approve_offers.decision: approve or reject, note (needed to reject). Needs recruitment.approve_offers.
- Sign-in
- App token or company API key
- Permission
recruitment.approve_offers- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.offerinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/offers/{offer}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/offersFilter: status.Filter: status.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.* | recruitment.approve_offers- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/offers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/offers/{offer}- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.* | recruitment.approve_offers- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.offerinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/offers/{offer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/dashboardFilters: from, to (dates, default the last 90 days), job.Filters: from, to (dates, default the last 90 days), job.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/dashboard" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/pipelineThe board: the stages and who is in each, for one job or all that are open, with what the...The board: the stages and who is in each, for one job or all that are open, with what the person may see and whether they may move people. The app's pipeline screen and list_recruitment_ats kind pipeline.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/pipeline" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/poolFilters: q (name, email, skills, tags), tag.Filters: q (name, email, skills, tags), tag.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/pool" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/availabilityFilter: employee.Filter: employee.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/availability" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/interviews/{interview}/ics- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.interviewinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/interviews/{interview}/ics" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/templates- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/assessmentsA candidate's tests: status, best result, pass or fail, the gate and the link.A candidate's tests: status, best result, pass or fail, the gate and the link.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/assessments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/stage-assessmentsThe test each pipeline stage sends, and its gate.The test each pipeline stage sends, and its gate.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/stage-assessments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/settingsAI switches, the candidate email language, and which accounts are connected (secrets are n...AI switches, the candidate email language, and which accounts are connected (secrets are never returned).
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/summaryCounts, and whether the careers page is on, with its address.Counts, and whether the careers page is on, with its address.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/summary" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/jobsFilters: status, type, department, branch, q.Filters: status, type, department, branch, q.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/jobs/{job}A job opening and its candidates by stage.A job opening and its candidates by stage.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/candidatesFilters: job, stage, source, q.Filters: job, stage, source, q.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}A candidate with notes and interviews.A candidate with notes and interviews.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/cv- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/cv" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/recruitment/interviewsFilters: status (scheduled, done, cancelled), from, to (dates), candidate.Filters: status (scheduled, done, cancelled), from, to (dates), candidate.
- Sign-in
- App token or company API key
- Permission
recruitment.view | recruitment.manage.*- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/interviews" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/recruitment/careersenabled: true or false.enabled: true or false.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/careers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/jobstitle {en, ar}, department_id, branch_id, position_id, employment_type, description, requi...title {en, ar}, department_id, branch_id, position_id, employment_type, description, requirements, positions, closing_date, status.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)title.arnullable|string|'max:' . \App\Support\Limits::chars(150)department_idnullable|integer|exists:org_units,idbranch_idnullable|integer|exists:branches,idposition_idnullable|integer|exists:positions,idemployment_typerequiredrequired|in:full_time,part_time,contract,internshipdescriptionrequiredrequired|string|max:5000requirementsnullable|string|max:5000description_arnullable|string|max:5000requirements_arnullable|string|max:5000in_job_feednullable|booleanpositionsrequiredrequired|integer|between:1,100closing_datenullable|datestatusrequiredrequired|in:draft,open,closedExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"department_id":1,"branch_id":1,"position_id":1,"employment_type":"full_time","description":"...","requirements":"...","description_ar":"...","requirements_ar":"...","in_job_feed":true,"positions":1,"closing_date":"2026-11-01","status":"draft"}' -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/jobs/{job}- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/recruitment/jobs/{job}- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/jobs/{job}/candidatesname, email, phone, source, cover_note, cv (file).name, email, phone, source, cover_note, cv (file).
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:150emailrequiredrequired|email|max:150|unique:candidates,emailphonenullable|string|max:30sourcerequiredrequired|in:careers_page,referral,linkedin,job_board,othercover_notenullable|string|max:3000ratingnullable|integer|between:1,5expected_salarynullable|numeric|min:0|max:999999999expected_salary_currencynullable|string|size:3cvnullable|file|max:10240|mimes:pdf,doc,docxExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}/candidates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "name=..." \ -F "[email protected]" \ -F "phone=..." \ -F "source=careers_page" \ -F "cover_note=..." \ -F "rating=1" \ -F "expected_salary=1.5" \ -F "expected_salary_currency=..." \ -F "[email protected]" -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}stage (not hired: use hire), rejection_reason, rating 1–5.stage (not hired: use hire), rejection_reason, rating 1–5.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
stagerequiredsometimes|required|Rule::in(array_diff(\App\Models\Candidate::STAGES, ['hired']))ratingsometimes|nullable|integer|between:1,5rejection_reasonsometimes|nullable|string|'max:' . \App\Support\Limits::chars(500)expected_salarysometimes|nullable|numeric|min:0|max:999999999expected_salary_currencysometimes|nullable|string|size:3Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"stage":"...","rating":1,"rejection_reason":"...","expected_salary":1.5,"expected_salary_currency":"..."}' -
DELETE
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/notesbody.body.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
bodyrequiredrequired|string|'max:' . \App\Support\Limits::chars(3000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/notes" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"body":"..."}' -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/interviewsinterviewer_id (employee), panel_ids, scheduled_at, kind (onsite, video, phone), duration_...interviewer_id (employee), panel_ids, scheduled_at, kind (onsite, video, phone), duration_minutes, location, video_provider (zoom, google_meet, teams, manual), video_link.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.interviews.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/interviews" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/interviews/{interview}status, rating, feedback, video_link, location.status, rating, feedback, video_link, location.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.interviews.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.interviewinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusrequiredsometimes|required|Rule::in(array_diff(\App\Models\Interview::STATUSES, ['awaiting_booking']))ratingsometimes|nullable|integer|between:1,5feedbacksometimes|nullable|string|max:3000video_linksometimes|nullable|url|max:500locationsometimes|nullable|string|max:255Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/interviews/{interview}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"status":"...","rating":1,"feedback":"...","video_link":"...","location":"..."}' -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/hireMake the employee record: employee_number, hire_date, branch_id, department_id, position_i...Make the employee record: employee_number, hire_date, branch_id, department_id, position_id, manager_id, basic_salary, create_login.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.hire- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/hire" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/stagestage, reason (for rejected).stage, reason (for rejected).
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.move- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/stage" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/bulkids, action (move, reject, tag, untag, pool, unpool, email, delete), stage, reason, tags,...ids, action (move, reject, tag, untag, pool, unpool, email, delete), stage, reason, tags, template, send_email.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionrequiredrequired|Rule::in(self::BULK_ACTIONS)idsrequiredrequired|array|max:500ids.*integerstagerequired_if:action,move|nullable|Rule::in(array_diff(\App\Models\Candidate::STAGES, ['hired']))reasonnullable|string|'max:' . \App\Support\Limits::chars(500)tagsrequired_if:action,tag|required_if:action,untag|nullabletemplaterequired_if:action,email|nullable|in:applied,screening,interview,offer,hired,rejectedExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/bulk" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"action":"...","ids":[],"stage":"...","reason":"...","tags":"...","template":"applied"}' -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/profiletags, in_talent_pool, linkedin_url.tags, in_talent_pool, linkedin_url.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
tagssometimes|nullablein_talent_poolsometimes|booleanlinkedin_urlsometimes|nullable|url|max:255|regex:#^https://([a-z]+\.)?linkedin\.com/#iExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/profile" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"tags":"...","in_talent_pool":true,"linkedin_url":"..."}' -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/emailtemplate: the stage whose email to send.template: the stage whose email to send.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/email" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/add-to-jobjob_opening_id: puts a pool or past candidate forward for a job (a new candidate on that j...job_opening_id: puts a pool or past candidate forward for a job (a new candidate on that job).
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/add-to-job" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/poolname, email, phone, linkedin_url, tags, source, cover_note, cv (file).name, email, phone, linkedin_url, tags, source, cover_note, cv (file).
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:150emailrequiredrequired|email|max:150|unique:candidates,emailphonenullable|string|max:30linkedin_urlnullable|url|max:255|regex:#^https://([a-z]+\.)?linkedin\.com/#isourcenullable|in:careers_page,referral,linkedin,job_board,othercover_notenullable|string|max:3000tagsnullablecvnullable|file|max:10240|mimes:pdf,doc,docxExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/pool" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "name=..." \ -F "[email protected]" \ -F "phone=..." \ -F "linkedin_url=..." \ -F "source=careers_page" \ -F "cover_note=..." \ -F "tags=..." \ -F "[email protected]" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/ai/parse- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/ai/parse" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/ai/match- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/ai/match" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/jobs/{job}/ai/rankrefresh: score everyone again. Returns the job's active candidates, best match first.refresh: score everyone again. Returns the job's active candidates, best match first.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}/ai/rank" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/jobs/{job}/ai/questionscount (3–15).count (3–15).
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}/ai/questions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/ai/job-drafttitle, department, employment_type, notes → description {en, ar}, requirements {en, ar}.title, department, employment_type, notes → description {en, ar}, requirements {en, ar}.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|string|max:150departmentnullable|string|max:150employment_typenullable|in:full_time,part_time,contract,internshipnotesnullable|string|'max:' . \App\Support\Limits::chars(2000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/ai/job-draft" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":"...","department":"...","employment_type":"full_time","notes":"..."}' -
POST
/api/v1/app/companies/{company}/recruitment/jobs/{job}/linkedinPosts the job to the company's LinkedIn page; without a connected page answers with the sh...Posts the job to the company's LinkedIn page; without a connected page answers with the share link.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.jobs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.jobinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/jobs/{job}/linkedin" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/bookinginterviewer_id, panel_ids, kind, duration_minutes, location, video_provider, video_link, b...interviewer_id, panel_ids, kind, duration_minutes, location, video_provider, video_link, booking_from, booking_to.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.interviews.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/booking" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/recruitment/availability/{employee}windows: [{weekday 0–6 (Sunday = 0), starts_at HH:MM, ends_at HH:MM}], replacing the emplo...windows: [{weekday 0–6 (Sunday = 0), starts_at HH:MM, ends_at HH:MM}], replacing the employee's.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.interviews.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/availability/{employee}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/offersoffer_template_id, salary_package_id, job_title {en, ar}, start_date, basic_salary, curren...offer_template_id, salary_package_id, job_title {en, ar}, start_date, basic_salary, currency, items [{type, transaction_type_id, name {en, ar}, amount}], expires_on, language, body_en, body_ar.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.offers.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/offers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/offers/{offer}- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.offers.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.offerinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/offers/{offer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/offers/{offer}/{action}action: submit, send, withdraw.action: submit, send, withdraw.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.offers.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.offerinteger The record's ID. actionstring · submit|send|withdraw The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/offers/{offer}/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/offers/{offer}/convertemployee_number, branch_id, department_id, position_id, manager_id, create_login, boarding...employee_number, branch_id, department_id, position_id, manager_id, create_login, boarding_template_id.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.hire- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.offerinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
boarding_template_idinteger|exists:boarding_templates,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/offers/{offer}/convert" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"boarding_template_id":1}' -
PUT
/api/v1/app/companies/{company}/recruitment/templates/emails/{stage}subject {en, ar}, body {en, ar}, auto_send.subject {en, ar}, body {en, ar}, auto_send.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.stagestring · applied|screening|interview|offer|hired|rejected|assessment The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/templates/emails/{stage}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/recruitment/candidates/{candidate}/assessmentsassessment_id, due_date (Y-m-d), pass_stage, fail_stage, locale: sends the link by the "As...assessment_id, due_date (Y-m-d), pass_stage, fail_stage, locale: sends the link by the "Assessment" email.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.candidates.manage | assessments.invite- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.candidateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
assessment_idrequiredrequired|integerdue_datenullable|date|after_or_equal:todaypass_stagenullable|Rule::in(self::gateStages())fail_stagenullable|Rule::in(self::gateStages())localenullable|in:en,arExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/candidates/{candidate}/assessments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"assessment_id":1,"due_date":"2026-11-01","pass_stage":"...","fail_stage":"...","locale":"en"}' -
PUT
/api/v1/app/companies/{company}/recruitment/stage-assessments{stage: {assessment_test_id (null removes), auto_send, pass_stage, fail_stage, due_days}}...{stage: {assessment_test_id (null removes), auto_send, pass_stage, fail_stage, due_days}} (or under "stages").
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
stagesarraystages.*arraystages.*.assessment_test_idnullable|integer|exists:assessment_tests,idstages.*.auto_sendnullable|booleanstages.*.pass_stagenullable|Rule::in(self::gateStages())stages.*.fail_stagenullable|Rule::in(self::gateStages())stages.*.due_daysnullable|integer|between:1,90Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/stage-assessments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"stages":[]}' -
POST
/api/v1/app/companies/{company}/recruitment/templates/offersname {en, ar}, body {en, ar}, active.name {en, ar}, body {en, ar}, active.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arnullable|string|'max:' . \App\Support\Limits::chars(150)bodyrequiredrequired|arraybody.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(20000)body.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(20000)activenullable|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/templates/offers" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"body":{"en":"...","ar":"..."},"active":true}' -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/templates/offers/{template}name {en, ar}, body {en, ar}, active.name {en, ar}, body {en, ar}, active.
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arnullable|string|'max:' . \App\Support\Limits::chars(150)bodyrequiredrequired|arraybody.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(20000)body.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(20000)activenullable|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/templates/offers/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"body":{"en":"...","ar":"..."},"active":true}' -
DELETE
/api/v1/app/companies/{company}/recruitment/templates/offers/{template}- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/templates/offers/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH PUT
/api/v1/app/companies/{company}/recruitment/settingsai_enabled, ai_candidate_data, ai_auto_parse, recruitment_email_language (en, ar, both).ai_enabled, ai_candidate_data, ai_auto_parse, recruitment_email_language (en, ar, both).
- Sign-in
- App token or company API key
- Permission
recruitment.manage.* | recruitment.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
ai_enabledsometimes|booleanai_candidate_datasometimes|booleanai_auto_parsesometimes|booleanrecruitment_email_languagesometimes|in:en,ar,bothExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/recruitment/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"ai_enabled":true,"ai_candidate_data":true,"ai_auto_parse":true,"recruitment_email_language":"en"}'
regional-settings 2 endpoints
-
GET
/api/v1/app/companies/{company}/regional-settings- Sign-in
- App token or company API key
- Permission
settings.manage | branches.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/regional-settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/regional-settings- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/regional-settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
reports 5 endpoints
-
GET
/api/v1/app/companies/{company}/reportsGET reports: the reports by group (the ones the person may run, and the ones coming with a...GET reports: the reports by group (the ones the person may run, and the ones coming with a module), their saved options.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/reports" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/reports/{report}GET reports/{report}: its filters with their options, columns, switches and exports.GET reports/{report}: its filters with their options, columns, switches and exports.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/reports/{report}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET POST
/api/v1/app/companies/{company}/reports/{report}/runGET|POST reports/{report}/run: the filters as the screen's query keys (multi filters as ar...GET|POST reports/{report}/run: the filters as the screen's query keys (multi filters as arrays, date ranges as key_from / key_to), cols, show, show_zero, saved_id to start from saved options, limit (rows per table, 500 by default, 5000 at most), format=csv|xlsx for a file, or one of the report's own exports (xlsx_colored for the Salaries report).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportstring · [a-z_]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/reports/{report}/run" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/reports/{report}/queuePOST reports/{report}/queue: format xlsx|csv and the run's options; the file is built in t...POST reports/{report}/queue: format xlsx|csv and the run's options; the file is built in the background (202).
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportstring · [a-z_]+ The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
formatrequiredrequired|in:xlsx,csvExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/reports/{report}/queue" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"format":"xlsx"}' -
POST
/api/v1/app/companies/{company}/reports/{report}/savedPOST reports/{report}/saved: {name, options: {…the run input…}}.POST reports/{report}/saved: {name, options: {…the run input…}}.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.reportstring · [a-z_]+ The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:100optionsnullable|arrayExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/reports/{report}/saved" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","options":[]}'
request-types 1 endpoint
-
GET
/api/v1/app/companies/{company}/request-typesThe request types this company offers, with the fields each asks for and their choices (fo...The request types this company offers, with the fields each asks for and their choices (for my own requests).
- Sign-in
- App token or company API key
- Permission
self.requests.file | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/request-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
requests 6 endpoints
-
POST
/api/v1/app/companies/{company}/requests/{type}File a request of a type: its fields, an attachment (multipart), and employee_id to file f...File a request of a type: its fields, an attachment (multipart), and employee_id to file for someone else.
- Sign-in
- App token or company API key
- Permission
self.requests.file | requests.manage- Module
hrm- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typestring · [a-z_]+ The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
attachmentnullable|file|max:10240|mimes:pdf,jpg,jpeg,png,doc,docxemployee_idnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/requests/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" \ -F "employee_id=1" -
GET
/api/v1/app/companies/{company}/requests/{employeeRequest}- Sign-in
- App token or company API key
- Permission
self.requests.view | self.approvals.decide | requests.view | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/requests/{employeeRequest}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/requests/{employeeRequest}/attachment- Sign-in
- App token or company API key
- Permission
self.requests.view | self.approvals.decide | requests.view | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/requests/{employeeRequest}/attachment" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/requests/{employeeRequest}/approval-cycleGET requests/{id}/approval-cycle: ZenHR's "Approval Cycle" — every step, its approver, sta...GET requests/{id}/approval-cycle: ZenHR's "Approval Cycle" — every step, its approver, status, times and note (ApprovalCycle).
- Sign-in
- App token or company API key
- Permission
self.requests.view | self.approvals.decide | requests.view | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/requests/{employeeRequest}/approval-cycle" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/requests/{employeeRequest}/decideDecide the step a request waits on: decision approved|rejected, decision_note.Decide the step a request waits on: decision approved|rejected, decision_note.
- Sign-in
- App token or company API key
- Permission
self.approvals.decide | requests.manage | leaves.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/requests/{employeeRequest}/decide" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/requests/{employeeRequest}/withdrawWithdraw my pending request.Withdraw my pending request.
- Sign-in
- App token or company API key
- Permission
self.requests.cancel | requests.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.employeeRequestinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/requests/{employeeRequest}/withdraw" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
role-assignments 3 endpoints
-
GET
/api/v1/app/companies/{company}/role-assignments- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/role-assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/role-assignmentsGive a role to an employee's sign-in account: employee_id, role_id, scope, scope_id.Give a role to an employee's sign-in account: employee_id, role_id, scope, scope_id.
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
role_idrequiredrequired|integer|exists:roles,idscoperequiredrequired|in:company,branch,department,work_location,section,project,hierarchy_group,business_unit,division,segment,reports,team,reports_ofscope_idRule::requiredIf(in_array($input['scope'] ?? null, self::TARGETED, true))|nullable|integer|match ($input['scope'] ?? null) { 'branch' => Rule::exists('branches', 'id')...Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/role-assignments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"role_id":1,"scope":"company","scope_id":1}' -
DELETE
/api/v1/app/companies/{company}/role-assignments/{assignment}- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.assignmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/role-assignments/{assignment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
roles 7 endpoints
-
GET
/api/v1/app/companies/{company}/roles/{role}/matrixA role's whole table of web and app switches and field levels (docs/mobile-setup.md).A role's whole table of web and app switches and field levels (docs/mobile-setup.md).
- Sign-in
- App token or company API key
- Permission
setup.roles.permissions- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.roleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles/{role}/matrix" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/roles/{role}/matrixChanges the rows sent, the rest stays; the same rules as saving a role (nobody gives what...Changes the rows sent, the rest stays; the same rules as saving a role (nobody gives what they don't have).
- Sign-in
- App token or company API key
- Permission
setup.roles.permissions- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.roleinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionssometimes|arrayactions.*arrayfieldssometimes|arrayfields.*arrayExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles/{role}/matrix" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"actions":[],"fields":[]}' -
GET
/api/v1/app/companies/{company}/roles- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/roles- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$role ? 'sometimes' : 'required'|arrayname.en$role ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(80)name.arnullable|string|'max:' . \App\Support\Limits::chars(80)descriptionnullable|arraydescription.*nullable|string|max:300permissions$role ? 'sometimes' : 'required'|array|$role?->isEveryone() ? 'min:0' : 'min:1'permissions.*Rule::in($role?->isEveryone() ? \App\Models\Role::selfPermissions() : \App\Model...channelssometimes|nullable|arraychannels.*in:both,web,app,nonefieldssometimes|nullable|arrayfields.*array:web,appfields.*.webrequiredrequired|in:hidden,view,editfields.*.apprequiredrequired|in:hidden,view,editis_activesometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":[],"permissions":[],"channels":[],"fields":[],"is_active":true}' -
PATCH
/api/v1/app/companies/{company}/roles/{role}- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.roleinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name$role ? 'sometimes' : 'required'|arrayname.en$role ? 'required_with:name' : 'required'|string|'max:' . \App\Support\Limits::chars(80)name.arnullable|string|'max:' . \App\Support\Limits::chars(80)descriptionnullable|arraydescription.*nullable|string|max:300permissions$role ? 'sometimes' : 'required'|array|$role?->isEveryone() ? 'min:0' : 'min:1'permissions.*Rule::in($role?->isEveryone() ? \App\Models\Role::selfPermissions() : \App\Model...channelssometimes|nullable|arraychannels.*in:both,web,app,nonefieldssometimes|nullable|arrayfields.*array:web,appfields.*.webrequiredrequired|in:hidden,view,editfields.*.apprequiredrequired|in:hidden,view,editis_activesometimes|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles/{role}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"description":[],"permissions":[],"channels":[],"fields":[],"is_active":true}' -
DELETE
/api/v1/app/companies/{company}/roles/{role}- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.roleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles/{role}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/roles/{role}/whereWhat a role shows on the web and in the app.What a role shows on the web and in the app.
- Sign-in
- App token or company API key
- Permission
roles.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.roleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/roles/{role}/where" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
salaries 5 endpoints
-
GET
/api/v1/app/companies/{company}/salariesFilters as the screen: year, month (1-12), salary_type (regular | off_cycle), run_status (...Filters as the screen: year, month (1-12), salary_type (regular | off_cycle), run_status (draft | pending | rejected | approved | sent), date_from / date_to (YYYY-MM), in_advance and in_advance_paid (yes | no), q, and the org filters.
- Sign-in
- App token or company API key
- Permission
payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salaries" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/salaries/calculateWhat Calculate offers for a month (?month=YYYY-MM, else the open one): the picker groups,...What Calculate offers for a month (?month=YYYY-MM, else the open one): the picker groups, the cut-off date range and the draft batches to add to.
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salaries/calculate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/salaries/calculateCalculate (payroll.manage): salary_type monthly | extra; month; picks[] (branch:<id>, empl...Calculate (payroll.manage): salary_type monthly | extra; month; picks[] (branch:<id>, employee:<id>, org:<id>); monthly: period_from / period_to, batch_id (an existing draft batch, else a new one), move_pending; extra: title, percent_of_basic.
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
salary_typenullable|in:monthly,extratitlerequiredrequired|string|max:100monthrequiredrequired|date_format:Y-mpercent_of_basicrequiredrequired|numeric|min:1|max:1000picksnullable|arraypicks.*stringdepartmentsnullable|arraydepartments.*integerbranchesnullable|arraybranches.*integeremployeesnullable|arrayemployees.*integerperiod_fromnullable|required_with:period_to|date_format:Y-m-dperiod_tonullable|required_with:period_from|date_format:Y-m-d|after_or_equal:period_frombatch_idnullable|integermove_pendingnullable|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salaries/calculate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"salary_type":"monthly","title":"...","month":"2026-11-01","percent_of_basic":1.5,"picks":[],"departments":[],"branches":[],"employees":[],"period_from":"2026-11-01","period_to":"2026-11-01","batch_id":1,"move_pending":true}' -
GET
/api/v1/app/companies/{company}/salaries/off-cycle-settlementGET salaries/off-cycle-settlement: who can get an off-cycle settlement (docs/payroll-settl...GET salaries/off-cycle-settlement: who can get an off-cycle settlement (docs/payroll-settlement-slips.md).
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salaries/off-cycle-settlement" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/salaries/off-cycle-settlementPOST salaries/off-cycle-settlement {employee_id}: the leaver's final settlement as its own...POST salaries/off-cycle-settlement {employee_id}: the leaver's final settlement as its own draft batch.
- Sign-in
- App token or company API key
- Permission
payroll.runs.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salaries/off-cycle-settlement" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1}'
salary-batches 1 endpoint
-
GET
/api/v1/app/companies/{company}/salary-batchesSalary Batches: year, month (1-12), salary_type (regular | off_cycle), run_status (draft |...Salary Batches: year, month (1-12), salary_type (regular | off_cycle), run_status (draft | pending | rejected | approved | sent).
- Sign-in
- App token or company API key
- Permission
payroll.runs.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-batches" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
salary-package-templates 6 endpoints
-
GET
/api/v1/app/companies/{company}/salary-package-templatesSalary package templates with their items (active=1 or 0 to filter).Salary package templates with their items (active=1 or 0 to filter).
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-package-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/salary-package-templatesA new template: name_en, name_ar, basic_salary, active, external_ref.A new template: name_en, name_ar, basic_salary, active, external_ref.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-package-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/salary-package-templates/{template}Changes only the given fields of a template.Changes only the given fields of a template.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)basic_salaryrequiredrequired|numeric|min:0external_refnullable|string|max:64Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-package-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","basic_salary":1.5,"external_ref":"..."}' -
DELETE
/api/v1/app/companies/{company}/salary-package-templates/{template}- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-package-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/salary-package-templates/{template}/itemsAn item: type allowance | deduction, transaction_type_id or name_en / name_ar, amount.An item: type allowance | deduction, transaction_type_id or name_en / name_ar, amount.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
typerequiredrequired|in:allowance,deductiontransaction_type_idnullable|exists:transaction_types,idname_ennullable|string|'max:' . \App\Support\Limits::chars(100)name_arnullable|string|'max:' . \App\Support\Limits::chars(100)amountrequiredrequired|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-package-templates/{template}/items" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"type":"allowance","transaction_type_id":"...","name_en":"...","name_ar":"...","amount":1.5}' -
DELETE
/api/v1/app/companies/{company}/salary-package-templates/{template}/items/{item}- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. iteminteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-package-templates/{template}/items/{item}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
salary-packages-screening 1 endpoint
-
GET
/api/v1/app/companies/{company}/salary-packages-screeningSalary packages screening: active_employees, effective_from, effective_to, approval_status...Salary packages screening: active_employees, effective_from, effective_to, approval_status, package_status and the org filters; paged.
- Sign-in
- App token or company API key
- Permission
payroll.salary_packages.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
effective_fromnullable|dateeffective_tonullable|dateExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-packages-screening?effective_from=2026-11-01&effective_to=2026-11-01" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
salary-scales 8 endpoints
-
GET
/api/v1/app/companies/{company}/salary-scalesScales, newest activation first; status filter.Scales, newest activation first; status filter.
- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/salary-scales- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arnullable|string|'max:' . \App\Support\Limits::chars(150)salary_range_layer$layerbenefits_layer$layertimeoffs_layer$layerexceed_range_percentnullable|numeric|between:0,1000exceed_benefits_percentnullable|numeric|between:0,1000compa_fromnullable|numeric|between:0,1000|required_with:compa_tocompa_tonullable|numeric|between:0,1000|required_with:compa_from|gte:compa_fromactivation_datenullable|datestatusrequiredrequired|in:active,inactive,draftExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","salary_range_layer":"...","benefits_layer":"...","timeoffs_layer":"...","exceed_range_percent":1.5,"exceed_benefits_percent":1.5,"compa_from":1.5,"compa_to":1.5,"activation_date":"2026-11-01","status":"active"}' -
GET
/api/v1/app/companies/{company}/salary-scales/{scale}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.scaleinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales/{scale}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/salary-scales/{scale}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.scaleinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arnullable|string|'max:' . \App\Support\Limits::chars(150)salary_range_layer$layerbenefits_layer$layertimeoffs_layer$layerexceed_range_percentnullable|numeric|between:0,1000exceed_benefits_percentnullable|numeric|between:0,1000compa_fromnullable|numeric|between:0,1000|required_with:compa_tocompa_tonullable|numeric|between:0,1000|required_with:compa_from|gte:compa_fromactivation_datenullable|datestatusrequiredrequired|in:active,inactive,draftExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales/{scale}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","salary_range_layer":"...","benefits_layer":"...","timeoffs_layer":"...","exceed_range_percent":1.5,"exceed_benefits_percent":1.5,"compa_from":1.5,"compa_to":1.5,"activation_date":"2026-11-01","status":"active"}' -
DELETE
/api/v1/app/companies/{company}/salary-scales/{scale}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.scaleinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales/{scale}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/salary-scales/{scale}/{layer}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.scaleinteger The record's ID. layerstring · grade|band|level The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)scale_grade_id$layer === 'grade' ? ['prohibited'] : $parent('grade')scale_band_id$layer === 'level' ? $parent('band') : ['prohibited']min_salarynullable|numeric|min:0max_salarynullable|numeric|min:0|gte:min_salarymid_salarynullable|numeric|min:0Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales/{scale}/{layer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","scale_grade_id":"...","scale_band_id":"...","min_salary":1.5,"max_salary":1.5,"mid_salary":1.5}' -
PUT
/api/v1/app/companies/{company}/salary-scales/{scale}/{layer}/{id}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.scaleinteger The record's ID. layerstring · grade|band|level The record's ID. idinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
name_enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name_arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)scale_grade_id$layer === 'grade' ? ['prohibited'] : $parent('grade')scale_band_id$layer === 'level' ? $parent('band') : ['prohibited']min_salarynullable|numeric|min:0max_salarynullable|numeric|min:0|gte:min_salarymid_salarynullable|numeric|min:0Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales/{scale}/{layer}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name_en":"...","name_ar":"...","scale_grade_id":"...","scale_band_id":"...","min_salary":1.5,"max_salary":1.5,"mid_salary":1.5}' -
DELETE
/api/v1/app/companies/{company}/salary-scales/{scale}/{layer}/{id}- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.scaleinteger The record's ID. layerstring · grade|band|level The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/salary-scales/{scale}/{layer}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
saved-reports 1 endpoint
-
DELETE
/api/v1/app/companies/{company}/saved-reports/{saved}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.savedinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/saved-reports/{saved}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
search 1 endpoint
-
GET
/api/v1/app/companies/{company}/search- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/search" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
settings 38 endpoints
-
GET
/api/v1/app/companies/{company}/settings/limits- Sign-in
- App token or company API key
- Permission
limits.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
branch_idsometimes|nullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/limits?branch_id=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/limitsvalues: {key: number, or null to go back to the level above}; sizes in KB. Only the keys s...values: {key: number, or null to go back to the level above}; sizes in KB. Only the keys sent change.
- Sign-in
- App token or company API key
- Permission
limits.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
branch_idsometimes|nullable|integerExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/limits" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"branch_id":1}' -
GET
/api/v1/app/companies/{company}/settings/app-colors?branch_id= one branch's own colors; none: the company's.?branch_id= one branch's own colors; none: the company's.
- Sign-in
- App token or company API key
- Permission
app_colors.view- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
branch_idsometimes|nullable|integerExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/app-colors?branch_id=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/app-colorsprimary, secondary (#RRGGBB; empty follows the level above), branch_id. Only what's sent c...primary, secondary (#RRGGBB; empty follows the level above), branch_id. Only what's sent changes.
- Sign-in
- App token or company API key
- Permission
app_colors.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
primarysometimes|nullable|regex:/^#[0-9A-Fa-f]{6}$/secondarysometimes|nullable|regex:/^#[0-9A-Fa-f]{6}$/Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/app-colors" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"primary":"...","secondary":"..."}' -
DELETE
/api/v1/app/companies/{company}/settings/app-colors- Sign-in
- App token or company API key
- Permission
app_colors.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/app-colors" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/account- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/account" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/settings/accountPATCH: send only what changes. POST works too, for a logo as multipart/form-data.PATCH: send only what changes. POST works too, for a logo as multipart/form-data.
- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/account" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/mail- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/mail" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/settings/mail- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
hostnullable|string|max:190|regex:/^[A-Za-z0-9.\-]+$/port$on ? 'required' : 'nullable'|integer|between:1,65535usernamenullable|string|max:190passwordnullable|string|max:190encryption$on ? 'required' : 'nullable'|in:tls,ssl,nonefrom$on ? 'required' : 'nullable'|email:filter|max:190Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/mail" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"host":"...","port":1,"username":"...","password":"...","encryption":"tls","from":"[email protected]"}' -
POST
/api/v1/app/companies/{company}/settings/mail/test- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/mail/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/app/companies/{company}/settings/mail/employees"Email employees" on or off (docs/mail.md): for branch_id when given, else the branch bein..."Email employees" on or off (docs/mail.md): for branch_id when given, else the branch being worked in.
- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/mail/employees" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/appearance- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/appearance- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
allow_user_overridebooleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"allow_user_override":true}' -
DELETE
/api/v1/app/companies/{company}/settings/appearance- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/sign-in- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/sign-in" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/sign-inSend only what changes; the client secret is write-only (blank keeps it).Send only what changes; the client secret is write-only (blank keeps it).
- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
two_factor_requiredsometimes|booleansso_enabledsometimes|booleansso_protocolsometimes|in:oidc,samlsso_namesometimes|nullable|string|max:40sso_issuersometimes|nullable|url:https|max:255sso_client_idsometimes|nullable|string|max:255sso_client_secretsometimes|nullable|string|max:500sso_onlysometimes|booleansso_exempt_user_idssometimes|nullable|array|max:200sso_exempt_user_ids.*integer|exists:company_user,user_idsaml_idp_entity_idsometimes|nullable|string|max:255saml_idp_sso_urlsometimes|nullable|url:https|max:500saml_idp_certsometimes|nullable|string|max:20000saml_metadata_urlsometimes|nullable|url:https|max:500saml_metadata_xmlsometimes|nullable|string|max:500000saml_email_attributesometimes|nullable|string|max:190pw_min_lengthsometimes|integer|min:6|max:64pw_uppersometimes|booleanpw_lowersometimes|booleanpw_numberssometimes|booleanpw_specialsometimes|booleanpw_max_age_dayssometimes|integer|min:0|max:365pw_reusesometimes|integer|min:0|max:24pw_max_attemptssometimes|integer|min:0|max:20|fn($a, $v, $fail) => (int) $v === 0 || (int) $v >= 3 || $fail(__('Allow at least...pw_lock_minutessometimes|integer|min:0|max:1440Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/sign-in" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"two_factor_required":true,"sso_enabled":true,"sso_protocol":"oidc","sso_name":"...","sso_issuer":"...","sso_client_id":"...","sso_client_secret":"...","sso_only":true,"sso_exempt_user_ids":[],"saml_idp_entity_id":"...","saml_idp_sso_url":"...","saml_idp_cert":"...","saml_metadata_url":"...","saml_metadata_xml":"...","saml_email_attribute":"...","pw_min_length":1,"pw_upper":true,"pw_lower":true,"pw_numbers":true,"pw_special":true,"pw_max_age_days":1,"pw_reuse":1,"pw_max_attempts":1,"pw_lock_minutes":1}' -
GET
/api/v1/app/companies/{company}/settings/sign-in/sso-logThe single sign-on audit log: sign-ins, refusals, blocked password sign-ins and settings c...The single sign-on audit log: sign-ins, refusals, blocked password sign-ins and settings changes, newest first.
- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
limitsometimes|integer|min:1|'max:' . \App\Support\Limits::cap(200)eventsometimes|in:sign_in,sign_in_failed,password_blocked,settings_changedExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/sign-in/sso-log?limit=1&event=sign_in" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/log-retention- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/log-retention" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/log-retention- Sign-in
- App token or company API key
- Permission
settings.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
retentionrequiredrequired|Rule::in(\App\Support\LogRetention::options())Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/log-retention" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"retention":"..."}' -
GET
/api/v1/app/companies/{company}/settings/earned-wage- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/earned-wage" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/earned-wage- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/earned-wage" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/settings/salary-scale- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
salary_scale_enforcerequiredrequired|in:off,blockExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/salary-scale" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"salary_scale_enforce":"off"}' -
GET
/api/v1/app/companies/{company}/settings/live-location- Sign-in
- App token or company API key
- Permission
live_location.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/live-location" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/settings/live-locationenabled, mode, interval_seconds, distance_meters, max_silence_minutes, retention_days, rea...enabled, mode, interval_seconds, distance_meters, max_silence_minutes, retention_days, reason {en, ar}, rules [{target_type, target_id, effect}].
- Sign-in
- App token or company API key
- Permission
live_location.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
enabledsometimes|booleanmodesometimes|in:while_clocked_in,during_shift,always_when_app_openinterval_secondssometimes|integer|between:10,3600distance_meterssometimes|integer|between:0,5000max_silence_minutessometimes|integer|between:2,1440retention_dayssometimes|integer|between:7,730reasonsometimes|nullable|arrayreason.ennullable|string|'max:' . \App\Support\Limits::chars(500)reason.arnullable|string|'max:' . \App\Support\Limits::chars(500)rulessometimes|arrayExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/live-location" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"enabled":true,"mode":"while_clocked_in","interval_seconds":1,"distance_meters":1,"max_silence_minutes":1,"retention_days":1,"reason":{"en":"...","ar":"..."},"rules":[]}' -
GET
/api/v1/app/companies/{company}/settings/app-policies/{policy}The app lock, the confirmation before a punch or blocking screenshots (app_policy.manage):...The app lock, the confirmation before a punch or blocking screenshots (app_policy.manage): enabled, its options and rules.
- Sign-in
- App token or company API key
- Permission
app_policy.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policystring · app_lock|punch_auth|screen_capture|phone_sharing|event_location|location_required|context_device|context_network|context_battery|context_permissions|context_security|context_time|context_locale|context_health The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/app-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/settings/app-policies/{policy}enabled; app_lock: when (every_open|after_background), after_minutes, methods (biometric|b...enabled; app_lock: when (every_open|after_background), after_minutes, methods (biometric|biometric_or_passcode); punch_auth: methods; rules [{target_type, target_id, effect}]; screen_capture: enabled only.
- Sign-in
- App token or company API key
- Permission
app_policy.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.policystring · app_lock|punch_auth|screen_capture|phone_sharing|event_location|location_required|context_device|context_network|context_battery|context_permissions|context_security|context_time|context_locale|context_health The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
enabledrequiredrequired|booleanmethodssometimes|in:biometric,biometric_or_passcodewhensometimes|in:every_open,after_backgroundafter_minutessometimes|integer|between:1,240rulessometimes|arrayinheritsometimes|booleanmodesometimes|in:allow,warn,blockmax_accountssometimes|integer|between:1,10rules.*.target_typerequiredrequired|in:all,branch,department,section,work_location,group,employeerules.*.target_idnullable|integerrules.*.effectsometimes|in:include,excludeExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/app-policies/{policy}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"enabled":true,"methods":"biometric","when":"every_open","after_minutes":1,"rules":[],"inherit":true,"mode":"allow","max_accounts":1}' -
GET
/api/v1/app/companies/{company}/settings/clocking-securityThe checks of the company, or of a branch (branch_id) where it has its own values.The checks of the company, or of a branch (branch_id) where it has its own values.
- Sign-in
- App token or company API key
- Permission
attendance.security.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/clocking-security" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/clocking-securitySend only what changes: checks {check: off|flag|hold|block|on}, the numbers and ranges; br...Send only what changes: checks {check: off|flag|hold|block|on}, the numbers and ranges; branch_id for a branch's own values.
- Sign-in
- App token or company API key
- Permission
attendance.security.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/clocking-security" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/buddy-punching- Sign-in
- App token or company API key
- Permission
attendance.buddy.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/buddy-punching" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/settings/buddy-punching/{layer}PATCH settings/buddy-punching/{layer}: inherit, or mode off|flag|refuse; the layer's own s...PATCH settings/buddy-punching/{layer}: inherit, or mode off|flag|refuse; the layer's own settings; rules.
- Sign-in
- App token or company API key
- Permission
attendance.buddy.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.layerstring · bp_face|bp_device_key|bp_presence|bp_pattern The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/buddy-punching/{layer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/attendance- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/attendance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/settings/attendanceAttendance setup: send only what changes.Attendance setup: send only what changes.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/attendance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/timesheets- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/timesheets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/settings/timesheetsTimesheets setup: send only what changes.Timesheets setup: send only what changes.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/timesheets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/settings/overtime-limit- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/overtime-limit" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/settings/overtime-limitot_limit_scope per_type|total, ot_total_limit_hours, ot_total_limit_period day|week|month.ot_limit_scope per_type|total, ot_total_limit_hours, ot_total_limit_period day|week|month.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/settings/overtime-limit" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
setup-forms 4 endpoints
-
GET
/api/v1/app/companies/{company}/setup-forms/{entity}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.entitystring The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/setup-forms/{entity}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/setup-forms/{entity}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.entitystring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/setup-forms/{entity}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH POST
/api/v1/app/companies/{company}/setup-forms/{entity}/{id}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.entitystring The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/setup-forms/{entity}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/setup-forms/{entity}/{id}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.entitystring The record's ID. idinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/setup-forms/{entity}/{id}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
shifts 9 endpoints
-
GET
/api/v1/app/companies/{company}/shifts- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/shifts- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)typerequiredrequired|in:regular,flexible,split,roster,roster_flexiblesplit_kindnullable|in:regular,flexible,rosterstart_timerequiredrequired|date_format:H:iend_timerequiredrequired|date_format:H:istart_time_2nullable|required_if:type,split|date_format:H:iend_time_2nullable|required_if:type,split|date_format:H:irequired_hoursnullable|numeric|min:0.5|max:24required_hours_2nullable|numeric|min:0.5|max:24interval_margin_pctnullable|integer|between:0,100days_offnullable|array|max:6days_off.*integer|between:0,6colornullable|regex:/^#[0-9a-fA-F]{6}$/break_minutesnullable|integer|between:0,600late_grace_minutesnullable|integer|between:0,600early_grace_minutesnullable|integer|between:0,600flex_grace_minutesnullable|integer|between:0,600overtime_after_minutesnullable|integer|between:0,1440punch_in_window_minutesnullable|integer|between:0,720punch_out_grace_minutesnullable|integer|between:0,720extra_intervalsnullable|array|'max:' . (\App\Models\Shift::MAX_INTERVALS - 2)extra_intervals.*.fromnullable|date_format:H:iextra_intervals.*.tonullable|date_format:H:iextra_intervals.*.required_hoursnullable|numeric|min:0.25|max:24functionsnullable|arrayfunctions.*.attendance_function_idnullable|integer|exists:attendance_functions,idfunctions.*.fromnullable|date_format:H:ifunctions.*.tonullable|date_format:H:iwork_exceptionsnullable|arraywork_exceptions.*.daynullable|integer|between:0,6work_exceptions.*.fromnullable|date_format:H:iwork_exceptions.*.tonullable|date_format:H:iovertime_exceptionsnullable|arrayovertime_exceptions.*.daynullable|in:0,1,2,3,4,5,6,offovertime_exceptions.*.fromnullable|date_format:H:iovertime_exceptions.*.tonullable|date_format:H:iovertime_exceptions.*.basic_ratenullable|numeric|min:0|max:20overtime_exceptions.*.allowances_ratenullable|numeric|min:0|max:20overtime_exceptions.*.methodnullable|in:hourly,dailyis_defaultsometimes|booleanarchivedsometimes|booleandeduct_gracesometimes|booleanexclude_breaksometimes|booleanholiday_overtimesometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"type":"regular","split_kind":"regular","start_time":"2026-11-01","end_time":"2026-11-01","start_time_2":"2026-11-01","end_time_2":"2026-11-01","required_hours":1.5,"required_hours_2":1.5,"interval_margin_pct":1,"days_off":[],"color":"...","break_minutes":1,"late_grace_minutes":1,"early_grace_minutes":1,"flex_grace_minutes":1,"overtime_after_minutes":1,"punch_in_window_minutes":1,"punch_out_grace_minutes":1,"extra_intervals":[],"functions":[],"work_exceptions":[],"overtime_exceptions":[],"is_default":true,"archived":true,"deduct_grace":true,"exclude_break":true,"holiday_overtime":true}' -
GET
/api/v1/app/companies/{company}/shifts/{shift}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.shiftinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts/{shift}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/shifts/{shift}/copy-to-rosterA roster copy of a regular shift, as the shift screen's "Copy to roster".A roster copy of a regular shift, as the shift screen's "Copy to roster".
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.shiftinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts/{shift}/copy-to-roster" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/shifts/{shift}/syncThe shift to every active employee without one.The shift to every active employee without one.
- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.shiftinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts/{shift}/sync" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/shifts/{shift}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.shiftinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|arrayname.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)name.arrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)typerequiredrequired|in:regular,flexible,split,roster,roster_flexiblesplit_kindnullable|in:regular,flexible,rosterstart_timerequiredrequired|date_format:H:iend_timerequiredrequired|date_format:H:istart_time_2nullable|required_if:type,split|date_format:H:iend_time_2nullable|required_if:type,split|date_format:H:irequired_hoursnullable|numeric|min:0.5|max:24required_hours_2nullable|numeric|min:0.5|max:24interval_margin_pctnullable|integer|between:0,100days_offnullable|array|max:6days_off.*integer|between:0,6colornullable|regex:/^#[0-9a-fA-F]{6}$/break_minutesnullable|integer|between:0,600late_grace_minutesnullable|integer|between:0,600early_grace_minutesnullable|integer|between:0,600flex_grace_minutesnullable|integer|between:0,600overtime_after_minutesnullable|integer|between:0,1440punch_in_window_minutesnullable|integer|between:0,720punch_out_grace_minutesnullable|integer|between:0,720extra_intervalsnullable|array|'max:' . (\App\Models\Shift::MAX_INTERVALS - 2)extra_intervals.*.fromnullable|date_format:H:iextra_intervals.*.tonullable|date_format:H:iextra_intervals.*.required_hoursnullable|numeric|min:0.25|max:24functionsnullable|arrayfunctions.*.attendance_function_idnullable|integer|exists:attendance_functions,idfunctions.*.fromnullable|date_format:H:ifunctions.*.tonullable|date_format:H:iwork_exceptionsnullable|arraywork_exceptions.*.daynullable|integer|between:0,6work_exceptions.*.fromnullable|date_format:H:iwork_exceptions.*.tonullable|date_format:H:iovertime_exceptionsnullable|arrayovertime_exceptions.*.daynullable|in:0,1,2,3,4,5,6,offovertime_exceptions.*.fromnullable|date_format:H:iovertime_exceptions.*.tonullable|date_format:H:iovertime_exceptions.*.basic_ratenullable|numeric|min:0|max:20overtime_exceptions.*.allowances_ratenullable|numeric|min:0|max:20overtime_exceptions.*.methodnullable|in:hourly,dailyis_defaultsometimes|booleanarchivedsometimes|booleandeduct_gracesometimes|booleanexclude_breaksometimes|booleanholiday_overtimesometimes|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts/{shift}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":{"en":"...","ar":"..."},"type":"regular","split_kind":"regular","start_time":"2026-11-01","end_time":"2026-11-01","start_time_2":"2026-11-01","end_time_2":"2026-11-01","required_hours":1.5,"required_hours_2":1.5,"interval_margin_pct":1,"days_off":[],"color":"...","break_minutes":1,"late_grace_minutes":1,"early_grace_minutes":1,"flex_grace_minutes":1,"overtime_after_minutes":1,"punch_in_window_minutes":1,"punch_out_grace_minutes":1,"extra_intervals":[],"functions":[],"work_exceptions":[],"overtime_exceptions":[],"is_default":true,"archived":true,"deduct_grace":true,"exclude_break":true,"holiday_overtime":true}' -
DELETE
/api/v1/app/companies/{company}/shifts/{shift}- Sign-in
- App token or company API key
- Permission
attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.shiftinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/shifts/{shift}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
signatures 6 endpoints
-
GET
/api/v1/app/companies/{company}/signaturesSignature requests I may see: mine, and those in my letters scope.Signature requests I may see: mine, and those in my letters scope.
- Sign-in
- App token or company API key
- Permission
self.signatures | letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/signatures" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/signatures/{signature}- Sign-in
- App token or company API key
- Permission
self.signatures | letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.signatureinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/signatures/{signature}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/signatures/{signature}/pdfA signed document as a PDF file (409 until it is signed).A signed document as a PDF file (409 until it is signed).
- Sign-in
- App token or company API key
- Permission
self.signatures | letters.view | letters.manage- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.signatureinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/signatures/{signature}/pdf" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/signatures/{signature}/signSign my document: password, signature (a PNG data URL), agree.Sign my document: password, signature (a PNG data URL), agree.
- Sign-in
- App token or company API key
- Permission
self.signatures- Module
hrm- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.signatureinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
passwordrequiredrequired|string|fn($attribute, $value, $fail) => \Illuminate\Support\Facades\Hash::check((string...signaturerequiredrequired|string|max:300000|regex:/^data:image\/png;base64,[A-Za-z0-9+\/=]+$/agreeacceptedExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/signatures/{signature}/sign" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"password":"...","signature":"...","agree":true}' -
POST
/api/v1/app/companies/{company}/signatures/{signature}/decline- Sign-in
- App token or company API key
- Permission
self.signatures- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.signatureinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/signatures/{signature}/decline" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/signaturesSend a document to sign: employee_ids, and title + body or letter_id (letters.manage).Send a document to sign: employee_ids, and title + body or letter_id (letters.manage).
- Sign-in
- App token or company API key
- Permission
letters.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idsrequiredrequired|array|min:1employee_ids.*integertitlenullable|stringbodynullable|stringletter_idnullable|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/signatures" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_ids":[],"title":"...","body":"...","letter_id":1}'
slack 2 endpoints
-
GET
/api/v1/app/companies/{company}/slack- Sign-in
- App token or company API key
- Permission
integrations.slack.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/slack" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/slack- Sign-in
- App token or company API key
- Permission
integrations.slack.manage- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/slack" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
stb-encashments 5 endpoints
-
GET
/api/v1/app/companies/{company}/stb-encashments/settings- Sign-in
- App token or company API key
- Permission
payroll.stb_encashments.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/stb-encashments/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/stb-encashmentsEncashments in my scope, newest first (employee_id filter), with the company's limits.Encashments in my scope, newest first (employee_id filter), with the company's limits.
- Sign-in
- App token or company API key
- Permission
payroll.stb_encashments.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/stb-encashments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/stb-encashments- Sign-in
- App token or company API key
- Permission
payroll.stb_encashments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integeramountrequiredrequired|numeric|gt:0paymentrequiredrequired|in:payroll,off_cyclenotes$limits['stb_encash_notes_required'] ? 'required' : 'nullable'|string|max:500external_refnullable|string|max:64Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/stb-encashments" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"amount":1.5,"payment":"payroll","notes":"...","external_ref":"..."}' -
DELETE
/api/v1/app/companies/{company}/stb-encashments/{encashment}- Sign-in
- App token or company API key
- Permission
payroll.stb_encashments.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.encashmentinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/stb-encashments/{encashment}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/app/companies/{company}/stb-encashments/settings- Sign-in
- App token or company API key
- Permission
payroll_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
stb_encash_max_percentrequiredrequired|numeric|min:0|max:100stb_encash_min_yearsrequiredrequired|numeric|min:0|max:50stb_encash_every_yearsrequiredrequired|numeric|min:0|max:50stb_encash_min_amountnullable|numeric|min:0stb_encash_max_amountnullable|numeric|min:0|gte:stb_encash_min_amountstb_encash_after_monthsnullable|integer|min:0|max:600stb_encash_timesnullable|integer|min:1|max:100stb_encash_per_yearsnullable|numeric|min:0|max:50|required_with:stb_encash_timesstb_encash_eligiblenullable|in:all,citizens,non_citizensstb_encash_default_paymentnullable|in:payroll,off_cyclestb_encash_limited_policy_id$policystb_encash_unlimited_policy_id$policystb_encash_income_name_ennullable|string|'max:' . \App\Support\Limits::chars(100)stb_encash_income_name_arnullable|string|'max:' . \App\Support\Limits::chars(100)stb_encash_deduction_name_ennullable|string|'max:' . \App\Support\Limits::chars(100)stb_encash_deduction_name_arnullable|string|'max:' . \App\Support\Limits::chars(100)Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/stb-encashments/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"stb_encash_max_percent":1.5,"stb_encash_min_years":1.5,"stb_encash_every_years":1.5,"stb_encash_min_amount":1.5,"stb_encash_max_amount":1.5,"stb_encash_after_months":1,"stb_encash_times":1,"stb_encash_per_years":1.5,"stb_encash_eligible":"all","stb_encash_default_payment":"payroll","stb_encash_limited_policy_id":"...","stb_encash_unlimited_policy_id":"...","stb_encash_income_name_en":"...","stb_encash_income_name_ar":"...","stb_encash_deduction_name_en":"...","stb_encash_deduction_name_ar":"..."}'
succession 1 endpoint
-
GET
/api/v1/app/companies/{company}/succession/coverageexposure (critical|exposed|watch|covered), department_id.exposure (critical|exposed|watch|covered), department_id.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/succession/coverage" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
successors 4 endpoints
-
DELETE
/api/v1/app/companies/{company}/successors/{successor}- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.successors.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.successorinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/successors/{successor}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/successors/{successor}- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.successorinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/successors/{successor}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/successors/{successor}/draft-planapply: true saves the drafted actions on the plan.apply: true saves the drafted actions on the plan.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.successors.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.successorinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/successors/{successor}/draft-plan" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/successors/{successor}/plan-actionstitle, kind, owner_id, due_date, status, progress, competency_id, notes.title, kind, owner_id, due_date, status, progress, competency_id, notes.
- Sign-in
- App token or company API key
- Permission
succession.manage.* | succession.successors.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.successorinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|string|max:255kindnullable|in:training,mentoring,assignment,project,otherowner_idnullable|integer|exists:employees,iddue_datenullable|datestatusnullable|in:planned,in_progress,doneprogressnullable|integer|between:0,100competency_idnullable|integer|exists:competencies,idnotesnullable|string|'max:' . \App\Support\Limits::chars(2000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/successors/{successor}/plan-actions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":"...","kind":"training","owner_id":1,"due_date":"2026-11-01","status":"planned","progress":1,"competency_id":1,"notes":"..."}'
suspensions 4 endpoints
-
GET
/api/v1/app/companies/{company}/suspensions- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/suspensions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/suspensions- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/suspensions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/suspensions/{suspension}/{action}decide, withdraw, resume, decide-resumption, withdraw-resumption, cancel, decide-cancel, c...decide, withdraw, resume, decide-resumption, withdraw-resumption, cancel, decide-cancel, cancel-resumption, decide-cancel-resumption
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.suspensioninteger The record's ID. actionstring · decide|withdraw|resume|decide-resumption|withdraw-resumption|cancel|decide-cancel|cancel-resumption|decide-cancel-resumption The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/suspensions/{suspension}/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/suspensions/{suspension}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.suspensioninteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/suspensions/{suspension}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
system-announcements 3 endpoints
-
GET
/api/v1/app/system-announcements- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/system-announcements" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/system-announcements/{announcement}/dismiss- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
announcementinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/system-announcements/{announcement}/dismiss" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/system-announcements/{announcement}/acknowledge- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Path parameters
announcementinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/system-announcements/{announcement}/acknowledge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
task-templates 4 endpoints
-
GET
/api/v1/app/companies/{company}/task-templates- Sign-in
- App token or company API key
- Permission
tasks.templates.manage | tasks.templates.use- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/task-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/task-templatestitle {en, ar}, description, priority, due_in_days, related_to (general, onboarding, offbo...title {en, ar}, description, priority, due_in_days, related_to (general, onboarding, offboarding).
- Sign-in
- App token or company API key
- Permission
tasks.templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
titlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(200)title.arnullable|string|'max:' . \App\Support\Limits::chars(200)descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)prioritynullable|in:low,normal,highdue_in_daysnullable|integer|min:0|max:365related_tonullable|in:general,onboarding,offboardingstepsnullable|arraybranch_idnullable|integer|exists:branches,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/task-templates" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"title":{"en":"...","ar":"..."},"description":"...","priority":"low","due_in_days":1,"related_to":"general","steps":[],"branch_id":1}' -
PATCH PUT
/api/v1/app/companies/{company}/task-templates/{template}- Sign-in
- App token or company API key
- Permission
tasks.templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/task-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/task-templates/{template}- Sign-in
- App token or company API key
- Permission
tasks.templates.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.templateinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/task-templates/{template}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
tasks 28 endpoints
-
GET
/api/v1/app/companies/{company}/taskstab (mine, assigned, employees), show (pending, past_due, completed, all), status, kind, e...tab (mine, assigned, employees), show (pending, past_due, completed, all), status, kind, employee, template, q, per_page.
- Sign-in
- App token or company API key
- Permission
self.tasks.view | tasks.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasksAssign Task: kind, title, description, due_date, priority, task_template_id, employee_id o...Assign Task: kind, title, description, due_date, priority, task_template_id, employee_id or assign_mode group with group_dimension and group_value, and the kind's fields.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
kindnullable|Rule::in(array_diff(array_keys(\App\Models\Task::KINDS), \App\Models\Task::WORKF...task_template_idnullable|integer|exists:task_templates,idtitle$kind === 'custom' ? 'required' : 'nullable'|string|max:200descriptionnullable|string|'max:' . \App\Support\Limits::chars(2000)assign_modenullable|in:individual,groupemployee_id$group ? 'nullable' : 'required'|integer|Rule::in($assignable)group_dimension$group ? 'required' : 'nullable'|Rule::in(array_keys(self::dimensions()))group_value$group ? 'required' : 'nullable'|string|max:50due_datenullable|dateprioritynullable|in:low,normal,highnotes_requirednullable|booleanattachments_requirednullable|booleanproof_requirednullable|booleanstepsnullable|arraydocument_type_id$kind === 'document_upload' ? 'required' : 'nullable'|integer|exists:document_types,iddocument_id$kind === 'document_download' ? 'required' : 'nullable'|integer|exists:employee_documents,idasset_type_id$kind === 'give_asset' ? 'required' : 'nullable'|integer|exists:asset_types,idtarget_employee_idin_array($kind, ['give_asset', 'take_asset'], true) ? 'required' : 'nullable'|integerasset_id$kind === 'take_asset' ? 'required' : 'nullable'|integer|exists:assets,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"kind":"...","task_template_id":1,"title":"...","description":"...","assign_mode":"individual","employee_id":1,"group_dimension":"...","group_value":"...","due_date":"2026-11-01","priority":"low","notes_required":true,"attachments_required":true,"proof_required":true,"steps":[],"document_type_id":1,"document_id":1,"asset_type_id":1,"target_employee_id":1,"asset_id":1}' -
POST
/api/v1/app/companies/{company}/tasks/bulk-deletetasks: ids of pending tasks to delete.tasks: ids of pending tasks to delete.
- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/bulk-delete" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/settingsAll the task settings: the photo switches and what a new task starts with (docs/communicat...All the task settings: the photo switches and what a new task starts with (docs/communication.md §5هـ).
- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/tasks/settings- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/settings/branches/{branch}- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/settings/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/tasks/settings/branches/{branch}- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/settings/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/proofThe tasks with photos of the people in scope, for a manager: show (open, flagged, done, al...The tasks with photos of the people in scope, for a manager: show (open, flagged, done, all), employee, q, page, per_page.
- Sign-in
- App token or company API key
- Permission
tasks.proof.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/{task}- Sign-in
- App token or company API key
- Permission
self.tasks.view | tasks.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasks/{task}/statusstatus: todo, in_progress or done (a task that needs its form is completed with /complete)...status: todo, in_progress or done (a task that needs its form is completed with /complete).
- Sign-in
- App token or company API key
- Permission
self.tasks.update | tasks.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/status" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasks/{task}/completecompletion_notes, attachments[] (files), attachment (the document of a document upload), e...completion_notes, attachments[] (files), attachment (the document of a document upload), expires_at, asset_id (give asset).
- Sign-in
- App token or company API key
- Permission
self.tasks.update | tasks.manage- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
completion_notes$task->notes_required ? 'required' : 'nullable'|string|'max:' . \App\Support\Limits::chars(2000)attachment$task->kind === 'document_upload' ? 'required' : 'prohibited'|nullable|file|mimes:pdf,jpg,jpeg,png,webp,doc,docx,xls,xlsx|max:10240expires_atnullable|dateattachments$task->attachments_required && $task->kind !== 'document_upload' ? 'required' :...|array|'max:' . (int) \App\Support\Field\FieldSettings::value('task_attachment_max_file...attachments.*file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|'max:' . 1024 * (int) \App\Support\Field\FieldSettings::value('task_attachment_m...asset_id$task->kind === 'give_asset' ? 'required' : 'nullable'|integer|exists:assets,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/complete" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "completion_notes=..." \ -F "[email protected]" \ -F "expires_at=2026-11-01" \ -F "attachments=..." \ -F "asset_id=1" -
POST
/api/v1/app/companies/{company}/tasks/{task}/confirm-receiptThe employee who got a handed-over asset confirms receiving it (give-asset tasks awaiting...The employee who got a handed-over asset confirms receiving it (give-asset tasks awaiting confirmation).
- Sign-in
- App token or company API key
- Permission
self.tasks.update | tasks.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/confirm-receipt" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/tasks/{task}- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/proof/mineThe open tasks that ask for proof, with photos and rules, for working offline.The open tasks that ask for proof, with photos and rules, for working offline.
- Sign-in
- App token or company API key
- Permission
self.tasks.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/mine" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/{task}/proof/mineOne of the employee's own tasks with every photo they took, open or finished, waived or vo...One of the employee's own tasks with every photo they took, open or finished, waived or voided included. Anyone else's: 404.
- Sign-in
- App token or company API key
- Permission
self.tasks.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/proof/mine" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasks/{task}/evidence/videometa, signature, bytes, chunk_bytes. Again for the same client_uuid: where it got to, or t...meta, signature, bytes, chunk_bytes. Again for the same client_uuid: where it got to, or the record if it's all there.
- Sign-in
- App token or company API key
- Permission
self.tasks.capture- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
metarequiredrequired|string|max:20000signaturerequiredrequired|string|max:500bytesrequiredrequired|integer|min:1chunk_bytesrequiredrequired|integer|min:1024|'max:' . \Illuminate\Http\UploadedFile::getMaxFilesize()Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/evidence/video" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"meta":"...","signature":"...","bytes":1,"chunk_bytes":1}' -
POST
/api/v1/app/companies/{company}/tasks/{task}/evidence/video/{upload}/chunkoffset, chunk (a file). A chunk that already arrived changes nothing, and the answer alway...offset, chunk (a file). A chunk that already arrived changes nothing, and the answer always says how much the server has.
- Sign-in
- App token or company API key
- Permission
self.tasks.capture- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. uploadinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
offsetrequiredrequired|integer|min:0chunkrequiredrequired|fileExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/evidence/video/{upload}/chunk" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "offset=1" \ -F "[email protected]" -
POST
/api/v1/app/companies/{company}/tasks/{task}/evidence/video/{upload}/finishAll there: the same checks as a photo. The answer is the same receipt as a photo's.All there: the same checks as a photo. The answer is the same receipt as a photo's.
- Sign-in
- App token or company API key
- Permission
self.tasks.capture- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. uploadinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/evidence/video/{upload}/finish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasks/{task}/evidencemultipart: photo, meta (with task_id, not job_id), signature. While the switch is off the...multipart: photo, meta (with task_id, not job_id), signature. While the switch is off the phone gets 403 and keeps the draft.
- Sign-in
- App token or company API key
- Permission
self.tasks.capture- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
photorequiredrequired|file|mimetypes:image/jpeg|'max:' . 1024 * (int) \App\Support\Field\FieldSettings::value('task_photo_max_mb...metarequiredrequired|string|max:20000signaturerequiredrequired|string|max:500Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/evidence" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "[email protected]" \ -F "meta=..." \ -F "signature=..." -
GET
/api/v1/app/companies/{company}/tasks/{task}/proof- Sign-in
- App token or company API key
- Permission
tasks.proof.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/proof" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasks/{task}/proof/request-upload- Sign-in
- App token or company API key
- Permission
tasks.proof.request_upload- Module
hrm- Rate limit
- 30 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
notenullable|string|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/proof/request-upload" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"note":"..."}' -
POST
/api/v1/app/companies/{company}/tasks/{task}/proof/waive- Sign-in
- App token or company API key
- Permission
tasks.proof.waive- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.taskinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonrequiredrequired|string|min:3|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/{task}/proof/waive" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}' -
GET
/api/v1/app/companies/{company}/tasks/proof/evidence/{evidence}/photoThe photo: its employee, or who may see the task's proof. ?size=thumbThe photo: its employee, or who may see the task's proof. ?size=thumb
- Sign-in
- App token or company API key
- Permission
self.tasks.view | tasks.proof.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/evidence/{evidence}/photo" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tasks/proof/evidence/{evidence}/voidreason (required).reason (required).
- Sign-in
- App token or company API key
- Permission
tasks.proof.void- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.evidenceinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonrequiredrequired|string|min:3|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/evidence/{evidence}/void" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}' -
GET
/api/v1/app/companies/{company}/tasks/proof/settings- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/tasks/proof/settings- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/tasks/proof/settings/branches/{branch}- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/settings/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/tasks/proof/settings/branches/{branch}- Sign-in
- App token or company API key
- Permission
tasks.proof.settings- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tasks/proof/settings/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
team-leaves 2 endpoints
-
GET
/api/v1/app/companies/{company}/team-leavesThe team's leaves: status (pending by default, or all), type, employee, from, to.The team's leaves: status (pending by default, or all), type, employee, from, to.
- Sign-in
- App token or company API key
- Permission
leaves.view- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusnullable|in:pending,approved,rejected,withdrawn,allkindnullable|in:days,hourstypenullable|integeremployeenullable|integerfromnullable|datetonullable|dateExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-leaves?status=pending&kind=days&type=1&employee=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/team-leavesHR adds approved leave for an employee.HR adds approved leave for an employee.
- Sign-in
- App token or company API key
- Permission
leaves.record- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerleave_type_idrequiredrequired|exists:leave_types,idstart_daterequiredrequired|dateend_datenullable|date|after_or_equal:start_datestart_timenullable|date_format:H:iend_timenullable|date_format:H:ireasonnullable|string|'max:' . \App\Support\Limits::chars(1000)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-leaves" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1,"leave_type_id":"...","start_date":"2026-11-01","end_date":"2026-11-01","start_time":"2026-11-01","end_time":"2026-11-01","reason":"..."}'
team-schedule 7 endpoints
-
GET
/api/v1/app/companies/{company}/team-scheduleThe shifts shared with the caller (every shift for HR), with whether they may change each,...The shifts shared with the caller (every shift for HR), with whether they may change each, and their team.
- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/team-schedule/assignemployees, shift_id (or "off"), start_date, end_date (none = open-ended), conflict replace...employees, shift_id (or "off"), start_date, end_date (none = open-ended), conflict replace|keep, draft.
- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeesrequiredrequired|array|min:1|max:500employees.*integershift_idrequiredrequiredstart_daterequiredrequired|dateend_datenullable|date|after_or_equal:start_dateconflictsometimes|in:replace,keepdraftsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule/assign" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employees":[],"shift_id":"...","start_date":"2026-11-01","end_date":"2026-11-01","conflict":"replace","draft":true}' -
POST
/api/v1/app/companies/{company}/team-schedule/clear- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeesrequiredrequired|array|min:1|max:500employees.*integerstart_daterequiredrequired|dateend_datenullable|date|after_or_equal:start_dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule/clear" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employees":[],"start_date":"2026-11-01","end_date":"2026-11-01"}' -
POST
/api/v1/app/companies/{company}/team-schedule/planshift_ids (shared), start_date, end_date, employees (none = the whole team), max_in_a_row,...shift_ids (shared), start_date, end_date, employees (none = the whole team), max_in_a_row, days_off_a_week, max_weekly_hours, fair_nights.
- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
shift_idsrequiredrequired|array|min:1shift_ids.*integeremployeesnullable|array|max:500employees.*integerstart_daterequiredrequired|dateend_daterequiredrequired|date|after_or_equal:start_datemax_in_a_rownullable|integer|between:1,14days_off_a_weeknullable|integer|between:0,6max_weekly_hoursnullable|numeric|between:1,168fair_nightssometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule/plan" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"shift_ids":[],"employees":[],"start_date":"2026-11-01","end_date":"2026-11-01","max_in_a_row":1,"days_off_a_week":1,"max_weekly_hours":1.5,"fair_nights":true}' -
POST
/api/v1/app/companies/{company}/team-schedule/copysource_from, source_to, target_from, target_to, employees (none = the whole team), draft.source_from, source_to, target_from, target_to, employees (none = the whole team), draft.
- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeesnullable|array|max:500employees.*integersource_fromrequiredrequired|datesource_torequiredrequired|date|after_or_equal:source_fromtarget_fromrequiredrequired|datetarget_torequiredrequired|date|after_or_equal:target_fromdraftsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule/copy" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employees":[],"source_from":"2026-11-01","source_to":"2026-11-01","target_from":"2026-11-01","target_to":"2026-11-01","draft":true}' -
POST
/api/v1/app/companies/{company}/team-schedule/publishstart_date, end_date, employees (none = the whole team).start_date, end_date, employees (none = the whole team).
- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employeesnullable|array|max:500employees.*integerstart_daterequiredrequired|dateend_daterequiredrequired|date|after_or_equal:start_dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule/publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employees":[],"start_date":"2026-11-01","end_date":"2026-11-01"}' -
PUT PATCH
/api/v1/app/companies/{company}/team-schedule/shifts/{shift}A shift's definition, where a share lets the caller change it (HR always). Same fields as...A shift's definition, where a share lets the caller change it (HR always). Same fields as the shift setup.
- Sign-in
- App token or company API key
- Permission
shifts.assign_team | attendance_setup.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.shiftinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/team-schedule/shifts/{shift}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
template-conflicts 1 endpoint
-
GET
/api/v1/app/companies/{company}/template-conflictsSlots devices hold different data for, with every version (no template data).Slots devices hold different data for, with every version (no template data).
- Sign-in
- App token or company API key
- Permission
devices.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/template-conflicts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
terminations 1 endpoint
-
GET
/api/v1/app/companies/{company}/terminations- Sign-in
- App token or company API key
- Permission
employees.terminate- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/terminations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
timesheets 6 endpoints
-
GET
/api/v1/app/companies/{company}/timesheetsMy period holding ?week (a date), with its entries, and all my periods.My period holding ?week (a date), with its entries, and all my periods.
- Sign-in
- App token or company API key
- Permission
self.timesheets.view | timesheets.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/timesheets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/timesheets- Sign-in
- App token or company API key
- Permission
self.timesheets.log- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
project_idrequiredrequired|exists:org_units,idwork_daterequiredrequired|date|before_or_equal:todayhoursrequiredrequired|numeric|min:0.25|'max:' . $maxdescription\App\Models\CompanySetting::get('ts_notes_required', $companyId) === '1' ? 'requ...|string|'max:' . \App\Support\Limits::chars(255)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/timesheets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"project_id":"...","work_date":"2026-11-01","hours":1.5,"description":"..."}' -
POST
/api/v1/app/companies/{company}/timesheets/submit- Sign-in
- App token or company API key
- Permission
self.timesheets.log- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/timesheets/submit" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/timesheets/{entry}- Sign-in
- App token or company API key
- Permission
self.timesheets.log- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.entryinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/timesheets/{entry}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/timesheets/reviewSubmitted periods of the employees in reach.Submitted periods of the employees in reach.
- Sign-in
- App token or company API key
- Permission
timesheets.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/timesheets/review" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/timesheets/review- Sign-in
- App token or company API key
- Permission
timesheets.approve- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
employee_idrequiredrequired|integerExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/timesheets/review" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"employee_id":1}'
token 1 endpoint
-
DELETE
/api/v1/app/token- Sign-in
- App token or company API key
- Permission
- Any signed-in user of the company
- Rate limit
- 60 requests a minute
Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/token" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
tv 11 endpoints
-
GET
/api/v1/app/companies/{company}/tvThe TV setup: channels, devices (no tokens), breaking news and slides.The TV setup: channels, devices (no tokens), breaking news and slides.
- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tv/channelsname, layout (full, split, quad), areas: one list of widgets per area.name, layout (full, split, quad), areas: one list of widgets per area.
- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:100layoutrequiredrequired|in:full,split,quadareasrequiredrequired|arrayareas.*nullable|arrayareas.*.*in:today,announcements,birthdays,off_today,coming_up,content,clock,attendance_qris_defaultnullable|booleanactivenullable|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/channels" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","layout":"full","areas":[],"is_default":true,"active":true}' -
PATCH PUT
/api/v1/app/companies/{company}/tv/channels/{channel}- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.channelinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/channels/{channel}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/tv/channels/{channel}- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.channelinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/channels/{channel}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tv/devicesname, branch_id, work_location_id (site), tv_channel_id. The answer carries the TV's link...name, branch_id, work_location_id (site), tv_channel_id. The answer carries the TV's link and token, once.
- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:100branch_idnullable|integer|exists:branches,idtv_channel_idnullable|integer|exists:tv_channels,idwork_location_idnullable|integer|exists:org_units,idlocalenullable|in:en,arExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/devices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","branch_id":1,"tv_channel_id":1,"work_location_id":1,"locale":"en"}' -
PATCH PUT
/api/v1/app/companies/{company}/tv/devices/{device}- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tv/devices/{device}/tokenA new link; the old one stops working. The answer carries the new token, once.A new link; the old one stops working. The answer carries the new token, once.
- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/devices/{device}/token" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/app/companies/{company}/tv/devices/{device}- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deviceinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/devices/{device}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/tv/itemskind (news, slide), title {en, ar}, body {en, ar}, starts_on, ends_on, active, image (file...kind (news, slide), title {en, ar}, body {en, ar}, starts_on, ends_on, active, image (file), remove_image.
- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
kindrequiredrequired|in:news,slide,videotitlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)title.arnullable|string|'max:' . \App\Support\Limits::chars(150)bodynullable|arraybody.ennullable|string|'max:' . \App\Support\Limits::chars(1000)body.arnullable|string|'max:' . \App\Support\Limits::chars(1000)starts_onnullable|dateends_onnullable|date|after_or_equal:starts_onimagenullable|image|mimes:jpg,jpeg,png,webp|max:10240video($input['kind'] ?? null) === 'video' && !$item?->video_path ? 'required' : 'null...|file|mimetypes:video/mp4,video/webm|max:10240Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/items" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "kind=news" \ -F "title=..." \ -F "title.en=..." \ -F "title.ar=..." \ -F "body=..." \ -F "body.en=..." \ -F "body.ar=..." \ -F "starts_on=2026-11-01" \ -F "ends_on=2026-11-01" \ -F "[email protected]" \ -F "[email protected]" -
PATCH POST
/api/v1/app/companies/{company}/tv/items/{item}- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.iteminteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
kindrequiredrequired|in:news,slide,videotitlerequiredrequired|arraytitle.enrequiredrequired|string|'max:' . \App\Support\Limits::chars(150)title.arnullable|string|'max:' . \App\Support\Limits::chars(150)bodynullable|arraybody.ennullable|string|'max:' . \App\Support\Limits::chars(1000)body.arnullable|string|'max:' . \App\Support\Limits::chars(1000)starts_onnullable|dateends_onnullable|date|after_or_equal:starts_onimagenullable|image|mimes:jpg,jpeg,png,webp|max:10240video($input['kind'] ?? null) === 'video' && !$item?->video_path ? 'required' : 'null...|file|mimetypes:video/mp4,video/webm|max:10240Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/items/{item}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -F "kind=news" \ -F "title=..." \ -F "title.en=..." \ -F "title.ar=..." \ -F "body=..." \ -F "body.en=..." \ -F "body.ar=..." \ -F "starts_on=2026-11-01" \ -F "ends_on=2026-11-01" \ -F "[email protected]" \ -F "[email protected]" -
DELETE
/api/v1/app/companies/{company}/tv/items/{item}- Sign-in
- App token or company API key
- Permission
tv.manage- Module
hrm- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.iteminteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/tv/items/{item}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
users 3 endpoints
-
GET
/api/v1/app/companies/{company}/users- Sign-in
- App token or company API key
- Permission
users.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/users" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/app/companies/{company}/users/{user}- Sign-in
- App token or company API key
- Permission
users.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusrequiredrequired|in:active,inactiveExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/users/{user}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"status":"active"}' -
POST
/api/v1/app/companies/{company}/users/{user}/two-factor/reset- Sign-in
- App token or company API key
- Permission
users.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/users/{user}/two-factor/reset" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
webhook-deliveries 3 endpoints
-
GET
/api/v1/app/companies/{company}/webhook-deliveriesGET webhook-deliveries?webhook_id=&status=delivered|failedGET webhook-deliveries?webhook_id=&status=delivered|failed
- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhook-deliveries" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/app/companies/{company}/webhook-deliveries/{delivery}- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deliveryinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhook-deliveries/{delivery}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/webhook-deliveries/{delivery}/resend- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.deliveryinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhook-deliveries/{delivery}/resend" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
webhook-events 1 endpoint
-
GET
/api/v1/app/companies/{company}/webhook-events- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhook-events" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
webhooks 6 endpoints
-
GET
/api/v1/app/companies/{company}/webhooks- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhooks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/webhooksPOST webhooks: the signing secret is in the answer this once.POST webhooks: the signing secret is in the answer this once.
- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namesometimes|nullable|string|max:100url$req|url:http,https|max:500events$req|array|min:1events.*Rule::in($events)formatsometimes|in:json,xmlactivesometimes|booleangroupsometimes|nullable|in:financial_employee,financial_journalapi_key_idsometimes|nullable|integer|exists:api_keys,idExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhooks" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","url":"...","events":[],"format":"json","active":true,"group":"financial_employee","api_key_id":1}' -
PATCH PUT
/api/v1/app/companies/{company}/webhooks/{webhook}- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.webhookinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namesometimes|nullable|string|max:100url$req|url:http,https|max:500events$req|array|min:1events.*Rule::in($events)formatsometimes|in:json,xmlactivesometimes|booleangroupsometimes|nullable|in:financial_employee,financial_journalapi_key_idsometimes|nullable|integer|exists:api_keys,idExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhooks/{webhook}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","url":"...","events":[],"format":"json","active":true,"group":"financial_employee","api_key_id":1}' -
DELETE
/api/v1/app/companies/{company}/webhooks/{webhook}- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.webhookinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhooks/{webhook}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/webhooks/{webhook}/rotate-secret- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 60 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.webhookinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhooks/{webhook}/rotate-secret" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/app/companies/{company}/webhooks/{webhook}/test- Sign-in
- App token or company API key
- Permission
integrations.api_keys.manage- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.webhookinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/app/companies/$MIHNARO_COMPANY/webhooks/{webhook}/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
Platform API
Mihnaro platform admins' keys only.
ai 3 endpoints
-
GET
/api/v1/platform/ai- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/ai" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/ai- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/ai" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/ai/models- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 20 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/ai/models" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
app-activity 1 endpoint
-
GET
/api/v1/platform/app-activityGET app-activity: every phone's sign-in activity (filters: user_id, install_id, device_id,...GET app-activity: every phone's sign-in activity (filters: user_id, install_id, device_id, event, result, from, to; page, per_page).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-activity" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
app-debug 5 endpoints
-
GET
/api/v1/platform/app-debug/accountsGET app-debug/accounts: the accounts with debug mode, on or ended.GET app-debug/accounts: the accounts with debug mode, on or ended.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-debug/accounts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/app-debug/accounts/{user}PUT app-debug/accounts/{user}: on (boolean), hours (1–168, default 24; null = no end), sen...PUT app-debug/accounts/{user}: on (boolean), hours (1–168, default 24; null = no end), send (ask the phone for a report).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
userinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/app-debug/accounts/{user}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/app-debug/accounts/{user}/requestPOST app-debug/accounts/{user}/request: the phone sends a report at its next open.POST app-debug/accounts/{user}/request: the phone sends a report at its next open.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
userinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/app-debug/accounts/{user}/request" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/app-debug/reportsGET app-debug/reports: newest first; filters user_id, install_id, build.GET app-debug/reports: newest first; filters user_id, install_id, build.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
user_idnullable|integerinstall_idnullable|string|max:64buildnullable|string|max:20per_pagenullable|integer|min:1|'max:' . \App\Support\Limits::pageMax(100)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-debug/reports?user_id=1&install_id=...&build=...&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/app-debug/reports/{report}GET app-debug/reports/{report}: the whole report.GET app-debug/reports/{report}: the whole report.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
reportinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-debug/reports/{report}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
app-fleet 4 endpoints
-
GET
/api/v1/platform/app-fleetPhones and versions: every phone with the app, with the summary. Filters as AppFleet::vali...Phones and versions: every phone with the app, with the summary. Filters as AppFleet::validateFilters; page, per_page.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-fleet" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/app-fleet/people/{user}/contextGET app-fleet/people/{user}/context: a person's phone details, latest per phone and the hi...GET app-fleet/people/{user}/context: a person's phone details, latest per phone and the history (filters install_id, category, limit).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
userinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-fleet/people/{user}/context" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/app-fleet/phones/{install}/test-pushPOST app-fleet/phones/{install}/test-push: one test notification to one phone (docs/notifi...POST app-fleet/phones/{install}/test-push: one test notification to one phone (docs/notifications.md «الإشعار التجريبي»).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Path parameters
installinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/app-fleet/phones/{install}/test-push" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/app-fleet/people/{user}GET app-fleet/people/{user}: one person's phones with their IPs and timelines.GET app-fleet/people/{user}: one person's phones with their IPs and timelines.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
userinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-fleet/people/{user}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
app-releases 6 endpoints
-
GET
/api/v1/platform/app-releases- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-releases" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/app-releases/syncReads both stores' latest version now (also hourly), and returns each check.Reads both stores' latest version now (also hourly), and returns each check.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/app-releases/sync" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/app-releases/{platform}min_version (one of meta.known_versions), update_mode (none|suggest|force), message {en, a...min_version (one of meta.known_versions), update_mode (none|suggest|force), message {en, ar}, release_notes {en, ar}: any of them. latest_version and store_url come from the stores: sending them is a 422.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
platformstring · android|ios The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/app-releases/{platform}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/app-releases/companies/{company}mode stricter (min_android and/or min_ios), exempt, or none to remove the company's rule.mode stricter (min_android and/or min_ios), exempt, or none to remove the company's rule.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/app-releases/companies/$MIHNARO_COMPANY" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/app-releases/{platform}/impact?version=: how many phones and people a minimum of that version would block, against today...?version=: how many phones and people a minimum of that version would block, against today (default: forcing the latest).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
platformstring · android|ios The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
versionnullable|string|regex:/^\d{1,5}(\.\d{1,5}){0,3}$/Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/app-releases/{platform}/impact?version=..." \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/app-releases/{platform}/nudge"Please update": version_state outdated (default) or below_min; a push linking to the stor..."Please update": version_state outdated (default) or below_min; a push linking to the store. Needs platform.broadcast too.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 5 requests a minute
Path parameters
platformstring · android|ios The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/app-releases/{platform}/nudge" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
appearance 3 endpoints
-
GET
/api/v1/platform/appearance- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/appearance- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/appearance- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/appearance" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
backups 14 endpoints
-
GET
/api/v1/platform/backups- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/backups" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/backups/runs- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/backups/runs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/backups/runs/{run}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
runinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/backups/runs/{run}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/backups/restore-tests- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/backups/restore-tests" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/backups/destinations- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/backups/destinations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/backups/settings- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/backups/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/backups/passphrase- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
passphraserequiredrequired|stringExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/backups/passphrase" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"passphrase":"..."}' -
POST
/api/v1/platform/backups/destinations- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/backups/destinations" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/backups/destinations/{destination}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
destinationinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/backups/destinations/{destination}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/backups/destinations/{destination}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
destinationinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/backups/destinations/{destination}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/backups/destinations/{destination}/connect-linkA link to open in a browser signed in to the panel; the sign-in on the service happens the...A link to open in a browser signed in to the panel; the sign-in on the service happens there.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Path parameters
destinationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/backups/destinations/{destination}/connect-link" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/backups/destinations/{destination}/test- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Path parameters
destinationinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/backups/destinations/{destination}/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/backups/runs- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/backups/runs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/backups/runs/{run}/restore-test- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Path parameters
runinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/backups/runs/{run}/restore-test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
branches 3 endpoints
-
GET
/api/v1/platform/companies/{company}/branches- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/branches" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/branchesWithin the license's branch limit (platform.companies). Logos as multipart files.Within the license's branch limit (platform.companies). Logos as multipart files.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/branches" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/platform/companies/{company}/branches/{branch}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/branches/{branch}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
broadcasts 5 endpoints
-
POST
/api/v1/platform/broadcasts/previewcompany_ids, roles, user_ids, branch_ids, install_ids, platform, version_state, version: h...company_ids, roles, user_ids, branch_ids, install_ids, platform, version_state, version: how many people, phones and emails a send would reach.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/broadcasts/preview" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/broadcasts- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/broadcasts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/broadcaststitle {en, ar}, body {en, ar}, url, push, email, the audience (company_ids, roles, user_id...title {en, ar}, body {en, ar}, url, push, email, the audience (company_ids, roles, user_ids, branch_ids, install_ids, platform, version_state, version), image (a file, multipart), scheduled_at. test=true sends it now to your own phones and email only. Goes out in the background.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 5 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/broadcasts" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/broadcasts/{broadcast}The send with a page of its people and what each channel answered; ?result=failed|no_devic...The send with a page of its people and what each channel answered; ?result=failed|no_device|… filters push results.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
broadcastinteger The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
resultnullable|string|max:20per_pagenullable|integer|min:1|'max:' . \App\Support\Limits::pageMax(200)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/broadcasts/{broadcast}?result=...&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/broadcasts/{broadcast}/cancelCancels a send that hasn't started (scheduled or still waiting).Cancels a send that hasn't started (scheduled or still waiting).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
broadcastinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/broadcasts/{broadcast}/cancel" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
buddy-punching 2 endpoints
-
GET
/api/v1/platform/buddy-punchingGET buddy-punching: the platform default of each buddy-punching layer and who set their ow...GET buddy-punching: the platform default of each buddy-punching layer and who set their own (docs/attendance-security.md §19).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/buddy-punching" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/buddy-punching/{layer}PUT buddy-punching/{layer}: mode off|flag|refuse and the layer's own settings.PUT buddy-punching/{layer}: mode off|flag|refuse and the layer's own settings.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
layerstring · bp_face|bp_device_key|bp_presence|bp_pattern The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/buddy-punching/{layer}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
calculator-rule-sets 8 endpoints
-
GET
/api/v1/platform/calculator-rule-sets- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/calculator-rule-sets- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
country_coderequiredrequired|string|size:2|fn($a, $v, $fail) => \App\Support\Countries::exists($v) ? null : $fail(__('Unkno...variantnullable|string|max:40|regex:/^[a-z0-9-]+$/variant_labelnullable|arrayvariant_label.ennullable|string|'max:' . \App\Support\Limits::chars(100)variant_label.arnullable|string|'max:' . \App\Support\Limits::chars(100)effective_fromrequiredrequired|date_format:Y-m-dcopy_fromnullable|integer|exists:calculator_rule_sets,idnotesnullable|arrayallow_estimatessometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"country_code":"...","variant":"...","variant_label":{"en":"...","ar":"..."},"effective_from":"2026-11-01","copy_from":1,"notes":[],"allow_estimates":true}' -
GET
/api/v1/platform/calculator-rule-sets/{ruleSet}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
ruleSetinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets/{ruleSet}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/calculator-rule-sets/{ruleSet}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
ruleSetinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
rulessometimes|arraynotessometimes|nullable|arraynotes.ennullable|string|'max:' . \App\Support\Limits::chars(3000)notes.arnullable|string|'max:' . \App\Support\Limits::chars(3000)allow_estimatessometimes|booleanvariant_labelsometimes|nullable|arrayeffective_fromsometimes|date_format:Y-m-dpositionsometimes|integer|min:0|max:100Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets/{ruleSet}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"rules":[],"notes":{"en":"...","ar":"..."},"allow_estimates":true,"variant_label":[],"effective_from":"2026-11-01","position":1}' -
POST
/api/v1/platform/calculator-rule-sets/{ruleSet}/verify- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
ruleSetinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
keysrequiredrequired|array|min:1keys.*stringverifiedsometimes|booleanExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets/{ruleSet}/verify" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"keys":[],"verified":true}' -
POST
/api/v1/platform/calculator-rule-sets/{ruleSet}/publish- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
ruleSetinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets/{ruleSet}/publish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/calculator-rule-sets/{ruleSet}/unpublish- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
ruleSetinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets/{ruleSet}/unpublish" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/calculator-rule-sets/{ruleSet}/restore/{revision}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
ruleSetinteger The record's ID. revisioninteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/calculator-rule-sets/{ruleSet}/restore/{revision}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
companies 5 endpoints
-
DELETE
/api/v1/platform/companies/{company}Body: confirm_name (the name or slug), confirm: true, force: true when it has payroll or a...Body: confirm_name (the name or slug), confirm: true, force: true when it has payroll or attendance, reason.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companiesResponse includes the owner's temporary password once, when a new user was created.Response includes the owner's temporary password once, when a new user was created.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies/{company}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/platform/companies/{company}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
company-availability 1 endpoint
-
GET
/api/v1/platform/company-availability- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/company-availability" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
deleted-companies 2 endpoints
-
GET
/api/v1/platform/deleted-companies- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/deleted-companies" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/deleted-companies/{company}/restore- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/deleted-companies/$MIHNARO_COMPANY/restore" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
deletion-preview 1 endpoint
-
GET
/api/v1/platform/companies/{company}/deletion-previewWhat a deletion would lose: the payroll runs and attendance that make it "real", employees...What a deletion would lose: the payroll runs and attendance that make it "real", employees and accounts.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/deletion-preview" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
demo 1 endpoint
-
POST
/api/v1/platform/demo/reset- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/demo/reset" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
device-data 2 endpoints
-
GET
/api/v1/platform/device-dataGET device-data: the platform defaults of location as a condition of using the app and of...GET device-data: the platform defaults of location as a condition of using the app and of each category of phone details.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/device-data" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/device-dataPUT device-data: location_required {enabled, precise, reason_en, reason_ar}, categories {c...PUT device-data: location_required {enabled, precise, reason_en, reason_ar}, categories {category: {enabled, retention_days}}.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/device-data" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
domains 1 endpoint
-
GET
/api/v1/platform/domains- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/domains" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
event-location 2 endpoints
-
GET
/api/v1/platform/event-locationGET event-location: the platform default for keeping the phone's GPS point with sign-ins a...GET event-location: the platform default for keeping the phone's GPS point with sign-ins and opens, and the companies with their own.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/event-location" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/event-locationPUT event-location: mode auto (companies with live location or the clock-in geofence) | on...PUT event-location: mode auto (companies with live location or the clock-in geofence) | on | off.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
moderequiredrequired|Rule::in(self::MODES)Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/event-location" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"mode":"..."}'
flash-messages 2 endpoints
-
GET
/api/v1/platform/flash-messages- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/flash-messages" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/flash-messagesposition, duration_seconds, auto_close: any of them; the rest keep their value.position, duration_seconds, auto_close: any of them; the rest keep their value.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/flash-messages" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
leads 5 endpoints
-
GET
/api/v1/platform/leads- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/leads" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/leads/{lead}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
leadstring The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/leads/{lead}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/leads/{lead}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
leadstring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
statussometimes|in:new,contacted,closednotessometimes|nullable|string|'max:' . \App\Support\Limits::chars(5000)assigned_tosometimes|nullable|integer|Rule::exists(\App\Models\User::class, 'id')->where('is_admin', true)Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/leads/{lead}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"status":"new","notes":"...","assigned_to":1}' -
POST
/api/v1/platform/leads/{lead}/archiveArchive (soft delete, restorable); messages are never deleted.Archive (soft delete, restorable); messages are never deleted.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
leadstring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/leads/{lead}/archive" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/leads/{lead}/restore- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
leadstring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/leads/{lead}/restore" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
licenses 6 endpoints
-
GET
/api/v1/platform/companies/{company}/licenses- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/licenses" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/licenses- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/licenses" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/companies/{company}/licenses/{license}Edits a license in place; fields left out keep their value (platform.companies).Edits a license in place; fields left out keep their value (platform.companies).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.licenseinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/licenses/{license}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/licenses/{license}/suspend- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.licenseinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/licenses/{license}/suspend" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/licenses/{license}/reactivate- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.licenseinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/licenses/{license}/reactivate" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/companies/{company}/licenses/{license}Never the only license or the one in effect (422).Never the only license or the one in effect (422).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.licenseinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/licenses/{license}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
limits 2 endpoints
-
GET
/api/v1/platform/limits- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/limits" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/limitsvalues: {key: number, or null for the built-in default}; sizes in KB. Only the keys sent c...values: {key: number, or null for the built-in default}; sizes in KB. Only the keys sent change.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/limits" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
login-designs 3 endpoints
-
GET
/api/v1/platform/login-designs- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/login-designs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/login-designs/areas- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/login-designs/areas" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/login-designs/{design}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
designstring · [a-z]+ The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/login-designs/{design}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
messaging 6 endpoints
-
GET
/api/v1/platform/messaging/{channel}Secrets are never returned, only whether one is saved.Secrets are never returned, only whether one is saved.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
channelstring · mail|whatsapp The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/messaging/{channel}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/messaging/{channel}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
channelstring · mail|whatsapp The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
passwordrequiredrequiredaccess_tokenrequiredrequiredExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/messaging/{channel}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"password":"...","access_token":"..."}' -
POST
/api/v1/platform/messaging/mail/testOne test email through the saved settings; a failure is a 422 with the reason explained (d...One test email through the saved settings; a failure is a 422 with the reason explained (docs/mail.md).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/messaging/mail/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/messaging/mail/healthIs email going anywhere: the sending method, last 24 hours, queued and failed (docs/mail.m...Is email going anywhere: the sending method, last 24 hours, queued and failed (docs/mail.md).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/messaging/mail/health" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/messaging/mail/deliveriesEmail deliveries, newest first; ?status=sent|logged|queued|failed, ?q= address or subject.Email deliveries, newest first; ?status=sent|logged|queued|failed, ?q= address or subject.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statusnullable|in:sent,logged,queued,failedqnullable|string|'max:' . \App\Support\Limits::chars(190)per_pagenullable|integer|min:1|'max:' . \App\Support\Limits::pageMax(100)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/messaging/mail/deliveries?status=sent&q=...&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/messaging/mail/deliveries/{delivery}/retryPuts a failed email back in the queue; it goes out within a minute.Puts a failed email back in the queue; it goes out within a minute.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
deliverystring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/messaging/mail/deliveries/{delivery}/retry" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
monitor 7 endpoints
-
GET
/api/v1/platform/monitor/overviewEverything the live page shows, with the value of each alert metric.Everything the live page shows, with the value of each alert metric.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/monitor/overview" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/monitor/history?range=24h|7d|30d: chart series averaged per slot.?range=24h|7d|30d: chart series averaged per slot.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
rangenullable|in:24h,7d,30dExample request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/monitor/history?range=24h" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/monitor/alerts/rules- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/monitor/alerts/rules" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/monitor/alerts/rules/{rule}threshold, for_minutes, cooldown_minutes, enabled: any of them.threshold, for_minutes, cooldown_minutes, enabled: any of them.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
rulestring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
thresholdsometimes|numeric|'min:' . $bounds['min']|'max:' . $bounds['max']for_minutessometimes|integer|min:1|max:1440cooldown_minutessometimes|integer|min:5|max:10080enabledsometimes|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/monitor/alerts/rules/{rule}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"threshold":1.5,"for_minutes":1,"cooldown_minutes":1,"enabled":true}' -
GET
/api/v1/platform/monitor/alerts/recipients- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/monitor/alerts/recipients" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/monitor/alerts/recipientsrecipients: a list of addresses (an empty list stops alert emails), language: en|ar.recipients: a list of addresses (an empty list stops alert emails), language: en|ar.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
recipientspresent|array|max:20recipients.*email:rfc|max:190languagesometimes|in:en,arExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/monitor/alerts/recipients" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"recipients":[],"language":"en"}' -
GET
/api/v1/platform/monitor/alerts/eventsThe alerts log, newest first; ?kind=fired|repeat|recovered, ?metric=.The alerts log, newest first; ?kind=fired|repeat|recovered, ?metric=.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
kindnullable|in:fired,repeat,recoveredmetricnullable|in:cpu,memory,disk,load,db_connections,db_timeouts,errors,failed_jobs,service_down,site_down,ssl_days,zenhr_sync_failed,device_offline_hours,backup_age_hoursper_pagenullable|integer|min:1|'max:' . \App\Support\Limits::pageMax(100)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/monitor/alerts/events?kind=fired&metric=cpu&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
notification-log 3 endpoints
-
GET
/api/v1/platform/notification-logGET notification-log?tab=notices|broadcasts|emails&from=&to=&company=&category=&channel=&s...GET notification-log?tab=notices|broadcasts|emails&from=&to=&company=&category=&channel=&status=&kind=&q=&per_page=
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/notification-log" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/notification-log/exportGET notification-log/export?tab=&format=csv|xlsx&…filters, or send= one notice's recipient...GET notification-log/export?tab=&format=csv|xlsx&…filters, or send= one notice's recipients.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 20 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/notification-log/export" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/notification-log/{send}GET notification-log/{send}: one company notice with every person and each channel's answe...GET notification-log/{send}: one company notice with every person and each channel's answer.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
sendinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/notification-log/{send}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
phone-sharing 2 endpoints
-
GET
/api/v1/platform/phone-sharingGET phone-sharing: the platform default for one account per phone (docs/platform-control.m...GET phone-sharing: the platform default for one account per phone (docs/platform-control.md «الهاتف المشترك»), and the companies with their own.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/phone-sharing" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/phone-sharingPUT phone-sharing: mode (allow|warn|block), max_accounts (1–10).PUT phone-sharing: mode (allow|warn|block), max_accounts (1–10).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
moderequiredrequired|Rule::in(self::MODES)max_accountsrequiredrequired|integer|between:1,10Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/phone-sharing" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"mode":"...","max_accounts":1}'
platform-admins 5 endpoints
-
GET
/api/v1/platform/platform-adminsq (name or email), permission, sort (name, email, added) and dir. With per_page (10, 25, 5...q (name or email), permission, sort (name, email, added) and dir. With per_page (10, 25, 50, 100) one page and its meta; without, all of them. Also the permissions there are, with what each allows.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/platform-admins" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/platform-adminsname, email, permissions. The temporary password is in the answer once.name, email, permissions. The temporary password is in the answer once.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredrequired|string|max:120emailrequiredrequired|email|max:190permissionssometimes|nullable|arraypermissions.*string|in:platform.ai,server.monitor,platform.app_control,platform.broadcast,platform.companies,platform.phones.location,platform.admins,platform.notifications,platform.zenhr,platform.flash_messages,platform.server_switch,platform.app_debug,platform.backups,platform.backups_change,platform.backups_runExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/platform-admins" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","email":"[email protected]","permissions":[]}' -
GET
/api/v1/platform/platform-admins/{platform_admin}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
platform_adminstring The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/platform-admins/{platform_admin}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT PATCH
/api/v1/platform/platform-admins/{platform_admin}name; permissions (the whole list kept), or grant / revoke one.name; permissions (the whole list kept), or grant / revoke one.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
platform_adminstring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
namerequiredsometimes|required|string|max:120permissionssometimes|nullable|arraypermissions.*string|in:platform.ai,server.monitor,platform.app_control,platform.broadcast,platform.companies,platform.phones.location,platform.admins,platform.notifications,platform.zenhr,platform.flash_messages,platform.server_switch,platform.app_debug,platform.backups,platform.backups_change,platform.backups_rungrantsometimes|string|in:platform.ai,server.monitor,platform.app_control,platform.broadcast,platform.companies,platform.phones.location,platform.admins,platform.notifications,platform.zenhr,platform.flash_messages,platform.server_switch,platform.app_debug,platform.backups,platform.backups_change,platform.backups_runrevokesometimes|string|in:platform.ai,server.monitor,platform.app_control,platform.broadcast,platform.companies,platform.phones.location,platform.admins,platform.notifications,platform.zenhr,platform.flash_messages,platform.server_switch,platform.app_debug,platform.backups,platform.backups_change,platform.backups_runExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/platform-admins/{platform_admin}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"...","permissions":[],"grant":"platform.ai","revoke":"platform.ai"}' -
DELETE
/api/v1/platform/platform-admins/{platform_admin}Removes the admin access: no panel, no permissions, platform API keys revoked, signed out.Removes the admin access: no panel, no permissions, platform API keys revoked, signed out.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
platform_adminstring The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/platform-admins/{platform_admin}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
security 2 endpoints
-
GET
/api/v1/platform/security- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/security" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/security- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/security" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
seo 5 endpoints
-
GET
/api/v1/platform/seo- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/seo" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/seo/settings- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/seo/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/seo/robots- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/seo/robots" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/seo/pages/{key}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
keystring · [a-z]+\.[a-z-]+ The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/seo/pages/{key}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/seo/pages/{key}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
keystring · [a-z]+\.[a-z-]+ The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/seo/pages/{key}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
server-switch 2 endpoints
-
GET
/api/v1/platform/server-switchGET server-switch: the app's live/dev switch {on, until, by, at} (docs/mobile-server-switc...GET server-switch: the app's live/dev switch {on, until, by, at} (docs/mobile-server-switch.md).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/server-switch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/server-switchPUT server-switch: on (boolean); hours (1–168, default 24; null = no end) for how long it...PUT server-switch: on (boolean); hours (1–168, default 24; null = no end) for how long it stays on.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/server-switch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
sign-in-options 2 endpoints
-
GET
/api/v1/platform/sign-in-optionsThe sign-in screen switches {forgot_password, sso, privacy}, with meta.last_change {by, at...The sign-in screen switches {forgot_password, sso, privacy}, with meta.last_change {by, at} (null = defaults).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/sign-in-options" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/sign-in-optionsforgot_password, sso, privacy (booleans): any of them; the rest keep their value.forgot_password, sso, privacy (booleans): any of them; the rest keep their value.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/sign-in-options" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
site 22 endpoints
-
GET
/api/v1/platform/site/settings- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/site/settings- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/site/settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/site/calculatorsA country's rates in force (Iraq by default, ?country= and ?variant= for another).A country's rates in force (Iraq by default, ?country= and ?variant= for another).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/calculators" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/site/calculators- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/site/calculators" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/site/plans- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/plans" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/site/plans- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/site/plans" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/site/plans/{plan}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
planstring The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/site/plans/{plan}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/site/plans/{plan}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
planstring The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/site/plans/{plan}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/site/plans/{plan}/move/{direction}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
planstring The record's ID. directionstring · up|down The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/site/plans/{plan}/move/{direction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/site/section-types- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/section-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/site/pages/{page}/sections- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
pagestring The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/pages/{page}/sections" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/site/pages/{page}/sections- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
pagestring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
typerequiredrequired|stringExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/site/pages/{page}/sections" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"type":"..."}' -
PATCH
/api/v1/platform/site/sections/{section}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
sectionstring The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/site/sections/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/site/sections/{section}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
sectionstring The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/site/sections/{section}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/site/sections/{section}/move/{direction}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
sectionstring The record's ID. directionstring · up|down The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/site/sections/{section}/move/{direction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/site/offices- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/offices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/site/offices- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/site/offices" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/site/offices/{office}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
officestring The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/site/offices/{office}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/site/offices/{office}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
officestring The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/site/offices/{office}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/site/offices/{office}/move/{direction}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
officestring The record's ID. directionstring · up|down The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/site/offices/{office}/move/{direction}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/site/contact-settings- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/site/contact-settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/site/contact-settings- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/site/contact-settings" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
support-sessions 3 endpoints
-
GET
/api/v1/platform/companies/{company}/support-sessions- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/support-sessions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/support-sessions- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 10 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
reasonrequiredrequired|string|min:5|'max:' . \App\Support\Limits::chars(500)Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/support-sessions" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}' -
DELETE
/api/v1/platform/support-sessions/{supportSession}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
supportSessionstring The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/support-sessions/{supportSession}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
system-announcements 5 endpoints
-
GET
/api/v1/platform/system-announcements?state=live|scheduled|ended|off?state=live|scheduled|ended|off
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statenullable|in:live,scheduled,ended,offper_pagenullable|integer|min:1|'max:' . \App\Support\Limits::pageMax(100)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/system-announcements?state=live&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/system-announcements- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/system-announcements" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/system-announcements/{announcement}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
announcementinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/system-announcements/{announcement}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/system-announcements/{announcement}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
announcementinteger The record's ID. Example request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/system-announcements/{announcement}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
DELETE
/api/v1/platform/system-announcements/{announcement}Only one nobody has seen yet (422 otherwise: switch it off with is_active false instead).Only one nobody has seen yet (422 otherwise: switch it off with is_active false instead).
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
announcementinteger The record's ID. Example request
Link to this endpointcurl -X DELETE "https://api.mihnaro.com/api/v1/platform/system-announcements/{announcement}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
users 6 endpoints
-
GET
/api/v1/platform/companies/{company}/usersThe company's accounts: q (name or email), role (admin, user), status (active, temporary,...The company's accounts: q (name or email), role (admin, user), status (active, temporary, disabled), sort (name, email, role, status, joined) and dir. With per_page (10, 25, 50, 100) one page and its meta; without, all of them.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/users" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/users/{user}/reset-password- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userstring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/users/{user}/reset-password" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/companies/{company}/users/{user}/contact- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userstring The record's ID. Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/users/{user}/contact" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/users/{user}/unlock- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userstring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/users/{user}/unlock" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/users/{user}/two-factor/reset- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userstring The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/users/{user}/two-factor/reset" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PATCH
/api/v1/platform/companies/{company}/users/{user}/accessSwitches the account on or off (is_active) and makes it a company admin or not (is_owner);...Switches the account on or off (is_active) and makes it a company admin or not (is_owner); platform.companies.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.userstring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
is_activesometimes|booleanis_ownersometimes|booleanExample request
Link to this endpointcurl -X PATCH "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/users/{user}/access" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"is_active":true,"is_owner":true}'
zenhr-sync 24 endpoints
-
PUT
/api/v1/platform/zenhr-sync/emergency-stopStops every company's sync, or lifts that.Stops every company's sync, or lifts that.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
onrequiredrequired|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/zenhr-sync/emergency-stop" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"on":true}' -
GET
/api/v1/platform/companies/{company}/zenhr-sync- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/companies/{company}/zenhr-sync/switchOn or off for this company ("off" when the move to Mihnaro is final). A run in progress st...On or off for this company ("off" when the move to Mihnaro is final). A run in progress stops at its next safe place.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
enabledrequiredrequired|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/switch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"enabled":true}' -
GET
/api/v1/platform/companies/{company}/zenhr-sync/health- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/health" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies/{company}/zenhr-sync/runs- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statussometimes|stringtriggersometimes|stringper_pagesometimes|integer|min:1|'max:' . \App\Support\Limits::pageMax(100)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/runs?status=...&trigger=...&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/runsQueues a run for the runner (it can take minutes); one at a time, whoever started it.Queues a run for the runner (it can take minutes); one at a time, whoever started it.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 6 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
sourcesometimes|in:api,extractiondry_runsometimes|booleandata_typessometimes|arraybranch_idssometimes|arraysincesometimes|nullable|dateExample request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/runs" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"source":"api","dry_run":true,"data_types":[],"branch_ids":[],"since":"2026-11-01"}' -
GET
/api/v1/platform/companies/{company}/zenhr-sync/runs/{run}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/runs/{run}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies/{company}/zenhr-sync/runs/{run}/itemsThe records a run touched: table, reference and column names, never values.The records a run touched: table, reference and column names, never values.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionsometimes|in:inserted,updated,flaggedper_pagesometimes|integer|min:1|'max:' . \App\Support\Limits::pageMax(200)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/runs/{run}/items?action=inserted&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/runs/{run}/stop- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/runs/{run}/stop" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/runs/{run}/resume- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.runinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/runs/{run}/resume" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies/{company}/zenhr-sync/conflicts- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
statussometimes|in:open,applied,kept,alllimitsometimes|integer|min:1|'max:' . \App\Support\Limits::cap(200)offsetsometimes|integer|min:0Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/conflicts?status=open&limit=1&offset=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/conflicts/{conflict}/{action}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.conflictinteger The record's ID. actionstring · apply|keep The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/conflicts/{conflict}/{action}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies/{company}/zenhr-sync/connection- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/connection" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/companies/{company}/zenhr-sync/connectionTakes the keys as the screen does, and never returns them.Takes the keys as the screen does, and never returns them.
- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 20 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/connection" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/connection/test- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 6 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/connection/test" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/branches/{branch}/link- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/branches/{branch}/link" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/companies/{company}/zenhr-sync/branches/{branch}/switch- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.branchinteger The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
enabledrequiredrequired|booleanExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/branches/{branch}/switch" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"enabled":true}' -
GET
/api/v1/platform/companies/{company}/zenhr-sync/data-types- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/data-types" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
PUT
/api/v1/platform/companies/{company}/zenhr-sync/data-types/{type}- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.typestring The record's ID. Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
branch_idsometimes|nullable|integerenabledsometimes|booleanfrequencysometimes|nullable|stringstarting_fromsometimes|nullable|dateExample request
Link to this endpointcurl -X PUT "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/data-types/{type}" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"branch_id":1,"enabled":true,"frequency":"...","starting_from":"2026-11-01"}' -
GET
/api/v1/platform/companies/{company}/zenhr-sync/totals- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/totals" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
GET
/api/v1/platform/companies/{company}/zenhr-sync/payroll-compare- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/payroll-compare" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" -
POST
/api/v1/platform/companies/{company}/zenhr-sync/payroll-compare- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 6 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
monthssometimes|integer|min:1|max:12Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/payroll-compare" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"months":1}' -
GET
/api/v1/platform/companies/{company}/zenhr-sync/audit- Sign-in
- Platform admin key
- Permission
- Any signed-in user of the company
- Rate limit
- 120 requests a minute
Path parameters
companyinteger Your company's ID, from GET /api/v1/app/me.Query parameters
The rules as the code checks them. Some apply only in certain cases, as the description says.
actionsometimes|string|max:40per_pagesometimes|integer|min:1|'max:' . \App\Support\Limits::pageMax(100)Example request
Link to this endpointcurl "https://api.mihnaro.com/api/v1/platform/companies/$MIHNARO_COMPANY/zenhr-sync/audit?action=...&per_page=1" \ -H "Authorization: Bearer $MIHNARO_TOKEN" \ -H "Accept: application/json"
Fingerprint machines
The machine's X-Device-Token.
biometric 1 endpoint
-
POST
/api/v1/biometric/punchesPOST {"punches":[{"pin":"12","time":"2026-10-19 08:03:00"}]} with the header X-Device-Toke...POST {"punches":[{"pin":"12","time":"2026-10-19 08:03:00"}]} with the header X-Device-Token.
- Sign-in
- X-Device-Token
- Permission
- Any signed-in user of the company
- Rate limit
- 600 requests a minute
Body fields
The rules as the code checks them. Some apply only in certain cases, as the description says.
punchesrequiredrequired|array|max:2000punches.*.pinrequiredrequired|string|max:32punches.*.timerequiredrequired|datepunches.*.statusnullable|string|max:8Example request
Link to this endpointcurl -X POST "https://api.mihnaro.com/api/v1/biometric/punches" \ -H "X-Device-Token: $MIHNARO_DEVICE_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"punches":[]}'
MCP servers
Streamable HTTP, with the same tokens and keys as the API. The tools do what the matching endpoints do. How to connect
https://api.mihnaro.com/mcp/app
306 tools
-
access_controlchanges data Door access control like BioTime (devices.manage, docs/devices.md). kind time_zones (name {en, ar},...Door access control like BioTime (devices.manage, docs/devices.md). kind time_zones (name {en, ar}, device_tz_id 2-50, schedule {sun..sat, holiday: up to 3 [["08:00","12:00"]] intervals}), levels (name, access_time_zone_id, doors [{device_id, door (0 = all)}]) or assignments (access_level_id, target_type employee|group|department|branch|position|all|visitor, target_id (a group: whoever joins it gets the access, whoever leaves loses it; or target_ids [..] for several employees at once: one assignment each), effect allow|deny, biometric_device_id for a device-only deny, visitor_name, visitor_pin, visitor_card, starts_at, ends_at, note). action list, save (id to change; fields), delete (id). Every change syncs the devices.
Argument Type Description company_idrequiredinteger kindrequiredstring
time_zones | levels | assignmentsactionrequiredstring
list | save | deleteidinteger fieldsobject -
account_deletionchanges data The signed-in person's request to delete their Mihnaro account and data (docs/account-deletion.md),...The signed-in person's request to delete their Mihnaro account and data (docs/account-deletion.md), as GET/POST /api/v1/app/me/deletion-request. action "status" lists their requests; "request" asks for deletion (optional reason): HR of each of their companies and the Mihnaro team are told. A pending request is returned instead of a new one.
Argument Type Description actionrequiredstring
status | requeststatus: my requests; request: ask for deletion reasonstring Optional: why -
act_on_attendance_recommendationschanges data Look at attendance again (action refresh, with from and to; the last month by default, three months...Look at attendance again (action refresh, with from and to; the last month by default, three months at most), or act on pending recommendations by ids: ignore, notify (tell the direct manager) or apply (an absence becomes leave of leave_type_id; time taken from the leave type attendance setup names; overtime and salary deductions come with requests and payroll).
Argument Type Description company_idrequiredinteger actionrequiredstring
refresh | ignore | notify | applyidsarray fromstring tostring leave_type_idinteger Apply: the leave type absences are recorded as -
add_org_levelchanges data Add a missing organization level (department, section, work location…) while filling an employee's j...Add a missing organization level (department, section, work location…) while filling an employee's job details, as the employee page does. Needs structure.manage, and the employee's branch (or, for a new hire, the branch worked in) must allow adding organization levels from the employee page.
Argument Type Description company_idrequiredinteger typerequiredstring
work_location | department | section | project | hierarchy_group | business_unit | division | segmentnamerequiredobject {"en": "...", "ar": "..."} parent_idinteger For a section: its department. employee_idinteger The employee being edited (their branch decides); leave out for a new hire. -
app_dashboardchanges data The dashboard the mobile app draws for you: the widgets you may see, as blocks (stat, chart, list, c...The dashboard the mobile app draws for you: the widgets you may see, as blocks (stat, chart, list, card), each with what it opens in the app. action read returns them, with the optional filters period (this_month, last_month, last_30, this_quarter, this_year), from, to, branch_id and department_id. action save changes the order and what shows on the phone, without touching the web: order (keys), show (keys; the others are hidden), or reset (true) to follow the web again. A widget you may not see is refused.
Argument Type Description company_idrequiredinteger actionrequiredstring
read | saveperiodstring read: this_month, last_month, last_30, this_quarter or this_year fromstring read: Y-m-d tostring read: Y-m-d branch_idinteger read: narrow to this branch, inside what you reach department_idinteger read: narrow to this department, inside what you reach orderarray save: widget keys in order showarray save: the widget keys to show; the others are hidden resetboolean save: go back to following the web's layout -
app_reminderschanges data People not on the Mihnaro app yet (docs/platform-control.md «لم يدخلوا التطبيق بعد»): current employ...People not on the Mihnaro app yet (docs/platform-control.md «لم يدخلوا التطبيق بعد»): current employees in your scope who never signed in to the app. action list (app_devices.view; filters q, branch_id, account yes|no; page, per_page): employee_id, number, name, branch, has_account, email and mobile half hidden, last_reminded_at, reminders. action send (app_devices.remind): channel email|whatsapp, employee_ids [..] or all=true (with filters), at most 500, nobody twice in 24 hours, a few a minute: someone with an account gets the store links and the sign-in steps, someone without one the invitation to choose a password; push can't reach them. Returns queued, invitations, skipped {reason: count}. Every send is in the notifications log.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | sendchannelstring
email | whatsappemployee_idsarray allboolean filtersobject pageinteger per_pageinteger -
archive_employeechanges data "Delete" an employee: the record is archived, never deleted. It leaves the lists, headcount, payroll..."Delete" an employee: the record is archived, never deleted. It leaves the lists, headcount, payroll runs, approvals and fingerprint devices and the person can no longer sign in; attendance, payslips, requests, documents and history stay linked. Its number stays reserved. Not the same as terminate_employee (end of service). Undo with restore_employee. Needs employees.archive.
Argument Type Description company_idrequiredinteger employee_idinteger The internal id; or give employee_number. employee_numberstring branch_idinteger With employee_number, when numbers repeat across branches. reasonstring Why it is archived (optional, up to 500 characters). -
assign_rolechanges data Give a role to a current employee who has a sign-in account, in a scope: company, branch (scope_id =...Give a role to a current employee who has a sign-in account, in a scope: company, branch (scope_id = branch id), department, work_location, section, project, hierarchy_group, business_unit, division or segment (scope_id = that unit's id), reports (the person's own reports) or reports_of (scope_id = an employee whose reports it covers).
Argument Type Description company_idrequiredinteger employee_idrequiredinteger role_idrequiredinteger scoperequiredstring
company | branch | department | work_location | section | project | hierarchy_group | business_unit | division | segment | reports | team | reports_ofscope_idinteger The branch, unit or employee, for those scopes. -
assign_to_projectchanges data Assign an employee to a project, or change their assignment: job role (position), contribution perce...Assign an employee to a project, or change their assignment: job role (position), contribution percentage, staff code, dates.
Argument Type Description company_idrequiredinteger project_idrequiredinteger employee_idrequiredinteger position_idinteger Job role on the project contribution_percentnumber 0-100, default what the employee has left (an employee's projects add up to 100% at most) staff_codestring start_datestring YYYY-MM-DD end_datestring YYYY-MM-DD -
biometric_templatesread only Biometric templates and compatibility (devices.manage, docs/devices.md). view templates: an employee...Biometric templates and compatibility (devices.manage, docs/devices.md). view templates: an employee's templates (type, algorithm version, source device); the template data only with include_data true and employees.view_sensitive, and the export is audited. view compatibility: every template against every device (or device_id) with the reason a device can't take one. view conflicts: slots two devices hold different data for, each version with its device, enrolment and seen time (settle with resolve_template_conflict). view duplicates: the same template data under different PINs (possible duplicate person).
Argument Type Description company_idrequiredinteger viewstring
templates | compatibility | conflicts | duplicatesemployee_idinteger device_idinteger include_databoolean -
buddy_punching_reviewchanges data HR's review of buddy punching (docs/attendance-security.md §19). Signals are evidence, never a verdi...HR's review of buddy punching (docs/attendance-security.md §19). Signals are evidence, never a verdict, and change no attendance. attendance.buddy.view: action people (scores with what was found, highest first), signals (filters employee, kind, status), presence (filters employee, status, failed). attendance.buddy.review: action decide_signal (id, decision confirm|dismiss, note; dismissing takes its weight off the score), review_presence (id, decision excuse|confirm, note). attendance.buddy.export: action export (the people table as rows). Same API: buddy-punching/*.
Argument Type Description company_idrequiredinteger actionrequiredstring
people | signals | presence | decide_signal | review_presence | exportidinteger decisionstring notestring employeeinteger kindstring statusstring failedboolean -
buddy_punching_settingschanges data The four layers against one employee clocking in for another (attendance.buddy.manage, docs/attendan...The four layers against one employee clocking in for another (attendance.buddy.manage, docs/attendance-security.md §19). action get: each layer's mode, settings, rules, and whether the face model is on the server. action set with layer bp_face|bp_device_key|bp_presence|bp_pattern: inherit (use the Mihnaro default), or mode off|flag|refuse (bp_pattern can only flag); bp_face: enrol_required (the biometric photo in the app before anything else), enrol_approval (HR approves it before it counts), enrol_remind_days, enrol_photo_days, blink_required (a blink on a short clip as well as the head movement), weak_action flag|refuse, refused_action allow|flag|refuse; bp_presence: per_shift 1–4, respond_minutes 2–60, percent 1–100; bp_pattern: tandem_seconds, tandem_min, stay_minutes, dual_minutes, window_days, notify_score; rules [{target_type all|branch|department|section|work_location|group|employee, target_id, effect include|exclude}], no include = everyone. Off by default; demo and reviewer accounts are never reached. Same API: GET settings/buddy-punching, PATCH settings/buddy-punching/{layer}.
Argument Type Description company_idrequiredinteger actionrequiredstring
get | setlayerstring
bp_face | bp_device_key | bp_presence | bp_patterninheritboolean modestring
off | flag | refuseweak_actionstring refused_actionstring enrol_requiredboolean enrol_approvalboolean enrol_remind_daysinteger enrol_photo_daysinteger blink_requiredboolean per_shiftinteger respond_minutesinteger percentinteger tandem_secondsinteger tandem_mininteger stay_minutesinteger dual_minutesinteger window_daysinteger notify_scoreinteger rulesarray -
calculate_hrread only Run one of mihnaro.com's free HR calculators for a country (ISO code, default IQ; list_calculator_co...Run one of mihnaro.com's free HR calculators for a country (ISO code, default IQ; list_calculator_countries lists the ones with rules) and get the breakdown, the total and the rules used, each with its source and basis "law" (verified on an official page), "confirmed" (the company accountant), "owner" (the owner, 2026-11-02) or "estimate". A calculator runs only when every rule it uses is verified against an official source; otherwise the answer is an error with code "not_confirmed", the rules not confirmed and the country's "requires confirmation" list. Results are not legal or tax advice; nothing is stored. tool: end-of-service (start_date, end_date as Y-m-d, basic; optional days_per_year, leaving_reason termination|resignation, min_years, unused_leave_days) | net-salary (basic; allowances, marital_status single|married, ss_employee_percent) | gross-salary (net; allowances, marital_status, ss_employee_percent) | overtime (basic; hours, rest_day_hours, holiday_hours, multiplier, rest_day_multiplier, holiday_multiplier, hours_per_day) | leave (basic; encash_days, unpaid_days, day_base) | cost-to-company (basic; allowances, other_monthly, annual_extras, marital_status, ss_employee_percent, ss_employer_percent). Some countries add region (state, province or region code), children (household tax) or month (1–12, cumulative tax) to the salary tools. The inputs a country takes are in list_hr_calculators. Money is monthly, in the country's currency. Same as GET /api/v1/tools/calculators/{tool}.
Argument Type Description toolrequiredstring
end-of-service | net-salary | gross-salary | overtime | leave | cost-to-companyinputsrequiredobject The tool's inputs, e.g. {"basic": 1500000, "allowances": 300000}. countrystring ISO country code, e.g. "SA". Default IQ. variantstring The country's rule variant when it has more than one (e.g. "saudi", "non-saudi"); default its first. datestring Use the rules in force on this day (Y-m-d); default today. -
cancel_requestchanges data Cancel an approved request or time off (ZenHR's Request to Cancel). action cancel: HR over the emplo...Cancel an approved request or time off (ZenHR's Request to Cancel). action cancel: HR over the employee (requests.manage, or leaves.manage for time off) cancels it now; the employee's own ask walks the cancellation cycle (the request's approval chain, step by step); reason optional. Its payroll transactions, in-advance salary, hour deductions and probation extension are taken back, unless a closed payroll month already paid them. action decide: the approver of the step it waits on (or HR over the employee, whose decision is final) approves or rejects (decision approved|rejected, note optional); the last approval cancels it. action list: asks waiting for your decision, with cancel_chain, waiting_on and cancel_decisions. kind requests|leaves, id.
Argument Type Description company_idrequiredinteger actionrequiredstring
cancel | decide | listkindstring
requests | leavesidinteger reasonstring decisionstring
approved | rejectednotestring -
clockchanges data Clock in or out now, under the company's clocking rules (network, work location with lat and lng, da...Clock in or out now, under the company's clocking rules (network, work location with lat and lng, days off, QR only). action: in or out, or scan with a work location's QR code (qr_token, and t and s of a rotating code: the parts of its /clock/qr/{token}?t=&s= link); attendance_function_id for a function (break, visit...). Punches are always now: a past time (occurred_at) is refused, since only the mobile app keeps punches offline and proves their time.
Argument Type Description company_idrequiredinteger actionrequiredstring
in | out | scanqr_tokenstring tinteger sstring latnumber lngnumber attendance_function_idinteger occurred_atstring -
clocking_deviceschanges data The phones and browsers employees clock from (attendance.security.review, docs/attendance-security.m...The phones and browsers employees clock from (attendance.security.review, docs/attendance-security.md). action list (filters employee_id, kind phone|browser, status pending|approved|blocked|retired, device), or for one device (id): approve, block, reset (the next punch from it needs approval again), rename (label), share (shared true/false: a shared computer, exempt from the same-device check; browsers only). action reset_employee with employee_id resets all of an employee's phones.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | approve | block | reset | rename | share | reset_employeeidinteger employee_idinteger kindstring
phone | browserstatusstring
pending | approved | blocked | retireddevicestring labelstring sharedboolean -
company_connected_appscan delete The AI apps people connected to this company (integrations.ai_apps.manage). action list: each connec...The AI apps people connected to this company (integrations.ai_apps.manage). action list: each connection with its person and last use. action revoke: grant_id; the app stops at once and its owner is told. Confirm before revoking. docs/ai-integrations.md.
Argument Type Description company_idrequiredinteger actionstring
list | revokegrant_idinteger -
company_limitschanges data The company's file sizes, counts and lengths (docs/limits.md), as /api/v1 settings/limits. action re...The company's file sizes, counts and lengths (docs/limits.md), as /api/v1 settings/limits. action read (limits.view): each limit with its company, branch and platform values, the value in force and the server's ceiling for files. action update (limits.manage): values {key: number, or null to go back to the level above}, sizes in KB; only the keys sent change. branch_id: one branch's own values.
Argument Type Description company_idrequiredinteger actionstring
read | updateread by default. branch_idinteger One branch's own values, not the main branch. valuesobject For update: {key: number or null}. -
decide_leavechanges data Decide the step a pending leave request waits on, when it is waiting on you (its approval chain: the...Decide the step a pending leave request waits on, when it is waiting on you (its approval chain: the employee's manager, HR with requests.manage, or the people an approval template names): leave_id, decision approved or rejected, decision_note (some types need it to reject), non_deduct (approve without taking the days; needs leaves.manage and a type that allows it). Not your own.
Argument Type Description company_idrequiredinteger leave_idrequiredinteger decisionrequiredstring
approved | rejecteddecision_notestring non_deductboolean -
decide_requestchanges data Act on requests from the approvals page. action decide: approve or reject the step items wait on, wh...Act on requests from the approvals page. action decide: approve or reject the step items wait on, when it is waiting on you (items: "request:ID" or "leave:ID", several at once; ones you can't decide are skipped). action override: decide one item waiting on someone else, when you may override it (the approval template's admins, else HR or a manager above). action withdraw: pull back your own pending request (items: one "request:ID"). decision approved or rejected, decision_note. Never your own request.
Argument Type Description company_idrequiredinteger actionrequiredstring
decide | override | withdrawitemsrequiredarray decisionstring
approved | rejecteddecision_notestring -
delete_documentcan delete Delete a document and its files (by id from list_documents). Allowed for whoever uploaded it, HR for...Delete a document and its files (by id from list_documents). Allowed for whoever uploaded it, HR for employees in their scope, and company-wide HR for company documents.
Argument Type Description company_idrequiredinteger document_idrequiredinteger -
delete_employee_file_recordcan delete Remove a contract, bank account, family member or document from an employee's file (its files are de...Remove a contract, bank account, family member or document from an employee's file (its files are deleted too).
Argument Type Description company_idrequiredinteger employee_idrequiredinteger kindrequiredstring
contracts | bank_accounts | family | documentsrecord_idrequiredinteger -
delete_org_unitchanges data Delete an unused unit of the organization structure. Refused while any employee (former ones include...Delete an unused unit of the organization structure. Refused while any employee (former ones included) is in it, a section hangs under it, or anything else still uses it: turn it off with save_org_unit (is_active false) instead.
Argument Type Description company_idrequiredinteger unit_idrequiredinteger -
delete_permission_groupchanges data Delete a group: its people lose what its seats gave them. As DELETE permission-groups/{id}. Needs ro...Delete a group: its people lose what its seats gave them. As DELETE permission-groups/{id}. Needs roles.manage.
Argument Type Description company_idrequiredinteger group_idrequiredinteger -
delete_permission_overridechanges data Take off one person's exception. As DELETE permission-overrides/{id}. Needs roles.manage.Take off one person's exception. As DELETE permission-overrides/{id}. Needs roles.manage.
Argument Type Description company_idrequiredinteger override_idrequiredinteger -
delete_rolecan delete Delete a role; everyone who had it loses it.Delete a role; everyone who had it loses it.
Argument Type Description company_idrequiredinteger role_idrequiredinteger -
delete_time_setup_itemchanges data Delete a time setup item by kind and id (attendance_setup.manage). A shift or work location still in...Delete a time setup item by kind and id (attendance_setup.manage). A shift or work location still in use is kept, with an error.
Argument Type Description company_idrequiredinteger kindrequiredstring
shifts | overtime_types | holidays | geolocations | biometric_devicesidrequiredinteger -
describe_sectionread only What an engine section is made of for you: its columns, filters, record fields, forms, actions and b...What an engine section is made of for you: its columns, filters, record fields, forms, actions and blocks, each with its permission. What is closed to you isn't listed (docs/mobile-engine.md).
Argument Type Description company_idrequiredinteger sectionrequiredstring
employees | employee_contracts | employee_bank_accounts | employee_family | employee_documents | employee_job_history | terminations | attendance_sheet | attendance_records | missing_punches | team_locations | team_leaves | leave_balances | leave_adjustments | employee_shifts | team_schedule | work_shifts | approval_delegations | manage_announcements | manage_events | manage_tasks | manage_letters | disciplinary_actions | suspensions | company_assets | field_jobs | field_sites | field_customers | field_customer_sites | field_technicians | field_parts | field_part_movements | field_stock_locations | field_movements | field_vehicles | field_vehicle_documents | field_vehicle_maintenance | field_vehicle_fuel | field_overtime | evaluation_cycles | cycle_evaluations | goals | key_positions | successors | job_openings | job_candidates | candidates | candidate_notes | candidate_interviews | candidate_offers | my_interviews | offers | assessment_tests | assessment_questions | assessment_invitations | assessment_grading | my_assessments | boardings | boarding_tasks | boarding_templates | employee_checklists | payroll_runs | payroll_run_payslips | payroll_salaries | payroll_packages | payroll_package_templates | payroll_transactions | payroll_settlements | payroll_settlement_slips | payroll_loans | payroll_loan_installments | payroll_overtimes | payroll_insurance | payroll_air_tickets | payroll_provisions | setup_branches | setup_org_units | setup_positions | setup_org_levels | setup_termination_reasons | setup_checklist_templates | setup_shifts | setup_holidays | setup_overtime_types | setup_attendance_functions | setup_leave_types | setup_payroll_general | setup_payroll_advance | setup_payroll_extra_settings | setup_payroll_tax_settings | setup_payroll_social_security | setup_payroll_tax | setup_payroll_extra | setup_payroll_bank_accounts | setup_transaction_types | setup_part_time_transaction_types | setup_loan_types | setup_cost_centers | setup_salary_bands | setup_expense_types | setup_cities | setup_attendance_devices | setup_device_time_zones | setup_roles | setup_roles_assignments | setup_permission_groups | setup_permission_exceptions | setup_api_keys | setup_webhooks | setup_imports -
device_actionchanges data Act on a device (devices.manage, docs/devices.md). action sync (send what differs), pull (all users...Act on a device (devices.manage, docs/devices.md). action sync (send what differs), pull (all users and templates back from the device), pull_logs (the attendance log from the day from (Y-m-d) to the day to, default today; punches already received are not doubled), info, check, reboot, clear_log, open_door / close_door (door, seconds), set_time; queued for the device's next poll. action remove_users (pins): take people who left or numbers no employee owns off this device; current employees are refused. action settings: access_mode attendance (everyone enrolled; punches count) | access (door only: people with an access level, time zones enforced; punches not counted as attendance) | both (door rules and punches count), sync_enabled, strict_users, family terminal|panel, lock_count, and the branches it serves: all_branches true, or branch_ids (a device shared between branches); its punch rules (docs/devices.md, "Punch rules"): punch_mode first_last|all|function (null = the sheet template's), pair_breaks (with first_last: the punches between the first and the last pair up as breaks), break_function_id (breaks kept as records of that attendance function; none = break time is not worked), debounce_minutes (double-tap window, null = the company's), punch_in_window_minutes and punch_out_grace_minutes (punches by shift, docs/attendance.md: a shift's own windows come first, null = the company's); with recompute_from (Y-m-d) the device's punches since then are paired again under the rule; its network lock (docs/attendance-security.md): allowed_ips (addresses or CIDR ranges, comma-separated; requests from elsewhere are refused; empty = anywhere) and confirm_ip true (trust the address it reports from now, after an "address changed" alarm). action recompute with from (Y-m-d): pair the device's punches since then again. action retry or cancel with command_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
sync | pull | pull_logs | info | check | reboot | clear_log | open_door | close_door | set_time | duplicate_check | settings | recompute | retry | canceldevice_idinteger command_idinteger pinsarray remove_users: device numbers to take off this device (people who left, unknown numbers; list_devices view users shows reason) doorinteger secondsinteger fromstring pull_logs: first day (Y-m-d); recompute: the date to pair punches again from tostring pull_logs: last day (Y-m-d), default today access_modestring
attendance | access | bothsync_enabledboolean strict_usersboolean familystring
terminal | panellock_countinteger all_branchesboolean branch_idsarray punch_modestring
first_last | all | functionpair_breaksboolean break_function_idinteger debounce_minutesinteger punch_in_window_minutesinteger punch_out_grace_minutesinteger recompute_fromstring allowed_ipsstring settings: addresses or CIDR ranges the device may report from, comma-separated; empty = anywhere confirm_ipboolean -
door_eventschanges data Door events the devices reported (devices.manage, docs/devices.md): granted, denied (with the reason...Door events the devices reported (devices.manage, docs/devices.md): granted, denied (with the reason), alarm (forced door, duress, tamper) and state. action list with optional device, result, employee, pin, door, from, to, alerts (unacknowledged alerts only); up to 500, newest first. action acknowledge with event_id.
Argument Type Description company_idrequiredinteger actionstring
list | acknowledgeevent_idinteger deviceinteger resultstring
granted | denied | alarm | state | infoemployeeinteger pinstring doorinteger fromstring tostring alertsboolean -
download_letter_pdfchanges data An HR letter (kind letter, in the letter's language) or a signed document with its signature and aud...An HR letter (kind letter, in the letter's language) or a signed document with its signature and audit trail (kind signature) as a PDF file, as GET /api/v1/letters/{id}/pdf and /api/v1/signatures/{id}/pdf. Only letters and signatures I may see, and the file needs documents.download for the letter's employee; a signature request not signed yet has no PDF. Returns filename, mime, size and the file as base64, plus the download link in the app.
Argument Type Description company_idrequiredinteger kindstring
letter | signatureidrequiredinteger langstring
en | ar -
download_payslip_pdfchanges data A payslip as a PDF file, as GET /api/v1/payslips/{id}/pdf: my own once its run is approved, or any i...A payslip as a PDF file, as GET /api/v1/payslips/{id}/pdf: my own once its run is approved, or any in my payroll scope. Returns filename, mime, size and the file as base64, plus the download link in the app. lang en or ar (default: my language).
Argument Type Description company_idrequiredinteger payslip_idrequiredinteger langstring
en | ar -
download_salaries_excelread only The Salaries report as ZenHR's Excel sheet (docs/payroll-salaries-excel.md), as GET /reports/salarie...The Salaries report as ZenHR's Excel sheet (docs/payroll-salaries-excel.md), as GET /reports/salaries/run?format=xlsx_colored (colored true, the default) or format=xlsx (colored false, "Not colored"): ZenHR's layout read from its own file: logo, title, branch and date, a band row (General Details, Incomes, Reserved Transactions, Company Expenses, Deductions, Company Contributions) over the columns in ZenHR's order, a Serial column, cells filled in their band's colour (or all white), money as "[$IQD] #,##0.000" and a Totals row; right to left in Arabic. filters: the Salaries report filters as run_report takes them (years[], months[], employees[], settlement_type, cols, show…). saved_id starts from saved options. lang en or ar (default: my language). Returns filename, mime, size and the file as base64.
Argument Type Description company_idrequiredinteger filtersobject saved_idinteger langstring
en | arcoloredboolean -
download_workflow_pdfread only An onboarding, offboarding, clearance or resumption workflow as a printable PDF checklist (first-day...An onboarding, offboarding, clearance or resumption workflow as a printable PDF checklist (first-day details, tasks in order with assignee, due date and status, sign-off lines), as GET /api/v1/app/companies/{id}/boardings/{workflow}/pdf. My own workflow once sent, or one whose employee is in my employees.view scope. lang en|ar (Arabic is right to left). Returns filename, mime, size and the file as base64, plus the download link in the app.
Argument Type Description company_idrequiredinteger idrequiredinteger langstring
en | ar -
earned_wagechanges data Earned wage access, the same as the screens. action available: what I can take now in the open payro...Earned wage access, the same as the screens. action available: what I can take now in the open payroll month (earned so far, taken, limit, available, requests left, fee, and why not when blocked). To ask, file the "earned_wage" request type (amount, reason) with the requests tools. action settings: the company settings; action update_settings (payroll_setup.manage): any of ewa_enabled, ewa_percent (1-100 of what is earned), ewa_max_requests (a month), ewa_min_amount, ewa_fee (deducted with the advance), ewa_last_day (0 = any day), ewa_include_allowances, ewa_min_service_days.
Argument Type Description company_idrequiredinteger actionrequiredstring
available | settings | update_settingsewa_enabledboolean ewa_percentnumber ewa_max_requestsinteger ewa_min_amountnumber ewa_feenumber ewa_last_dayinteger ewa_include_allowancesboolean ewa_min_service_daysinteger -
edit_letter_templatechanges data The letter template editor (letters.manage; docs/letters.md), as /api/v1 letter-templates: action ge...The letter template editor (letters.manage; docs/letters.md), as /api/v1 letter-templates: action get: one template with its HTML body (template_id). action placeholders: what a body can have inserted ({name}, {salary}, … with their names, and {signature:ID} for active e-signatures). action upload_image: keep a picture (the logo, a stamp) in Mihnaro from data (a data: URL or base64, PNG, JPEG or GIF, within the letter_image_kb limit of company_limits) and name; put the returned url in the body as <img src="url" style="width: 30%">. action preview: the body (or template_id's) as its letter prints, filled for employee_id or with each placeholder shown by name; language ar|en. action preview_pdf: the same as a PDF file (base64). Save the body with save_letter_template.
Argument Type Description company_idrequiredinteger actionrequiredstring
get | placeholders | upload_image | preview | preview_pdftemplate_idinteger bodystring HTML or plain text with {placeholders} languagestring
ar | enemployee_idinteger addressed_tostring effective_datestring YYYY-MM-DD datastring data:image/png;base64,… or base64 namestring -
employee_accountschanges data Employees' sign-in accounts (employees.manage, in my scope; docs/company-management.md). action exis...Employees' sign-in accounts (employees.manage, in my scope; docs/company-management.md). action existing_users: ZenHR's "Add Employee for an Existing User" list, the ended records (latest per person) to rehire with rehire_employee and company accounts with no employee record (q searches number, name, email). action temporary_password: employee_id with temporary_password (the company's password policy); they must change it after signing in; never the owner's or your own account. action unlock: employee_id, unlocks an account locked by failed sign-in attempts.
Argument Type Description company_idrequiredinteger actionrequiredstring
existing_users | temporary_password | unlockemployee_idinteger temporary_passwordstring qstring -
employee_clocking_fromchanges data Where one employee clocks from (attendance.clocking_from.manage, docs/branch-settings.md §2.8). acti...Where one employee clocks from (attendance.clocking_from.manage, docs/branch-settings.md §2.8). action get: their own choice, the branch's and what applies. action set with clocking_from: both, web, mobile or device (the fingerprint or face device only; refused while no working device serves their branch), or follow to go back to the branch's.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger actionrequiredstring
get | setclocking_fromstring
both | web | mobile | device | follow -
employee_groupschanges data Employee groups like BioTime (employee_groups.manage or devices.manage, docs/employee-groups.md). ac...Employee groups like BioTime (employee_groups.manage or devices.manage, docs/employee-groups.md). action list; get (id): members with how they are in (member = picked, rule = by department/position/branch); save (id to change; fields name {en, ar}, description {en, ar}, color #rrggbb, branch_id (empty = every branch), rules {departments, positions, branches: [ids]}, member_ids); delete (id: its door access and shift shares go too); add_members / remove_members (id, employee_ids). Put a group on devices with manage_device_people enroll by group, and give it door access with access_control assignments target_type group: joining or leaving the group then follows on the devices.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | get | save | delete | add_members | remove_membersidinteger fieldsobject employee_idsarray -
explain_accessread only Why is this open? For one person and one permission, on the web and in the app: open or closed, and...Why is this open? For one person and one permission, on the web and in the app: open or closed, and what makes it so (owner, personal exception, role and scope, or group seat). As GET people/{user}/access/explain. Needs roles.manage.
Argument Type Description company_idrequiredinteger user_idrequiredinteger permissionrequiredstring -
export_notification_logread only The notifications log as a file (notifications.log.view, docs/notifications.md "سجل الإشعارات"), as...The notifications log as a file (notifications.log.view, docs/notifications.md "سجل الإشعارات"), as GET notification-log/export: format csv (default) or xlsx, with the same filters as list_notification_log (at most 10,000 notices), or with send (an id) that notice's recipients and each channel's answer. Returns filename, mime, size and the file as base64.
Argument Type Description company_idrequiredinteger formatstring
csv | xlsxsendinteger One notice's recipients instead of the list. fromstring tostring categorystring channelstring statusstring personinteger branchinteger kindstring actorinteger qstring -
face_templateschanges data Face templates (attendance.face.manage, docs/attendance-security.md §19). A template is encrypted nu...Face templates (attendance.face.manage, docs/attendance-security.md §19). A template is encrypted numbers, and neither it nor any picture is ever returned, including the photo waiting for approval, which HR sees on the screen or the API only. action missing: who hasn't taken the biometric photo their company asks for. action list (filters employee, review pending|approved): status, similarity to the profile photo, enrolled and last matched. action consents (filter employee): the audit trail of consent and template events. action approve (id, note): HR accepts an enrolment. action reset (employee_id, note): deletes the template, and the next selfie enrols again. Same API: buddy-punching/faces, buddy-punching/consents.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | missing | consents | approve | resetidinteger employee_idinteger employeeinteger reviewstring notestring -
field_dispatchchanges data The field dispatch board (docs/field-proof.md §12), as GET field/dispatch, GET field/jobs/{job}/cand...The field dispatch board (docs/field-proof.md §12), as GET field/dispatch, GET field/jobs/{job}/candidates, POST field/jobs/{job}/reassign, POST field/jobs/bulk-cancel and GET field/jobs/{job}/events. action candidates (field.dispatch.manage): job_id, q; who could take the job, best first (available, matching zone or skill, nearest, fewest open jobs). action board (field.dispatch.view): the day's jobs (date Y-m-d, default today, plus open jobs from earlier days or without a date) with their sites and status, and the field employees with their latest verified photo position and, where the company uses live location and you have live_location.view, their live ping; filters branch_id, status, q. action reassign (field.dispatch.manage): job_id, employee_id (an active employee of the job's branch), note; an assigned or in-progress job goes to that employee alone, logged, and the employees are told. action bulk_cancel (field.jobs.cancel): job_ids (up to 200) and reason; open jobs are cancelled and logged, others come back as skipped (not_found, not_open). action events: job_id, the job's dispatch log.
Argument Type Description company_idrequiredinteger actionrequiredstring
board | candidates | reassign | bulk_cancel | eventsdatestring Y-m-d, for board filtersobject branch_id, status, q job_idinteger employee_idinteger notestring qstring job_idsarray reasonstring branchstring -
field_overtimechanges data Overtime from field proof (docs/field-proof.md §18), as the field/overtime API. action summary (fiel...Overtime from field proof (docs/field-proof.md §18), as the field/overtime API. action summary (field.overtime.view): job_id → the verified time on site against the schedule (before/after the shift, day off), the overtime, warnings and the linked request. action draft (field.jobs.overtime): job_id → draft the overtime request now for a submitted job. action mine (no permission): the signed-in employee's overtime requests from field jobs, drafts first. action submit: request_id, reason (required), overtime_type_id (optional) → the employee (or HR over them) sends the draft into the normal approval chain. action discard: request_id → cancel the draft. action queue (field.overtime.view): overtime from field jobs in your branches; filters status (pending by default, or all), q. action decide (field.overtime.approve): request_id, decision approved or rejected, note (required to reject); only when the request waits on you, as POST field/overtime/{id}/decide.
Argument Type Description company_idrequiredinteger actionrequiredstring
summary | draft | mine | submit | discard | queue | decidejob_idinteger request_idinteger reasonstring overtime_type_idinteger decisionstring
approved | rejectednotestring filtersobject branchstring -
field_proof_settingschanges data The company's Field proof settings (field_setup.manage, docs/field-proof.md), as GET/PATCH field/set...The company's Field proof settings (field_setup.manage, docs/field-proof.md), as GET/PATCH field/settings. Without values: read them. values may set field_proof_enabled, field_offline_allowed, field_require_hardware_key, field_auto_overtime, field_job_stage_override, field_departure_photo (booleans); field_min_progress_photos, field_progress_interval_min, field_site_radius_m, field_max_accuracy_m, field_max_offline_hours, field_overtime_min_minutes (numbers); field_mock_policy, field_integrity_policy, field_outside_site_policy (reject or flag); field_recapture_policy (flag or off: the queued check for a photo of a screen or a print only ever flags). Everything starts off. With branch_id: that branch's own values over the company's, as GET/PATCH field/settings/branches/{branch}; each key comes back as {company, branch (null = inherited), effective, source}, and a value of null or "inherit" takes it back to the company's.
Argument Type Description company_idrequiredinteger branch_idinteger valuesobject -
file_requestchanges data File a request of a type (see list_request_types) with its fields: for yourself, or with employee_id...File a request of a type (see list_request_types) with its fields: for yourself, or with employee_id for someone you may file for (requests.manage in scope, or their manager when the type allows it). It goes through the type's approval chain; a type with no approval needed is approved at once. Attachments are sent through the API or the screen.
Argument Type Description company_idrequiredinteger typerequiredstring fieldsrequiredobject employee_idinteger -
geocode_addresschanges data Street addresses from Mihnaro's own geocoder (docs/field-proof.md §21), as GET field/geocode/search...Street addresses from Mihnaro's own geocoder (docs/field-proof.md §21), as GET field/geocode/search and field/geocode/reverse. action search: q (2–200 characters, Arabic or English), lang (en or ar), optional lat and lng to prefer results near them, limit (1–10); returns places with label, area (street level, no house number), lat, lng and parts. action reverse: lat, lng, lang; returns the nearest address or null. available is false when the geocoder is down or off. Any user of a company with the FSM license; rate-limited per user.
Argument Type Description company_idrequiredinteger actionrequiredstring
search | reverseqstring langstring
en | arlatnumber lngnumber limitinteger -
get_activity_logread only The company's activity log (activity.view, docs/activity-log.md), newest first, 40 a page. tab chang...The company's activity log (activity.view, docs/activity-log.md), newest first, 40 a page. tab changes: record changes with old → new values (filters scope employee/time/payroll/organization/company/system, area, action created/updated/deleted, level user/employee/branch/company, user, employee, branch, from, to); secrets and ID numbers show as •••. tab requests: every change request from the screens, the API and MCP (filters user, channel web/api/mcp, from, to, q). tab sign_ins: the company's people's sign-ins (filters user, from, to, new_only).
Argument Type Description company_idrequiredinteger tabstring
changes | requests | sign_insscopestring
employee | time | payroll | organization | company | systemareastring actionstring
created | updated | deleted | purgedlevelstring
user | employee | branch | companyuserinteger employeeinteger branchinteger channelstring
web | api | mcpfromstring tostring qstring new_onlyboolean pageinteger -
get_announcementread only One company announcement in full: title and text {en, ar} (body_format html for ZenHR's rich text),...One company announcement in full: title and text {en, ar} (body_format html for ZenHR's rich text), publish date, author, ZenHR's recipient criteria (audience) and the targets enforced (only for those with announcements.manage or announcements.recipients) (targets: branches, departments, sections, positions, work_locations, projects, genders, religions, employees), start and expiry (scheduled), read_minutes, gallery (pictures in order with captions {en, ar}; url to read each), attachments (url to download a copied or uploaded file), and the ZenHR record it was imported from. Only one the person may read; another is "not found".
Argument Type Description company_idrequiredinteger announcement_idrequiredinteger -
get_app_brandread only The main brand the Mihnaro mobile app is built with (docs/mobile-app.md, GET /api/v1/app/brand): the...The main brand the Mihnaro mobile app is built with (docs/mobile-app.md, GET /api/v1/app/brand): the brand navy and teal from the admin panel, the logo and mark (dark and white), the app icon sources (an uploaded square icon, else the mark) and a version that changes when any of it does.
No arguments.
-
get_app_brandingread only What the Mihnaro mobile app is painted with (docs/mobile-app.md): the system palette (primary, secon...What the Mihnaro mobile app is painted with (docs/mobile-app.md): the system palette (primary, secondary, sidebar, login panel) and logos from the admin panel, and the addresses single sign-on may return to. A company's own logo is in get_company_context.
No arguments.
-
get_app_colorsread only The mobile app colors of a company or one of its branches (app_colors.view): what this level saved,...The mobile app colors of a company or one of its branches (app_colors.view): what this level saved, what people see (with the darker button color when white text is hard to read on the chosen one), what it follows, and which branches have their own. Same as GET /api/v1/app/companies/{company}/settings/app-colors.
Argument Type Description company_idrequiredinteger branch_idinteger One branch's own colors; none: the company's. -
get_appearanceread only The look in a company: the company's saved choices (for settings.manage), whether people may choose...The look in a company: the company's saved choices (for settings.manage), whether people may choose their own, the signed-in person's own choices and what they see, and every allowed value. Same as GET /api/v1/app/me/appearance and .../settings/appearance.
Argument Type Description company_idrequiredinteger -
get_approval_cycleread only A request's approval cycle, as ZenHR shows it (docs/approvals.md): every step in order with approver...A request's approval cycle, as ZenHR shows it (docs/approvals.md): every step in order with approver (name), approver_ids, step and step_label, status (approved, rejected, skipped, delegated, pending, waiting = ZenHR's "Waiting / Draft", withdrawn), received_at, decided_at, note, override, on_behalf_of, imported (ZenHR history). kind requests (an employee request: financial transaction, overtime, loan, miscellaneous, missing punch…) or leaves (time off), id. Whoever may see the request: the employee, HR over them, or an approver.
Argument Type Description company_idrequiredinteger kindrequiredstring
requests | leavesidrequiredinteger -
get_branch_contextread only The branch workspace the tools work in for this company: the current branch (or all_branches), wheth...The branch workspace the tools work in for this company: the current branch (or all_branches), whether "all" may be chosen, and the branches this user may switch to. Every other company tool shows only the current branch's data; pass branch (a branch id or "all"; in_branch where a tool already uses branch as a filter) to a tool, or the X-Branch header, to use another branch for one call.
Argument Type Description company_idrequiredinteger -
get_calculator_countryread only One country's calculator rules in force (per variant): every rule's value, its source (law, article,...One country's calculator rules in force (per variant): every rule's value, its source (law, article, official URL, the date it was read) and whether it is verified, the tools available and notes. available=false when the country has no rules yet. Same as GET /api/v1/tools/countries/{code}.
Argument Type Description countryrequiredstring ISO code ("JO") or the site's address part ("jordan"). -
get_clocking_securityread only Clocking security settings (attendance.security.manage, docs/attendance-security.md): each anti-spoo...Clocking security settings (attendance.security.manage, docs/attendance-security.md): each anti-spoofing check's mode (off, flag, hold, block), the numbers they use, whether Play Integrity, App Attest and a GeoIP database are configured on the server, the office Wi-Fi networks, and the clocking rules set elsewhere in Attendance setup (allowed IPs, office network, selfie, rotating QR). branch_id reads a branch's own values.
Argument Type Description company_idrequiredinteger branch_idinteger -
get_company_contextread only For one company of the signed-in user: the modules its license includes, the license dates, and the...For one company of the signed-in user: the modules its license includes, the license dates, and the branches this user can work in.
Argument Type Description company_idrequiredinteger -
get_company_settingsread only System preferences → Account setup: company names, address, phone, email, logo, currency, working ho...System preferences → Account setup: company names, address, phone, email, logo, currency, working hours and grace, weekend days (0 = Sunday), end-of-service days and minimum years, org chart type (company or branch) and whether only HR sees it; and mail_server, the company's own mail server (its password is never returned, and it is changed only on the screen or the API), with employee_emails: whether "Email employees" is on (docs/mail.md).
Argument Type Description company_idrequiredinteger -
get_dashboardread only A dashboard's figures, the same as on the screen (docs/dashboards.md), for the employees in the pers...A dashboard's figures, the same as on the screen (docs/dashboards.md), for the employees in the person's scope. section hr: the Home Page, built from the widget registry; only the widgets the person may see are computed (each needs its section's permission: headcount, charts and contracts employees.view, documents employees.view_sensitive, time off leaves.view, attendance attendance.view, payroll cost payroll.view, recruitment recruitment.view, field jobs field.jobs.view, and the person's own cards self.*), a part none of them needs is null; widgets narrows it to some keys (see manage_my_dashboards home_widgets); filters: period (this_month, last_month, last_30, this_quarter, this_year) or from/to (YYYY-MM-DD), branch_id, department_id; kpis carry value, previous (the period before) and change in percent. attendance (attendance.view: today, the last 14 days, most late and absent this month), payroll (payroll.view: latest regular run totals, six months, basic salary ranges, recent runs, loans), assets (assets.manage: by status, type and department, value, a year of purchases, expiring soon). Amounts are in the company currency.
Argument Type Description company_idrequiredinteger sectionrequiredstring
hr | attendance | payroll | assets | performancewidgetsarray periodstring
this_month | last_month | last_30 | this_quarter | this_year | customfromstring tostring branch_idinteger department_idinteger -
get_e_signature_imageread only The picture of one of the company's e-signatures (list_employee_settings kind e_signatures gives the...The picture of one of the company's e-signatures (list_employee_settings kind e_signatures gives the ids), as GET /api/v1/app/companies/{id}/employee-settings/e_signatures/{id}/image. Needs employee_settings.e_signatures.manage or letters.manage. Returns filename, mime, size and the image as base64.
Argument Type Description company_idrequiredinteger idrequiredinteger -
get_employeeread only One employee record, by employee_id or by employee_number (the number people use; add branch_id when...One employee record, by employee_id or by employee_number (the number people use; add branch_id when numbers repeat across branches). Archived records are found too (archived: true).
Argument Type Description company_idrequiredinteger employee_idinteger The internal id; or give employee_number. employee_numberstring The employee number, e.g. 1101. branch_idinteger With employee_number, when numbers repeat across branches. -
get_employee_historyread only An employee's job history: hired, changes (department, position, grade, manager...), transfers and e...An employee's job history: hired, changes (department, position, grade, manager...), transfers and end of service, with dates and readable lines; and their dated professional data records.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger -
get_employee_numberingread only How the company numbers its employees: prefix, padding (digits), next_number, scope (numbers unique...How the company numbers its employees: prefix, padding (digits), next_number, scope (numbers unique across the company or per branch), allow_reuse (whether archived and ended numbers may be given again), and per branch its own numbering, the highest number used and the number its next employee gets. Needs employee_settings.manage.
Argument Type Description company_idrequiredinteger -
get_helpread only The help center (docs/help.md): where things are and how the common tasks are done, as topics with t...The help center (docs/help.md): where things are and how the common tasks are done, as topics with their steps and the page to open, only for what the user may use, in their language.
Argument Type Description company_idrequiredinteger -
get_help_articleread only One public help center article (docs/help-center.md) by `category` and `slug` from search_help_cente...One public help center article (docs/help-center.md) by `category` and `slug` from search_help_center: its title, summary, HTML body, sections and link, in English, or Arabic with `locale: ar`.
Argument Type Description categoryrequiredstring slugrequiredstring localestring
en | ar -
get_holiday_calendarread only A month of the company's holidays (each with its first and last day), the next holidays, and with le...A month of the company's holidays (each with its first and last day), the next holidays, and with leaves.view who in the person's scope is on approved leave that month (otherwise leaves is null). month is YYYY-MM, this month by default.
Argument Type Description company_idrequiredinteger monthstring YYYY-MM -
get_log_retentionread only How long the company keeps its activity log (retention 6 | 12 | 24 | forever), the choices allowed u...How long the company keeps its activity log (retention 6 | 12 | 24 | forever), the choices allowed under Mihnaro's maximum, the months actually kept and the date before which entries are deleted tonight.
Argument Type Description company_idrequiredinteger -
get_map_tilesread only Where the app's maps take their pictures from: the tile address, its attribution and the highest zoo...Where the app's maps take their pictures from: the tile address, its attribution and the highest zoom. For anyone signed in, the same as GET map-tiles.
No arguments.
-
get_my_accessread only What the signed-in person may open in a company, as the mobile app uses it: the licensed modules, ea...What the signed-in person may open in a company, as the mobile app uses it: the licensed modules, each permission with its scope ("company" or the branches, departments and reports it covers), and the features that follow (clock, attendance, leaves, requests, payslips, approvals, directory, documents, tasks, announcements, notifications), and clock_channels (the branch setting "Clocking from": both, web or mobile; clock is false for web-only). The same as GET me/access.
Argument Type Description company_idrequiredinteger -
get_my_attendanceread only Your attendance for a month (YYYY-MM, this month by default): each day with its status (present, lat...Your attendance for a month (YYYY-MM, this month by default): each day with its status (present, late, absent, leave, holiday, weekend), worked minutes and records, plus today's records and whether you are clocked in, and clock: today's shift, state (not_in, in, out), since, whether clocking in is closed and why, and what clocking needs (location_required, qr, qr_only, photo_required).
Argument Type Description company_idrequiredinteger monthstring YYYY-MM -
get_my_leavesread only Your leave balances for a year (this year by default) and your leave requests with their status.Your leave balances for a year (this year by default) and your leave requests with their status.
Argument Type Description company_idrequiredinteger yearinteger -
get_my_performanceread only My performance: my evaluations (scores hidden until complete), the evaluations waiting for my review...My performance: my evaluations (scores hidden until complete), the evaluations waiting for my review, my goals, the 360° feedback requests I owe and my feedback forms.
Argument Type Description company_idrequiredinteger -
get_my_permissionsread only What the signed-in user may do in a company and where: each permission (sub-module permissions inclu...What the signed-in user may do in a company and where: each permission (sub-module permissions included, also when they come with their module permission) with "company" or the branches, departments and reports it covers. Owners have everything.
Argument Type Description company_idrequiredinteger -
get_my_profileread only My profile in a company: my name, email, username, roles, and my employee record (number, job, depar...My profile in a company: my name, email, username, roles, and my employee record (number, job, department, branch, manager, hire date). To change my password use the API (PUT /api/v1/app/me/password).
Argument Type Description company_idrequiredinteger -
get_my_scheduleread only Your work schedule from from to to (YYYY-MM-DD, up to 62 days; the next 7 days by default): each day...Your work schedule from from to to (YYYY-MM-DD, up to 62 days; the next 7 days by default): each day with working_day, weekend, holiday (its name), day_off (a day off given in the schedule), assigned (from the published schedule rather than your own shift), shift {name, type, start, end, color} and an approved leave {type, hours}.
Argument Type Description company_idrequiredinteger fromstring YYYY-MM-DD tostring YYYY-MM-DD -
get_my_timesheetread only Your timesheet period holding week (any date in it; today by default) with its entries, and all your...Your timesheet period holding week (any date in it; today by default) with its entries, and all your periods with their timesheet ID, hours, contribution percentage and status.
Argument Type Description company_idrequiredinteger weekstring YYYY-MM-DD -
get_my_two_factorread only My two-step verification: whether it is available, on, required (by the platform or one of my compan...My two-step verification: whether it is available, on, required (by the platform or one of my companies), and how many recovery codes are left. Setting it up or turning it off is done in the app or the API, never here, so keys and codes don't pass through an AI tool.
No arguments.
-
get_org_chartread only The org chart: who reports to whom, as nested trees (one for the company, or one per branch if the c...The org chart: who reports to whom, as nested trees (one for the company, or one per branch if the company set it so). Each person has "reports". Filters (ZenHR's): department, branch, job_role, work_location, section, project, hierarchy_group, business_unit, division, segment (ids), work_type, q (name or number). Hidden from non-HR when the company hides the org structure.
Argument Type Description company_idrequiredinteger departmentinteger Department id branchinteger Branch id job_roleinteger work_locationinteger sectioninteger projectinteger hierarchy_groupinteger business_unitinteger divisioninteger segmentinteger work_typestring qstring Name or employee number -
get_performance_kpisread only The performance KPI dashboard (performance.view or .manage, their scope): for a cycle (cycle_id, def...The performance KPI dashboard (performance.view or .manage, their scope): for a cycle (cycle_id, default the latest) and optional branch_id / department_id: completion by stage, average scores by branch, department and position, the score distribution, goal and OKR progress, top and bottom performers, and overdue evaluations.
Argument Type Description company_idrequiredinteger cycle_idinteger branch_idinteger department_idinteger -
get_person_accessread only See as them: every permission a person has on the web and in the app, each field's level (about_empl...See as them: every permission a person has on the web and in the app, each field's level (about_employee_id for one employee), and their exceptions. As GET people/{user}/access. Needs roles.manage.
Argument Type Description company_idrequiredinteger user_idrequiredinteger about_employee_idinteger -
get_person_app_devicesread only A person's phones with the Mihnaro app and their sign-in activity in this company (docs/platform-con...A person's phones with the Mihnaro app and their sign-in activity in this company (docs/platform-control.md "Phone activity"): each phone (version, state, push, first and last IP with the approximate local GeoIP place, first and last seen) with its latest 30 events, and other_activity not tied to a known phone. user_id defaults to the signed-in person (anyone may see their own); another person needs app_devices.view with a scope that covers them. Plus map_points, the events map (docs/platform-control.md «خريطة الأحداث»): [{type clock_in|clock_out|field_photo|sign_in|sign_in_failed|sign_out|app_open|other, event, at, lat, lng, approximate (true = a city from the local GeoIP for the event's IP), accuracy, place, event_id (its timeline row), install_id}], newest first; GPS points (punches, Field proof photos) only with the location permission (map_gps). Event GPS (docs/platform-control.md «موقع الأحداث»): every event row has has_gps (whether the app sent its own GPS point with it: sign_in, app_open, version_changed); with the location permission (platform.phones.location, or live_location.view in scope) the row also carries location {lat, lng, accuracy, at, source app_event, mocked}. Without it only the IP place shows, which is approximate (a city). map_points now also include live-location pings (type live) and the app's own GPS with events; each point has source punch|live|field|app_event|ip (ip = approximate, from the IP); map_gps_hidden = GPS points exist that this viewer may not see.
Argument Type Description company_idrequiredinteger user_idinteger -
get_person_device_contextread only The phone details the Mihnaro app sent for a person in this company (app_devices.context, docs/platf...The phone details the Mihnaro app sent for a person in this company (app_devices.context, docs/platform-control.md «بيانات الهاتف»), collected only for the categories the company's switches allow: phones [{install_id, device_id, model, platform, location_state {location always|while_using|denied|undetermined, precise, services}, latest {device, network, battery, permissions, security (with the last punch's app integrity verdict), time (with clock_offset_ms vs the server), locale, health}}] and history [{at, trigger open|resume|sign_in|punch, category, install_id, event_id, data}], newest first. Filters: install_id, category, limit (≤500). Same API: GET /api/v1/app/companies/{id}/app-devices/people/{user}/context. Never contains contacts, media, messages, other apps, hardware ids or advertising ids.
Argument Type Description company_idrequiredinteger user_idrequiredinteger install_idinteger categorystring
device | network | battery | permissions | security | time | locale | healthlimitinteger -
get_regional_settingsread only Regional settings (date and time format, calendar, Arabic month names, first day of the week, numera...Regional settings (date and time format, calendar, Arabic month names, first day of the week, numerals, separators, currency display; docs/regional-settings.md). mine=true: my effective formats (my branch, else the company, else the platform) with English and Arabic samples, for anyone in the company. Otherwise the company defaults, the choices with their labels, and every branch's own values (null = follows the company), effective values and where each comes from (needs settings.manage or branches.manage). Same as GET /api/v1/app/companies/{id}/me/locale and …/regional-settings.
Argument Type Description company_idrequiredinteger mineboolean true: only my effective formats. -
get_sign_in_settingsread only System preferences → Sign-in security: whether the company requires two-step verification (and the p...System preferences → Sign-in security: whether the company requires two-step verification (and the platform mode: off, optional, required), its own password policy next to Mihnaro's, and its single sign-on: OpenID Connect or SAML 2.0 provider, "SSO only" and the exempt users, and the URLs to give the provider (SAML ACS, entity ID, metadata). The client secret is never returned, only whether it is set.
Argument Type Description company_idrequiredinteger -
get_sso_audit_logread only The company's single sign-on audit log, newest first: sign-ins through the provider (OpenID Connect...The company's single sign-on audit log, newest first: sign-ins through the provider (OpenID Connect or SAML), refusals with the reason, password sign-ins blocked by "SSO only", and changes to the sign-in settings (field names only).
Argument Type Description company_idrequiredinteger limitinteger 1-200, default 50. eventstring
sign_in | sign_in_failed | password_blocked | settings_changed -
get_team_attendance_todayread only One day of the team's attendance (attendance.view, today by default): counts of present, late, absen...One day of the team's attendance (attendance.view, today by default): counts of present, late, absent, not yet, on leave and off, and each person in reach with their status and first and last punch.
Argument Type Description company_idrequiredinteger datestring YYYY-MM-DD; today by default -
get_team_calendarread only The team calendar for a month (YYYY-MM, this month by default): leaves — who is off or working remot...The team calendar for a month (YYYY-MM, this month by default): leaves — who is off or working remotely (remote), with start, end and hours for an hour leave, among the people the branch's "Who's off shows" setting picks; the leave type only for someone with leaves.view — plus holidays {date: name} and the company events.
Argument Type Description company_idrequiredinteger monthstring YYYY-MM -
get_termination_checkread only Leaving (docs/terminations.md, employees.terminate). With employee_id: the background check before t...Leaving (docs/terminations.md, employees.terminate). With employee_id: the background check before terminate_employee (pending_count; who to substitute as direct manager, supervisor, approver or key staff; pending requests; loans still owed; assets held) with contracts, insurance and cost centers for information, and the end-of-service estimate today for each termination type. Without employee_id: the leaving records of the employees in scope.
Argument Type Description company_idrequiredinteger employee_idinteger -
get_time_settingsread only Attendance setup (clocking rules and missing punches) or Timesheets setup: section attendance or tim...Attendance setup (clocking rules and missing punches) or Timesheets setup: section attendance or timesheets. Needs attendance_setup.manage.
Argument Type Description company_idrequiredinteger sectionrequiredstring
attendance | timesheets -
global_searchread only Search the company system the way the top bar does (Ctrl+K): employees (by name in Arabic or Latin l...Search the company system the way the top bar does (Ctrl+K): employees (by name in Arabic or Latin letters, number, phone), requests and time off (by number such as LV-000012), documents, contracts, payslips, payroll runs, tasks, letters, assets, announcements, departments, job titles, pages, settings and shortcuts such as "Add employee". Typos and partial words are fine. It understands plain Arabic or English filters, e.g. "طلبات إجازة معلقة بفرع Ltd", "موظفين قسم الحسابات", "عقود تنتهي هذا الشهر", "pending overtime requests", "رواتب أكتوبر", and says what it understood. Only what the user may see, in the current branch workspace (or the branch argument). Results come in groups, each with a title, subtitle, url and target (what it opens in the mobile app, or null). A field hidden from the user is neither searched nor shown.
Argument Type Description company_idrequiredinteger qstring What to look for: a name, employee number, request number (e.g. LV-000012), document title, page or setting groupsarray Only these groups; all when left out limitinteger Results per group, 1-20 (6 by default) withoutarray Filters read from the words to ignore (the chips removed): type, kind, status, branch, department, period, mine filtersobject Filters given outright, winning over the words: types (list of employees, leaves, requests, documents, contracts, payslips, payroll, tasks, letters, assets, announcements, departments, positions), status (pending, approved, rejected, cancelled, active, inactive, done), kind (a request type such as overtime), branch_id, department_id, from and to (Y-m-d), date_field (date or end), mine (true) branchstring Branch id or "all" for this call; the user's chosen branch when left out -
import_rowschanges data Import data from rows: each row is an object of field → value (fields from list_importers). Without...Import data from rows: each row is an object of field → value (fields from list_importers). Without commit it only checks every row and lists the problems; with commit=true it saves all rows, or none if anything is wrong. New employees get sign-in accounts; their temporary passwords are returned once.
Argument Type Description company_idrequiredinteger typerequiredstring employees, employees-quick, family-members, contracts, bank-accounts or custom-fields rowsrequiredarray [{"employee_no": "EMP-1", "name_en": "...", ...}] modestring
create | updateupdate: change employees that already exist (by employee number) commitboolean false (default) only checks optionsobject Batch-wide choices from list_importers (e.g. overtime: {"overtime_type_id": 3, "transaction_type_id": 7}), overriding the rows -
invite_employeeschanges data Invite current employees without a sign-in account to the app (employees.manage, docs/attendance.md...Invite current employees without a sign-in account to the app (employees.manage, docs/attendance.md §13), by branch_id and department_id, channel email or whatsapp. Without send it only previews: how many would be invited, how many are skipped and why (has_account, invited_recently, no_email, no_mobile, email_in_use, emails_off = "Email employees" is held for the company or branch, docs/mail.md) and a masked sample. send true with expected (the previewed count) queues the messages, 20 a minute, one batch per company at a time. Only send when the person asked to send.
Argument Type Description company_idrequiredinteger channelrequiredstring
email | whatsappbranch_idinteger department_idinteger sendboolean true to send; leave out to preview. expectedinteger With send: the eligible count from the preview. -
issue_letterchanges data HR letters. action issue: a letter from letter_template_id for employee_id in your scope (letters.ma...HR letters. action issue: a letter from letter_template_id for employee_id in your scope (letters.manage), addressed_to optional; a template that needs approval keeps it from the employee until someone else approves it. action generate: a self-service template for yourself. action confirm: confirm you received your letter (letter_id). action decide: approve or reject a letter waiting for approval (letter_id, decision approved|rejected; letters.manage, not one you issued). The text is filled from the template's placeholders.
Argument Type Description company_idrequiredinteger actionrequiredstring
issue | generate | confirm | decideletter_template_idinteger employee_idinteger addressed_tostring effective_datestring Y-m-d, defaults to today letter_idinteger decisionstring
approved | rejected -
list_accountingread only Direct accounting connectors (each ledger needs integrations.{provider}.manage, which integrations.m...Direct accounting connectors (each ledger needs integrations.{provider}.manage, which integrations.manage grants; docs/accounting-connectors.md): odoo, quickbooks, xero, netsuite, business_central, sap_b1, sap_s4hana, dynamics_fo. kind providers: every ledger and whether the company is connected. kind connection (provider): its state, non-secret fields, posting options and catalog counts (secrets are never returned, only whether each is saved). kind catalog (provider): the ledger's accounts, analytic accounts, partners and journals as last read. kind mappings (provider): Mihnaro accounts, cost centers, branches and employees with their ledger ids and suggestions. kind preview (provider, run_id): the payroll's journal entries in ledger ids, with references and anything blocking them. kind postings (provider optional, status, run_id): the posting log. kind posting (posting_id): one posting with its lines and attempts.
Argument Type Description company_idrequiredinteger kindrequiredstring
providers | connection | catalog | mappings | preview | postings | postingproviderstring
odoo | quickbooks | xero | netsuite | business_central | sap_b1 | sap_s4hana | dynamics_fobranch_idinteger A branch's own connection (when the ledger is set per branch); empty = the company's. run_idinteger posting_idinteger statusstring
pending | posted | failed | reversed -
list_air_ticket_policiesread only Air ticket policies (payroll_setup.manage, HR module). Without policy_id: every policy with its tick...Air ticket policies (payroll_setup.manage, HR module). Without policy_id: every policy with its tickets per period, period_months, period_anchor hire|calendar, accrual period_start|monthly, amount per ticket, family_members covered, eligible_after_months, applies_to all|assigned, expiry, cash_out, switches and employees_count. With policy_id: that policy plus the employees in my payroll.manage scope it was given to, with their opening_balance.
Argument Type Description company_idrequiredinteger policy_idinteger One policy with the employees it was given to. -
list_air_ticketsread only Air tickets of the employees in my payroll scope (payroll.view or payroll.manage, HR module). kind t...Air tickets of the employees in my payroll scope (payroll.view or payroll.manage, HR module). kind transactions: tickets used, newest travel first, with owners, tickets, amount, cash_out, destination, dates, payment_status paid|unpaid and deletable; filters employee_id, policy, status paid|unpaid, payment cash_out|booked, payroll in_payroll|off_cycle, request_status (a request status or added_by_hr), from, to (travel date), paid_from, paid_to. kind balances: each active employee under each of their policies: total, used, pending, balance, amount, per_period, eligible_from, current period; filter policy. page and per_page (10-200).
Argument Type Description company_idrequiredinteger kindrequiredstring
transactions | balancesemployee_idinteger policyinteger Air ticket policy id. statusstring
paid | unpaidpaymentstring
cash_out | bookedpayrollstring
in_payroll | off_cyclerequest_statusstring fromstring YYYY-MM-DD tostring YYYY-MM-DD paid_fromstring paid_tostring pageinteger per_pageinteger -
list_announcementsread only The company's announcements, pinned first then newest by publish date (imported ones in ZenHR's orde...The company's announcements, pinned first then newest by publish date (imported ones in ZenHR's order), only those the person may read: the ones for everyone and the ones whose targets reach them (all of them with announcements.manage). q searches the title and text; show: pinned, current or expired.
Argument Type Description company_idrequiredinteger qstring showstring
pinned | current | expired -
list_app_device_activityread only The sign-in activity of the company's people on the Mihnaro app (app_devices.view, docs/platform-con...The sign-in activity of the company's people on the Mihnaro app (app_devices.view, docs/platform-control.md "Phone activity"), only for the people the permission's scope covers and without what other companies recorded: sign-ins and failed attempts, sign-outs, app opens and version changes, push registrations and answers, phone approvals and blocks, each with time, IP and approximate place (local GeoIP), app version, system and model. Filters: user_id, install_id (a phone from list_app_devices), device_id, event, result, from, to; page, per_page. Event GPS (docs/platform-control.md «موقع الأحداث»): every event row has has_gps (whether the app sent its own GPS point with it: sign_in, app_open, version_changed); with the location permission (platform.phones.location, or live_location.view in scope) the row also carries location {lat, lng, accuracy, at, source app_event, mocked}. Without it only the IP place shows, which is approximate (a city).
Argument Type Description company_idrequiredinteger user_idinteger install_idinteger device_idstring eventstring
sign_in | sign_in_failed | sign_out | app_open | version_changed | push_registered | push_result | push_test | device_pending | device_approved | device_blocked | device_reset | device_mismatch | shared_device_detected | shared_device_blocked | shared_device_allowed | shared_device_revoked | location_turned_offresultstring
ok | failed | blockedfromstring tostring pageinteger per_pageinteger -
list_app_devicesread only The phones the company's people use the Mihnaro app on (app_devices.view, docs/platform-control.md "...The phones the company's people use the Mihnaro app on (app_devices.view, docs/platform-control.md "The company's view"), only for the people the permission's scope covers (company-wide or some branches): person, branches, platform, system version, model, app version, state (below_min, outdated, latest, newer = a test build above the store's latest, store_unknown, unknown = an old app before 1.1 that never reported its version), the last GPS location (only for people whose location the caller may see with live_location.view), push status and first/last seen, plus the summary per platform. Filters: q, branch_id, platform, version, state, push, signed_in, seen_days, shared (only phones used by more than one account; each row has shared {accounts, others, list} when it is); page, per_page.
Argument Type Description company_idrequiredinteger qstring branch_idinteger platformstring
android | iosversionstring statestring
below_min | outdated | latest | newer | store_unknown | unknownpushstring
active | failing | nonesigned_inboolean sharedboolean seen_daysinteger pageinteger per_pageinteger -
list_approvalschanges data The approvals page, leave and employee requests together: tab approvals (waiting on me, or what I de...The approvals page, leave and employee requests together: tab approvals (waiting on me, or what I decided: status pending, approved, rejected, all), my (my own requests), team (the people below me or in my requests.view scope) or override (pending ones I may decide for their approver); type filters by request type key or "leave"; employee_id one employee; sort employee, serial, requested (default, newest first), received or my_action, with dir asc or desc. Serial numbers are as ZenHR shows them ("LEAV - 1000000631950"), list_label the request type name ZenHR shows. Each row has item ("leave:ID" or "request:ID"), who it is from, what it waits on, can_act and can_override. my_action filters by what I did: waiting (not reached me yet), pending, approved, rejected, withdrawn, approved_non_deduct, added_by_hr, delegated, skipped (my step was skipped), cancelled, cancel_requested, none. On tab approvals with status pending, approved requests whose cancellation waits on my step are listed too (action_type cancellation, can_decide_cancel; decide them with cancel_request action decide); action_type approval|cancellation keeps one cycle (ZenHR's "Action type"). On tab my or team with a type that has its own columns (leave, transaction, overtime, loan, general, business_trip, missing_punch, timesheet, vacation_encashment), each row has that type's columns and filters narrows them: {key: value} for a select or yes/no (yes|no), {key_from, key_to} (YYYY-MM-DD) for a date; the answer lists the columns and filters. With request_id, one request with its details and decisions.
Argument Type Description company_idrequiredinteger tabstring
approvals | my | team | overridestatusstring
all | pending | approved | rejected | withdrawn | cancelledtypestring request_idinteger my_actionstring
waiting | pending | approved | rejected | withdrawn | approved_non_deduct | added_by_hr | delegated | skipped | cancelled | cancel_requested | noneaction_typestring
approval | cancellationfiltersobject employee_idinteger sortstring
employee | serial | requested | received | my_actiondirstring
asc | desc -
list_assessmentsread only Assessments (pre- and post-employment tests). kind mine: the signed-in employee's own tests (anyone)...Assessments (pre- and post-employment tests). kind mine: the signed-in employee's own tests (anyone). Needs assessments.manage or assessments.grade: summary (counts, pass rate), invitations (filters test, status pending/started/completed/cancelled, candidate, employee; candidates' links included), attempt (attempt_id: every answer with the right one, points and the anti-cheating log), grading (attempts waiting for a person), results (test_id: every attempt and how each question did), export (test_id: every attempt as a CSV file, as GET .../assessments/tests/{test}/export; returns filename, mime, size and base64). Needs assessments.manage: categories, questions (filters category, type, difficulty, active, q), question (question_id), tests (filters status, purpose, q), test (test_id, with items), templates (the ready test library).
Argument Type Description company_idrequiredinteger kindstring
summary | mine | categories | questions | question | tests | test | templates | invitations | attempt | grading | results | exportquestion_idinteger test_idinteger attempt_idinteger categoryinteger typestring
single | multiple | true_false | short_text | long_text | ordering | matching | numeric | file_uploaddifficultystring
easy | medium | hardactivestring statusstring purposestring
pre_employment | post_employmenttestinteger candidateinteger employeeinteger qstring -
list_assetschanges data Company assets (assets.manage): filter by status (available, assigned, damaged, under_repair, archiv...Company assets (assets.manage): filter by status (available, assigned, damaged, under_repair, archived), type (asset type id), owner (branch id or none), holder (employee id), expiry_from, expiry_to, q (name or serial number). With asset_id, one asset and its history. kind types lists the asset types instead.
Argument Type Description company_idrequiredinteger kindstring
assets | typesasset_idinteger statusstring
available | assigned | damaged | under_repair | archivedtypeinteger ownerstring holderinteger expiry_fromstring expiry_tostring qstring -
list_attendance_recommendationsread only Attendance recommendations (absence, lateness, early leaving, incomplete days, overtime) for the emp...Attendance recommendations (absence, lateness, early leaving, incomplete days, overtime) for the employees your role reaches (attendance.recommendations.view; attendance.view or attendance.manage grant it): status pending (default), applied or ignored, kind, from, to. 50 a page.
Argument Type Description company_idrequiredinteger statusstring
pending | applied | ignoredkindstring
absence | lateness | early_out | incomplete | overtime | leavefromstring tostring pageinteger -
list_attendance_recordsread only Attendance records of the employees your role reaches (attendance.view), 50 a page: from and to (YYY...Attendance records of the employees your role reaches (attendance.view), 50 a page: from and to (YYYY-MM-DD, this month by default), employee_id, shift_id (work shift: people on it), state (incomplete, complete, trusted).
Argument Type Description company_idrequiredinteger fromstring YYYY-MM-DD tostring YYYY-MM-DD employee_idinteger shift_idinteger statestring
incomplete | complete | trustedpageinteger -
list_attendance_sheetsread only ZenHR's Attendance Sheets (attendance.manage): sheets imported from attendance machines, newest firs...ZenHR's Attendance Sheets (attendance.manage): sheets imported from attendance machines, newest first, 50 a page, each with the dates it covers, punches read (success), failures (no employee + unreadable rows) and status (completed, with_errors, failed). Filters: machine_id, status, from and to (import date, YYYY-MM-DD). template_machine_id instead returns that machine's blank sheet (rows of cells, headings first) in its template's columns. Import a sheet with the API (POST biometric-devices/{id}/sheet).
Argument Type Description company_idrequiredinteger machine_idinteger statusstring
completed | with_errors | failedfromstring YYYY-MM-DD tostring YYYY-MM-DD template_machine_idinteger Return this machine's blank sheet template instead of the list pageinteger -
list_business_travelread only Business travel setup (payroll_setup.manage, HR module). kind setup: trip_per_diem_type_id, trip_pay...Business travel setup (payroll_setup.manage, HR module). kind setup: trip_per_diem_type_id, trip_payment in_payroll|off_cycle, trip_air_ticket_type_id, trip_accommodation_type_id, trip_remind_days, trip_expense_type_ids, trip_slip_breakdown, trip_show_amounts and the per diem components (id, name). kind policies: travel policies with position_ids, destinations (category domestic|international, country and cities or countries, travel_types, air_classes, limits, hotel_tiers, components {type_id, amount, mandatory}) and switches. kind policy: one policy (policy_id).
Argument Type Description company_idrequiredinteger kindrequiredstring
setup | policies | policypolicy_idinteger -
list_calculator_countriesread only The countries mihnaro.com's free HR calculators have rules for: each with the tools it can run, its...The countries mihnaro.com's free HR calculators have rules for: each with the tools it can run, its variants (e.g. nationals and expatriates), currency and how many of its rules are verified. A country not listed is "not available yet". Same as GET /api/v1/tools/countries.
No arguments.
-
list_company_branchesread only The company's branches with their logos, the license's max_branches and whether another can be added...The company's branches with their logos, the license's max_branches and whether another can be added.
Argument Type Description company_idrequiredinteger -
list_company_usersread only User setup: the company's accounts with username, roles and where each applies, and status (active o...User setup: the company's accounts with username, roles and where each applies, and status (active or inactive). Filter by q (name, email, username), role id, status.
Argument Type Description company_idrequiredinteger qstring roleinteger positioninteger Job role (position) id. statusstring
active | inactive -
list_connected_accountsread only The company's connected accounts (docs/integration-connections.md): Zoom, Google, Microsoft, LinkedI...The company's connected accounts (docs/integration-connections.md): Zoom, Google, Microsoft, LinkedIn (needs integrations.connections.manage) and each accounting ledger (needs integrations.{provider}.manage); integrations.manage grants all. Per provider: mode (company = one account for every branch, branch = each branch may have its own, the company's is the fallback), the redirect URI and scopes to register at the provider, the company's connection, and each branch's with "uses" (branch, company or none). Client secrets and tokens are never returned, only has_client_secret.
Argument Type Description company_idrequiredinteger -
list_devicesread only Fingerprint and access devices (devices.manage, docs/devices.md). view list (default): every device...Fingerprint and access devices (devices.manage, docs/devices.md). view list (default): every device with online status, last seen, IP, family, model, firmware. With device_id: view detail (capabilities and counts on the device vs Mihnaro), commands (command history, optional status), users (the device's users against Mihnaro's: in_sync, changed, missing, extra), plan (what a sync would send) or audit (the device audit log; device_id optional). view sync_report: people whose devices are not all in sync (user record, slots missing, outdated, in conflict, pending, out of capacity).
Argument Type Description company_idrequiredinteger viewstring
list | detail | commands | users | plan | audit | sync_reportdevice_idinteger statusstring
queued | sent | done | failed | cancelled -
list_directoryread only The company directory: active colleagues with their job, department, branch and work contact details...The company directory: active colleagues with their job, department, branch and work contact details (email, phone, extension). Open to everyone in the company. Search by name, job or email.
Argument Type Description company_idrequiredinteger qstring Name, job title or email departmentinteger Department id branchinteger Branch id pageinteger -
list_disciplineread only Discipline data (docs/discipline.md) for the employees in scope. kind actions: disciplinary actions...Discipline data (docs/discipline.md) for the employees in scope. kind actions: disciplinary actions (discipline.view or manage; filters status approved|draft, employee_id, disciplinary_type_id, from, to). kind suspensions: suspensions with their request, resumption and cancellation states (HR in scope, or a manager up the line; filters employee_id, reason, status, resumption_status, from, to, resumption_from, resumption_to). kind setup: violation types, action types and escalation rules (discipline_setup.manage). Violation types and suspension reasons are edited with save_setup_form_item (entities disciplinary-types, suspension-reasons).
Argument Type Description company_idrequiredinteger kindrequiredstring
actions | suspensions | setupfiltersobject Optional filters for the kind, e.g. {"status": "draft"}. -
list_documentsread only Documents: my file and company documents for everyone; HR (employees.view_sensitive) also sees emplo...Documents: my file and company documents for everyone; HR (employees.view_sensitive) also sees employees' files in their scope and the ones expired or expiring soon. tab: all, my, employees, company.
Argument Type Description company_idrequiredinteger tabstring
all | my | employees | companyemployeeinteger categoryinteger Document type id pageinteger -
list_employee_fileread only One section of an employee's file: contracts, bank_accounts, family or documents. Bank accounts and...One section of an employee's file: contracts, bank_accounts, family or documents. Bank accounts and documents need employees.view_sensitive. Files themselves are downloaded through the app or the API.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger kindrequiredstring
contracts | bank_accounts | family | documents -
list_employee_settingsread only The lists behind the employee file: contract_types, job_grades, document_types, custom_fields, org_l...The lists behind the employee file: contract_types, job_grades, document_types, custom_fields, org_levels or field_rules.
Argument Type Description company_idrequiredinteger kindrequiredstring
contract_types | job_grades | document_types | custom_fields | org_levels | field_rules | e_signatures | banks -
list_employeesread only Employee records, 25 per page. status: current (default, not terminated), active, suspended, termina...Employee records, 25 per page. status: current (default, not terminated), active, suspended, terminated, all, or archived (archived records only; every other status leaves them out). search matches number, name or email; employee_number matches exactly. Also the license headcount.
Argument Type Description company_idrequiredinteger statusstring
current | active | suspended | terminated | all | archivedemployee_numberstring Exact employee number. salary_statusstring
running | stoppedSalary running or stopped (Stop employee salary). branch_idinteger searchstring Number, name or email. pageinteger -
list_eos_policiesread only End-of-service (STB) policies (HR module, payroll_setup.manage): termination category, default flag,...End-of-service (STB) policies (HR module, payroll_setup.manage): termination category, default flag, minimum years, tiers (from_years, to_years, days_per_year), worth tiers (percent), contract type, excluded unpaid leave, nationalities, allowances counted, calculation options and salary caps. policy_id returns one policy; otherwise filters name, category, contract_type limited|unlimited, defaults_only.
Argument Type Description company_idrequiredinteger policy_idinteger namestring categorystring contract_typestring
limited | unlimiteddefaults_onlyboolean -
list_evaluationsread only Evaluation cycles and evaluations. With evaluation_id: one evaluation with criteria, scores, notes a...Evaluation cycles and evaluations. With evaluation_id: one evaluation with criteria, scores, notes and OKRs (the employee, their task holders, or performance.view/manage over them). With cycle_id: the cycle and its evaluations in scope, filtered by q, branch, position, work_location, department, section, project, hierarchy_group, stage (writing_okrs, auditing_okrs, self_assessment, evaluation, auditing_results), status (in_progress, completed), action (yes: the caller holds the current task), okrs (published, not_published), missing (yes, no), employee_status (active, inactive). Otherwise the cycles, filtered by q (name), status (draft, open, closed) and stage (current stage) (performance.view, performance.manage or performance_setup.manage).
Argument Type Description company_idrequiredinteger evaluation_idinteger cycle_idinteger qstring branchinteger positioninteger work_locationinteger departmentinteger sectioninteger projectinteger hierarchy_groupinteger stagestring statusstring actionstring okrsstring missingstring employee_statusstring -
list_eventsread only Company events: coming up, past, and a month (month YYYY-MM, default this one) as events by day with...Company events: coming up, past, and a month (month YYYY-MM, default this one) as events by day with the company's holidays. Everyone in the company may read them.
Argument Type Description company_idrequiredinteger monthstring -
list_field_jobschanges data Field work orders and sites (docs/field-proof.md), as GET field/jobs, field/sites and field/my-jobs....Field work orders and sites (docs/field-proof.md), as GET field/jobs, field/sites and field/my-jobs. kind jobs (field.jobs.view or field.jobs.manage): filters status (assigned, in_progress, submitted, approved, rejected, cancelled), branch_id, site_id, employee_id, q, from, to, per_page; with job_id, one job with its photos. Filters also date (one day), flagged (jobs with a standing flagged photo) and flag (one code); each job has flagged_count. kind summary: the board's counts under the same filters (per status, today, in_progress, awaiting_review, flagged). kind flags: every flag and reason code with its plain-language label and explanation in English and Arabic (no permission needed). kind sites: the sites, q. kind mine: the signed-in employee's own jobs (no permission needed). Only the branches the role covers.
Argument Type Description company_idrequiredinteger kindstring
jobs | summary | sites | mine | flagsjob_idinteger filtersobject branchstring -
list_hr_calculatorsread only The free HR calculators of mihnaro.com for a country (ISO code, default IQ): each tool with whether...The free HR calculators of mihnaro.com for a country (ISO code, default IQ): each tool with whether it is available there, its inputs, and the country's rates in force. Same as GET /api/v1/tools/calculators?country=.
Argument Type Description countrystring ISO country code, e.g. "AE". Default IQ. variantstring datestring Y-m-d; default today. -
list_importersread only Import data: the kinds of data that can be imported (employees, quick employees, family members, con...Import data: the kinds of data that can be imported (employees, quick employees, family members, contracts, bank accounts, custom fields) with their fields, the importers coming with later modules, and the last imported sheets. With type: that importer's template rows (the CSV template: headers then examples; language en|ar; existing true fills it with the current data). Needs company-wide employees.manage and employees.view_sensitive.
Argument Type Description company_idrequiredinteger typestring languagestring
en | arexistingboolean -
list_insuranceread only Medical insurance policies (HR module, payroll.view or payroll.manage): insurer, policy number, date...Medical insurance policies (HR module, payroll.view or payroll.manage): insurer, policy number, dates, adult and minor cost and currency, pro rata, per employee, branch, and the members whose employee is in my scope (owner: the employee or a family member, dependents, custom cost, monthly deduction, cost). policy_id returns one policy; active true keeps the policies in force today.
Argument Type Description company_idrequiredinteger policy_idinteger activeboolean -
list_integrationsread only API keys and webhooks (integrations.api_keys.manage; kind marketplace needs any integration permissi...API keys and webhooks (integrations.api_keys.manage; kind marketplace needs any integration permission; integrations.manage grants all; docs/integrations.md). kind keys: the API keys (prefix, abilities, IPs, who they act as, status; never the key). kind webhooks: URLs, events and last delivery (never the secret). kind deliveries: the delivery log, optionally for webhook_id and status delivered or failed. kind delivery: one delivery with its body and every attempt (delivery_id). kind events: the events a webhook can listen to. kind marketplace: the connector catalogue by category with each one's state (filters category, active active|inactive, q).
Argument Type Description company_idrequiredinteger kindstring
keys | webhooks | deliveries | delivery | events | marketplacecategorystring activestring
all | active | inactiveqstring webhook_idinteger delivery_idinteger statusstring
delivered | failed -
list_leave_adjustmentsread only Leave balance adjustments (kind=adjustments, default) or balances moved into a new year (kind=moved)...Leave balance adjustments (kind=adjustments, default) or balances moved into a new year (kind=moved) for the employees your role reaches (leaves.adjustments.view, or leaves.moved_balances.view for kind=moved; leaves.view or leaves.manage grant both), 50 a page: leave_type_id, year, employee_id. Add or remove them with manage_leave_balances.
Argument Type Description company_idrequiredinteger kindstring
adjustments | movedleave_type_idinteger yearinteger employee_idinteger pageinteger -
list_leave_typesread only Time off types (leave_setup.manage), of one category (annual, casual, hourly for leaves by the hour,...Time off types (leave_setup.manage), of one category (annual, casual, hourly for leaves by the hour, sick) or all, with every setting and how many employees have each.
Argument Type Description company_idrequiredinteger categorystring
annual | casual | hourly | sick -
list_legal_rulesread only Payroll legal validation (HR module): the payroll rules not confirmed under Iraqi law. "blocked" rul...Payroll legal validation (HR module): the payroll rules not confirmed under Iraqi law. "blocked" rules stay off until validated; "unverified" ones work but are flagged. Each shows whether it is validated, by whom, the reference and when.
Argument Type Description company_idrequiredinteger -
list_letterschanges data HR letters you may see: kind letters (yours once released, and those of the employees in your letter...HR letters you may see: kind letters (yours once released, and those of the employees in your letters scope; the Manage HR Letters filters: employee_id, template, category, status sent, seen, pending, failed, unseen, unconfirmed, approved or rejected, classification, effective_from/effective_to, confirmation required/not_required/confirmed/unconfirmed, creator, created_from/created_to), templates (all for letters.manage, else the self-service ones you can generate), or signatures (documents sent to sign, yours and those in scope; status pending, signed or declined). With id, one letter or signature request with its text.
Argument Type Description company_idrequiredinteger kindstring
letters | templates | signaturesidinteger statusstring employee_idinteger templateinteger categoryinteger classificationstring
positive | neutral | negativeeffective_fromstring effective_tostring confirmationstring
required | not_required | confirmed | unconfirmedcreatorinteger created_fromstring created_tostring -
list_machine_usersread only A biometric machine's users (attendance_setup.manage, docs/attendance.md): each number (pin) the mac...A biometric machine's users (attendance_setup.manage, docs/attendance.md): each number (pin) the machine reported or sent punches for, its name and card on the machine, how many punches and the last one, and the employee it links to (null when none). Attendance sheets exported from the machine are read with POST biometric-devices/{id}/sheet in the API.
Argument Type Description company_idrequiredinteger device_idrequiredinteger -
list_missing_punchesread only Missing-punch requests of the employees your role reaches (attendance.missing_punches.view; attendan...Missing-punch requests of the employees your role reaches (attendance.missing_punches.view; attendance.view or attendance.manage grant it), newest first, 50 a page: status (pending, approved, rejected, cancelled, withdrawn), from and to (punch date, YYYY-MM-DD), employee_id, employee_status. Decide them with the request tools.
Argument Type Description company_idrequiredinteger statusstring
pending | approved | rejected | cancelled | withdrawnfromstring YYYY-MM-DD tostring YYYY-MM-DD employee_idinteger employee_statusstring
active | suspended | terminatedActive or inactive employees only (ZenHR: Active / Inactive / Both) pageinteger -
list_my_connected_appsread only The AI apps connected to the signed-in person's account and their access tokens for AI apps: id, kin...The AI apps connected to the signed-in person's account and their access tokens for AI apps: id, kind (oauth or token), name, company, when connected and last used. Token values are never shown. docs/ai-integrations.md.
No arguments.
-
list_my_notificationsread only The person's own notices in the company (the header bell, docs/notifications.md), newest first, with...The person's own notices in the company (the header bell, docs/notifications.md), newest first, with the unread count; after_id gives only the ones that arrived since (the live bell). unread true for unread only; category one of requests, payroll, attendance, performance, tasks, recruitment, documents, announcements, people, greetings, security, general; page (25 a page).
Argument Type Description company_idrequiredinteger unreadboolean categorystring
requests | payroll | attendance | performance | tasks | field | recruitment | documents | announcements | people | greetings | security | admin | generalpageinteger after_idinteger Only notices newer than this id (what the live bell asks for). -
list_my_payslipschanges data My payslips from approved payroll runs, newest first, with their lines and slip_type (payroll, in_pa...My payslips from approved payroll runs, newest first, with their lines and slip_type (payroll, in_payroll_settlement or off_cycle_settlement) and slip_title. With payslip_id, one payslip: my own once approved, or any in my payroll scope.
Argument Type Description company_idrequiredinteger payslip_idinteger -
list_notification_eventsread only Which events notify whom (notifications.manage, docs/notifications.md §13): every event with its rec...Which events notify whom (notifications.manage, docs/notifications.md §13): every event with its recipients (en, ar), category, link, channels, kind (request, record, setup, security, action, scheduled) and whether the company has its category on. Filters: kind, category, q (words).
Argument Type Description company_idrequiredinteger kindstring
request | record | setup | security | action | scheduledcategorystring qstring -
list_notification_logread only The company's notifications log (notifications.log.view, docs/notifications.md "سجل الإشعارات"), as...The company's notifications log (notifications.log.view, docs/notifications.md "سجل الإشعارات"), as GET notification-log: every notice sent, newest first, with category, event (the code that sent it), text en/ar, link, related record, triggered_by (null = the system), recipients, bell read counts and per channel (push, email, whatsapp) how many people got each status (accepted, sent, logged = written to the log only and NOT delivered, queued, held, skipped, no_device, failed). Only the people in your scope are counted; categories whose records you can't open are left out. Filters: from, to (dates), category, channel (bell, push, email, whatsapp), status (delivered, failed, logged, queued, held, skipped, no_device, read, unread), person (user id), branch (id), kind (system, person, announcement), actor (user id), q (words). Also returns summary (sent today, failed, delivery rate per channel) and channels (whether email, push and WhatsApp can deliver right now).
Argument Type Description company_idrequiredinteger fromstring YYYY-MM-DD tostring YYYY-MM-DD categorystring
requests | payroll | attendance | performance | tasks | field | recruitment | documents | announcements | people | greetings | security | admin | generalchannelstring
bell | push | email | whatsappstatusstring
delivered | failed | logged | queued | held | skipped | no_device | read | unreadpersoninteger branchinteger kindstring
system | person | announcementactorinteger qstring pageinteger limitinteger 1-100, default 30. -
list_org_unitsread only The organization structure: work locations, departments, sections (with their department as parent_i...The organization structure: work locations, departments, sections (with their department as parent_id), projects and hierarchy groups. branch_id null means all branches.
Argument Type Description company_idrequiredinteger typestring
work_location | department | section | project | hierarchy_group | business_unit | division | segment -
list_payrollchanges data Payroll data for payroll staff (payroll.view or payroll.manage), for the employees in scope. kind ru...Payroll data for payroll staff (payroll.view or payroll.manage), for the employees in scope. kind runs: payroll runs (filters month, kind regular|off_cycle, status draft|approved). kind run: one run with its payslips (run_id). kind payslip: one payslip (payslip_id) with its header (ZenHR slip details) and lines. kind transactions: financial transactions (month, employee_id, type earning|deduction, off_cycle, transaction_type_id, status, q). kind transaction: one transaction's details (transaction_id). kind loans: loans with what is left (employee_id, status active|settled). kind packages: an employee's salary packages (employee_id). kind templates: salary package templates. Setup lists such as transaction types, loan types, cost centers and salary bands are list_setup_form entities.
Argument Type Description company_idrequiredinteger kindrequiredstring
runs | run | payslip | transactions | transaction | loans | packages | templatesrun_idinteger payslip_idinteger transaction_idinteger transaction_type_idinteger qstring employee_idinteger monthstring YYYY-MM kind_filterstring
regular | off_cycleFor kind runs: the run kind. statusstring typestring
earning | deductionoff_cycleboolean pageinteger per_pageinteger -
list_payroll_costsread only Payroll costs, rates and salaries (read-only), as the API lists them. Setup kinds need payroll_setup...Payroll costs, rates and salaries (read-only), as the API lists them. Setup kinds need payroll_setup.manage: kind exchange_rates: currency pairs by effective date with the base currency and the multi-currency switch (filters currency, branch: a branch id or "company"). kind cost_center_groups: groups with the cost centers they include (code, center). Employee kinds need payroll.view or payroll.manage and only show employees in scope: kind cost_allocations: each employee's split over cost centers for a period, status active|inactive|upcoming (employee_id, status, group). kind part_time: part-time transaction assignments (employee_id, type: a transaction type id, effective, from, to dates). kind salaries: every payslip as on Manage salaries, with who has their salary stopped (year, month 1-12, salary_type regular|off_cycle, slip_type payroll|in_payroll_settlement|off_cycle_settlement, run_status draft|pending|rejected|approved|sent, date_from / date_to YYYY-MM, in_advance yes|no, q). kind salary_batches: the Salary Batches tab, each run with its date range, headcount and net (year, month 1-12, salary_type regular|off_cycle, run_status draft|approved). kind calculate_options (payroll.manage): what Calculate offers for salary_month YYYY-MM (else the open month): the grouped picker values (branch:<id>, employee:<id>, org:<id>), the cut-off date range and the draft batches to add to. All take page and per_page; employee kinds also take the org filters department and branch.
Argument Type Description company_idrequiredinteger kindrequiredstring
exchange_rates | cost_center_groups | cost_allocations | part_time | salaries | salary_batches | calculate_optionscurrencystring branchstring A branch id; for exchange_rates also "company". codestring centerinteger employee_idinteger statusstring
active | inactive | upcominggroupinteger typeinteger effectivestring fromstring tostring yearinteger monthinteger salary_typestring
regular | off_cycleslip_typestring
payroll | in_payroll_settlement | off_cycle_settlementFor kind salaries: ZenHR's salary slip type. run_statusstring
draft | pending | rejected | approved | sentdate_fromstring date_tostring in_advancestring
yes | noin_advance_paidstring
yes | noqstring departmentinteger salary_monthstring For kind calculate_options: YYYY-MM. pageinteger per_pageinteger -
list_payroll_setupread only Payroll setup for payroll admins (payroll_setup.manage). kind settings: a settings section's current...Payroll setup for payroll admins (payroll_setup.manage). kind settings: a settings section's current values (switches as booleans, id lists as arrays, the rest as strings): section payroll_setup (cut-off day, day bases, absence/unpaid calculation, gross-up, tax method, payslip options, negative balances, general finance values), in_advance (in-advance salary setup), extra_salaries (extra salaries setup), tax_setup (what comes off the taxable salary), journal (journal entries structure and account codes), provision_setup (which provisions are calculated). kind rules: a payroll rules list, section social-security, tax, extra-salaries, bank-accounts (filter branch_id), bank-templates or slip-templates.
Argument Type Description company_idrequiredinteger kindrequiredstring
settings | rulessectionrequiredstring
payroll_setup | in_advance | extra_salaries | tax_setup | journal | provision_setup | social-security | tax | extra-salaries | bank-accounts | bank-templates | slip-templatesSettings sections for kind settings, list sections for kind rules. branch_idinteger For bank-accounts: only this branch's accounts. -
list_pending_biometricsread only New biometrics waiting for HR (devices.manage, docs/devices.md): a new finger, face or palm, or a ne...New biometrics waiting for HR (devices.manage, docs/devices.md): a new finger, face or palm, or a newer enrolment of one, reported by a device; and conflicts (two devices hold different data for a slot). Each item: employee, slot, source device, kind new|conflict, the devices a publish would reach (targets) and those that can't take it with the reason (incompatible). Optional employee_id. Decide with publish_biometrics.
Argument Type Description company_idrequiredinteger employee_idinteger -
list_permission_groupsread only The company's groups: who is in each (branches, units, named people) and the role of its three seats...The company's groups: who is in each (branches, units, named people) and the role of its three seats (manager, team leader, employee). As GET permission-groups. Needs roles.manage.
Argument Type Description company_idrequiredinteger -
list_permission_overridesread only Exceptions for people: an action opened or closed, or a field's level, per channel. Filter by user_i...Exceptions for people: an action opened or closed, or a field's level, per channel. Filter by user_id. As GET permission-overrides. Needs roles.manage.
Argument Type Description company_idrequiredinteger user_idinteger -
list_positionsread only The company's job titles (positions).The company's job titles (positions).
Argument Type Description company_idrequiredinteger -
list_projectsread only The company's projects (code, names, client, group and entity codes, manager, dates, budget hours, a...The company's projects (code, names, client, group and entity codes, manager, dates, budget hours, active or closed). Give project_id for one project with the employees assigned to it and its hours from the timesheets (approved, waiting, labour cost, budget used, by employee and month).
Argument Type Description company_idrequiredinteger project_idinteger -
list_provisionsread only Monthly provisions (vacation compensation, end-of-service benefit, extra salaries, air tickets) for...Monthly provisions (vacation compensation, end-of-service benefit, extra salaries, air tickets) for the employees in my payroll scope (payroll.view or payroll.manage). kind rows: one row per employee and month with the month's provisions, adjustments and totals; filters month YYYY-MM (default this month) or from / to, stb_types (STB policy ids), contract_type limited|unlimited, employee_status active|inactive, kind_filter (employee kind). kind months: the calculated months with people, the month's provisions and the total. Provision setup is list_payroll_setup section provision_setup.
Argument Type Description company_idrequiredinteger kindrequiredstring
rows | monthsmonthstring YYYY-MM fromstring YYYY-MM tostring YYYY-MM stb_typesarray contract_typestring
limited | unlimitedemployee_statusstring
active | inactivekind_filterstring Employee kind. -
list_punch_logread only The punch log (attendance.security.review, docs/attendance-security.md): self-service punches of the...The punch log (attendance.security.review, docs/attendance-security.md): self-service punches of the employees your role reaches with their context (channel, IP, browser or phone, location and accuracy, mock flag, Wi-Fi, offline proof, integrity verdict) and what the security checks found, newest first, 50 a page. Filters: employee_id, branch_id, from and to (YYYY-MM-DD), channel (web, mobile, mcp), device (device id), ip, flagged (only punches with findings), status (accepted, flagged, held, blocked), review (pending, approved, rejected). id returns one punch.
Argument Type Description company_idrequiredinteger idinteger employee_idinteger branch_idinteger fromstring YYYY-MM-DD tostring YYYY-MM-DD channelstring
web | mobile | mcpdevicestring ipstring flaggedboolean statusstring
accepted | flagged | held | blockedreviewstring
pending | approved | rejectedpageinteger -
list_recruitmentread only Recruitment (recruitment.view): kind summary (counts and the careers page address), jobs (filters st...Recruitment (recruitment.view): kind summary (counts and the careers page address), jobs (filters status draft/open/closed, type, department, branch, q), job (job_id: the opening and its candidates by stage), candidates (filters job, stage applied/screening/interview/offer/hired/rejected, source, q), candidate (candidate_id: with notes and interviews), interviews (filters status, from, to, candidate). CVs download through the API.
Argument Type Description company_idrequiredinteger kindstring
summary | jobs | job | candidates | candidate | interviewsjob_idinteger candidate_idinteger statusstring typestring
full_time | part_time | contract | internshipdepartmentinteger branchinteger jobinteger stagestring
applied | screening | interview | offer | hired | rejectedsourcestring
careers_page | referral | linkedin | job_board | othercandidateinteger fromstring tostring qstring -
list_recruitment_atsread only Applicant tracking (recruitment.view; offers also recruitment.approve_offers): kind pipeline (the st...Applicant tracking (recruitment.view; offers also recruitment.approve_offers): kind pipeline (the stages and who is in each; filter job), dashboard (funnel, time to hire, source effectiveness, offer outcomes; filters from, to, job), pool (talent pool; filters q on name/email/skills/tags, tag), offers (filter status), offer (offer_id: with both letters and the candidate's link while sent), availability (interviewers' weekly windows; filter employee), templates (stage emails, the "assessment" email, offer letter templates and their placeholders), assessments (candidate_id: the tests sent, status, best result, passed, gate, link), stage_assessments (the test each stage sends and its gate; and the active tests to pick from), settings (AI switches, candidate email language, connected accounts, job feed address).
Argument Type Description company_idrequiredinteger kindstring
pipeline | dashboard | pool | offers | offer | availability | templates | assessments | stage_assessments | settingscandidate_idinteger offer_idinteger fromstring tostring jobinteger qstring tagstring statusstring
draft | pending_approval | approved | rejected | sent | accepted | declined | expired | withdrawnemployeeinteger -
list_reportsread only The reports the person may run (each needs its permission: employees.view for people reports, leaves...The reports the person may run (each needs its permission: employees.view for people reports, leaves.view for time off, attendance.view for attendance and timesheets, payroll.view for pay, costs and bank exports, requests.view and assets.view for those), the ones coming with a module, their saved options, and the customized reports when they have reports.custom. With report, that report's form: filters (key, type, params to send, options), columns by group, default columns, switches and exports.
Argument Type Description company_idrequiredinteger reportstring A report key, for its filters, columns and switches -
list_request_typeschanges data The request types the company offers (expense, overtime, missing punch, general, vacation resumption...The request types the company offers (expense, overtime, missing punch, general, vacation resumption, vacation encashment, HR letter…): key, label, whether employees file it themselves or only for someone else, whether it takes an attachment, its default approval chain, the fields it asks for and the choices of fields that take one (options: field → value and label).
Argument Type Description company_idrequiredinteger -
list_role_assignmentsread only Who has which role in which scope. Filter by user_id or role_id.Who has which role in which scope. Filter by user_id or role_id.
Argument Type Description company_idrequiredinteger user_idinteger role_idinteger -
list_rolesread only The company's roles with their permissions and how many people have each, plus the permission catalo...The company's roles with their permissions and how many people have each, plus the permission catalog (each group's permissions, and under children the sub-module permissions that can be given alone; a module permission grants all its children), scopes and presets; catalog lists every permission flat with its group, module permission, scopes and English and Arabic labels; line_manager_access is what direct managers may do for their reports (set_line_manager_access).
Argument Type Description company_idrequiredinteger -
list_salary_scalesread only Salary scales (HR module). kind scales: the scales with structure, layers, exceed percentages, compa...Salary scales (HR module). kind scales: the scales with structure, layers, exceed percentages, compa-ratio range, activation date and status (filter status active|inactive|draft; payroll_setup.manage). kind scale: one scale (scale_id) with its grades, bands and levels, each with min/mid/max salary, entitled_to_overtime, the ids it entitles to (job_role, loan_type, air_ticket_policy, insurance_policy, annual_leave, sick_leave) and allowances (payroll_setup.manage). kind job_grades: the job grades screen, each grade with range, ideal compa-ratio, benefits, levels, leave days, headcount, average salary, compa-ratio and who is outside the range, plus salary_scale_enforce (payroll_setup.manage). kind placement: an employee's place on the scale (employee_id, in my payroll.view or payroll.manage scope) with range and compa-ratio.
Argument Type Description company_idrequiredinteger kindrequiredstring
scales | scale | job_grades | placementscale_idinteger employee_idinteger statusstring
active | inactive | draft -
list_setup_formread only Setup forms (ZenHR full forms): the items of one entity with their fields, and the fields' kinds and...Setup forms (ZenHR full forms): the items of one entity with their fields, and the fields' kinds and options. Entities now: org-levels (organizational levels: type, parent, rank, subsidiary ID, logo, key staff) and attendance-functions (functions such as breaks and visits: deduct per, minutes per day, per transaction and in total, active).
Argument Type Description company_idrequiredinteger entityrequiredstring
expense-types | cities | org-levels | miscellaneous-types | attendance-functions | transaction-types | loan-types | part-time-transaction-types | cost-centers | salary-bands | letter-categories | disciplinary-types | suspension-reasons | termination-reasons | checklist-templates -
list_stb_encashmentsread only End-of-service benefit encashments (HR module, payroll.stb_encashments.view, which payroll.view and...End-of-service benefit encashments (HR module, payroll.stb_encashments.view, which payroll.view and payroll.manage grant; employees in my scope). kind list: encashments newest first (employee_id filter, page, per_page) with the company limits (enabled, max_percent, min_years, every_years). kind available: what an employee can take now (employee_id): service years, accrued benefit, taken before, allowed amount, eligible and the reason when not. kind settings: every encashment rule (stb_encash_* as manage_stb_encashments action settings takes them: limits, eligibility, times per years, line names, policies by contract).
Argument Type Description company_idrequiredinteger kindrequiredstring
list | available | settingsemployee_idinteger pageinteger per_pageinteger -
list_tasksread only Tasks. tab mine (default: given to me), assigned (given by me) or employees (tasks.manage: the peopl...Tasks. tab mine (default: given to me), assigned (given by me) or employees (tasks.manage: the people in scope); show pending (default), past_due, completed or all; status, kind, employee (id), template (id), q. With task_id, one task. kind_list templates lists the task templates (tasks.manage).
Argument Type Description company_idrequiredinteger task_idinteger kind_liststring
tasks | templatestabstring
mine | assigned | employeesshowstring
pending | past_due | completed | allstatusstring
todo | in_progress | awaiting_confirmation | done | cancelledkindstring
custom | document_upload | document_download | give_asset | take_asset | add_bank_account | add_family_member | complete_profileemployeeinteger templateinteger qstring -
list_team_leavesread only Leave requests of the employees your role reaches (leaves.view): status pending (default), approved,...Leave requests of the employees your role reaches (leaves.view): status pending (default), approved, rejected, withdrawn or all; kind days or hours (leaves by the day or by the hour); leave_type_id, employee_id, from, to. 50 a page.
Argument Type Description company_idrequiredinteger kindstring
days | hoursstatusstring
pending | approved | rejected | withdrawn | allleave_type_idinteger employee_idinteger fromstring tostring pageinteger -
list_time_setupread only The company's time setup by kind: shifts (work shifts, with how many employees work each), overtime_...The company's time setup by kind: shifts (work shifts, with how many employees work each), overtime_types, holidays (of year, this year by default), geolocations (work locations), biometric_devices (attendance machines; tokens are never listed) or detected_devices (clocks that called in from the caller's own public IP and are not added yet: serial, family, model, last call; add one with save_time_setup_item kind biometric_devices). Needs attendance_setup.manage.
Argument Type Description company_idrequiredinteger kindrequiredstring
shifts | overtime_types | holidays | geolocations | biometric_devices | detected_devicesyearinteger For holidays -
list_workflowsread only Onboarding, offboarding, vacation clearance and resumption workflows (docs/boarding.md). kind mine:...Onboarding, offboarding, vacation clearance and resumption workflows (docs/boarding.md). kind mine: the user's own sent workflows with their tasks (a resumption workflow on request starts when the vacation_resumption request is filed). kind workflows: workflows of the employees in employees.view's scope (filters category onboarding|offboarding|clearance|resumption, status pending|in_progress|completed, employee_id, date_from, date_to). kind workflow: one with its tasks (id). kind templates: workflow templates with their tasks (employee_settings.manage; filters category, q). kind template: one template with its tasks (id; employee_settings.manage).
Argument Type Description company_idrequiredinteger kindrequiredstring
mine | workflows | workflow | templates | templateidinteger filtersobject -
list_zenhr_historyread only History imported from ZenHR (docs/zenhr-import.md), 50 a page, for the employees your role reaches....History imported from ZenHR (docs/zenhr-import.md), 50 a page, for the employees your role reaches. kind days: ZenHR's day analysis (status, shift, first in/last out with place, minutes required, worked, late, early out, overtime, variance; attendance.manage). kind punches: every punch (function, who added it, machine, card id, place; attendance.manage). kind balances: vacation balances per year (previous, opening, taken, adjustments, encashed, available, financial effect; leaves.manage). Filters: employee_id, from, to (YYYY-MM-DD), status present|absent|partial (days), leave_type_id and year (balances).
Argument Type Description company_idrequiredinteger kindrequiredstring
days | punches | balancesemployee_idinteger fromstring tostring statusstring
present | absent | partialleave_type_idinteger yearinteger pageinteger -
live_locationchanges data Mandatory live location for field staff (docs/live-location.md). live_location.manage: action get_po...Mandatory live location for field staff (docs/live-location.md). live_location.manage: action get_policy; action set_policy (fields: enabled, mode while_clocked_in|during_shift|always_when_app_open, interval_seconds, distance_meters, max_silence_minutes, retention_days, reason {en, ar}, rules [{target_type all|branch|department|section|work_location|group|employee, target_id, effect include|exclude}] replacing the current ones; an employee rule is their override). live_location.view (your role's scope, the branch you work in): action positions (filters: branch, department, group, status online|lost|offline|none, q) = latest position, age, battery, accuracy, mocked flag and status per employee; action trail (employee_id, date) = that day's points. action export: the export's rows (with employee_id and date a trail, else the positions by filters), logged as an export. Every positions and trail call is recorded in the location view log. app_policy.manage: action get_rule / set_rule with policy app_lock (fields: enabled, when every_open|after_background, after_minutes, methods biometric|biometric_or_passcode, rules) or punch_auth (fields: enabled, methods, rules): the same targeting; punches then need local_auth {method face|fingerprint|passcode, at}; or screen_capture (fields: enabled): the whole app kept out of screenshots and recordings, company-wide, on by default (Field-proof screens always are); or phone_sharing, one account per phone (fields: inherit = use the Mihnaro default, mode allow|warn|block, max_accounts 1–10, rules; no include rule = everyone; docs/platform-control.md «الهاتف المشترك»); or event_location, keeping the phone's GPS point with app sign-ins and opens (fields: inherit = use the Mihnaro default auto|on|off, enabled, rules; no include rule = everyone; only from people who already allowed location on the phone; never demo or reviewer accounts; docs/platform-control.md «موقع الأحداث»); or location_required, location as a condition of using the app (fields: inherit, enabled, precise, reason_en, reason_ar, rules; the app gates until location is on and the server refuses with location_required; never demo or reviewer accounts; docs/platform-control.md «الموقع شرط لفتح التطبيق»); or context_device|context_network|context_battery|context_permissions|context_security|context_time|context_locale|context_health, each category of phone details the app sends with opens, sign-ins and punches (fields: inherit, enabled, retention_days 7–730, rules; docs/platform-control.md «بيانات الهاتف»).
Argument Type Description company_idrequiredinteger actionrequiredstring
get_policy | set_policy | positions | trail | export | get_rule | set_rulefieldsobject set_policy: the policy fields and rules filtersobject positions: branch, department, group, status, q employee_idinteger policystring
app_lock | punch_auth | screen_capture | phone_sharing | event_location | location_required | context_device | context_network | context_battery | context_permissions | context_security | context_time | context_locale | context_healthget_rule / set_rule datestring trail: Y-m-d, default today -
log_timesheetchanges data Your timesheet: action add (project_id, work_date, hours, description), delete (entry_id; a draft or...Your timesheet: action add (project_id, work_date, hours, description), delete (entry_id; a draft or returned entry) or submit (week: a date in the period).
Argument Type Description company_idrequiredinteger actionrequiredstring
add | delete | submitproject_idinteger work_datestring hoursnumber descriptionstring entry_idinteger weekstring -
manage_accountingcan delete Direct accounting connectors (each ledger needs integrations.{provider}.manage, which integrations.m...Direct accounting connectors (each ledger needs integrations.{provider}.manage, which integrations.manage grants; docs/accounting-connectors.md). provider: odoo, quickbooks, xero, netsuite, business_central, sap_b1, sap_s4hana or dynamics_fo. action save: fields = the provider's connection fields (see list_accounting kind connection; secrets are stored encrypted, empty keeps the saved one) and posting options post_on_approval, post_off_cycle, kinds (payroll, contributions, cost_center, bank_transfer), post_state posted|draft, entry_date month_end|approval, journal, rounding_account, currency, send_partners. action oauth_url: the consent link for QuickBooks and Xero (open it signed in to Mihnaro). action test: sign in and read the organization. action refresh: read the ledger's accounts, analytics, partners and journals. action disconnect: forget the credentials. action map: items [{type account|cost_center|branch|employee, local_key, external_id (empty removes)}]. action auto_match: map accounts whose codes match. action post: run_id, post an approved payroll (idempotent: what is posted is never sent twice). action retry / reverse / repost: posting_id. action sync_employees: employee_ids optional.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | oauth_url | test | refresh | disconnect | map | auto_match | post | retry | reverse | repost | sync_employeesproviderstring
odoo | quickbooks | xero | netsuite | business_central | sap_b1 | sap_s4hana | dynamics_fobranch_idinteger A branch's own connection (when the ledger is set per branch); empty = the company's. fieldsobject itemsarray run_idinteger posting_idinteger employee_idsarray -
manage_air_ticket_policieschanges data Add, edit, delete and give air ticket policies (payroll_setup.manage, HR module). action create and...Add, edit, delete and give air ticket policies (payroll_setup.manage, HR module). action create and update (policy_id): fields name_en (required), name_ar, tickets (0-20 a period), period_months (1-120), period_anchor hire|calendar, accrual period_start|monthly, amount (one ticket's value), family_members, eligible_after_months, applies_to all|assigned, expire_option none|immediately|after with expire_after_months, distribution per_person|shared, default_payroll in_payroll|off_cycle, default_request_type cash_out|ticket, transaction_type_id, gl_identifier, clearance_account, setups[] {position_ids[], nationalities "a,b", years_from, years_to, amount, currency, beneficiaries[] {relation parent|spouse|child|sibling, deduction %}}, switches cash_out, active, allow_custom_amount, allow_negative, show_negative, company_expense, tax_exempt, show_home_country (off unless true) and show_balance, allow_partial, requestable, show_amount (on unless false). Update sends every field again; apply_changes update|new with balance_date starts a new balance. action delete: policy_id (no ticket taken under it). action assign: policy_id; fields scope all|selected, employee_ids[], opening_balance (active employees in my payroll.manage scope). action unassign: policy_id, employee_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | update | delete | assign | unassignpolicy_idinteger employee_idinteger fieldsobject -
manage_air_ticketschanges data Air ticket transactions for employees in my payroll.manage scope (HR module). action add: fields emp...Air ticket transactions for employees in my payroll.manage scope (HR module). action add: fields employee_id, policy_id (one of the employee's policies; empty for the company allowance while no policies exist), slice (ZenHR's eligible slice: the index of one of the policy's slices from list_air_ticket_policies; default the one that fits the employee), tickets[] (ticket cards: {owner "self" or a family member id, count, amount (default count × the slice's ticket value)}) or the older owners[] ("self" and family member ids, one ticket each), travel_date, return_date, destination, cash_out (paid with the salary, when the policy allows), amount (the total; default the cards' amounts added up), notes; checked against the balance on the travel date. action mark_paid: fields ids[], paid_at, payment_reference (booked, unpaid ones). action delete: transaction_id (not paid and not in an approved payroll). action bulk_delete: fields ids[] (paid ones stay; returns how many were deleted).
Argument Type Description company_idrequiredinteger actionrequiredstring
add | mark_paid | delete | bulk_deletetransaction_idinteger fieldsobject -
manage_announcementchanges data Company announcements (announcements.manage). action save: publish one (the people it is for are not...Company announcements (announcements.manage). action save: publish one (the people it is for are notified), or change one with announcement_id: fields title {en, ar}, body {en, ar} (HTML as the composer makes it: p, h1-h4, strong, em, u, s, span/mark with color or background-color, ul/ol/li, blockquote, a, table, hr, img only with a picture uploaded by manage_announcement_media; anything else is removed), pinned, starts_on and expires_on (YYYY-MM-DD: shown from, until; a later start is announced on that day), gallery [{file, caption {en, ar}}] in order (first = cover) and attachments [{index} to keep one, {upload, name} to add one] (left out = unchanged), targets (who it is for: branches, departments, sections, positions, work_locations, projects (ids), genders (male, female), religions (muslim, christian, hindu, buddhist, sikh, other), employees (ids); several kinds narrow it, named employees are always added; {} = everyone), or the older branch_id alone (empty = company-wide; default the current branch). action delete: remove the announcement_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | deleteannouncement_idinteger fieldsobject -
manage_announcement_mediachanges data An announcement's pictures and files, uploaded into Mihnaro (announcements.manage; docs/communicatio...An announcement's pictures and files, uploaded into Mihnaro (announcements.manage; docs/communication.md §5ج). action upload: keep a picture (kind image, for the text or the gallery) or file (kind file: pdf, Word, Excel, PowerPoint, txt, csv or a picture), within the announcement_file_kb limit of company_limits, given as data (a data: URL or base64) and name; returns the file to put in manage_announcement's gallery [{file, caption}] or attachments [{upload: file, name}], or in the text as <img src="https://mihnaro-image.invalid/<file>">. On an announcement_id: gallery_add (data, name, caption {en, ar}), gallery_move (index, to), gallery_caption (index, caption), gallery_remove (index), attachment_add (data, name), attachment_rename (index, name), attachment_remove (index). Outside picture addresses are never accepted.
Argument Type Description company_idrequiredinteger actionrequiredstring
upload | gallery_add | gallery_move | gallery_caption | gallery_remove | attachment_add | attachment_rename | attachment_removeannouncement_idinteger kindstring
image | filedatastring data:<type>;base64,… or base64 namestring captionobject {"en": "...", "ar": "..."} indexinteger tointeger -
manage_api_keycan delete Company API keys (integrations.api_keys.manage, which integrations.manage grants; docs/integrations....Company API keys (integrations.api_keys.manage, which integrations.manage grants; docs/integrations.md). action create: fields name, abilities (read, write, update, delete), ip_addresses (list; empty = any), expires_on, user_id (who it acts as; default the caller), auth_type (basic, oauth1, oauth2, credentials) with its outgoing credentials. The key is in the answer ONCE as token: hand it over safely, it can't be shown again. action update: api_key_id and the same fields (a blank secret keeps the saved one). action revoke: api_key_id; anything using it stops at once.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | update | revokeapi_key_idinteger fieldsobject -
manage_approval_delegationchanges data Approval delegation (ZenHR "Delegated"): list the delegations you gave or received, delegate your ap...Approval delegation (ZenHR "Delegated"): list the delegations you gave or received, delegate your approval steps to a colleague (delegate_id is their user id; starts_on, ends_on empty = until ended, note), or end one of yours (delete, id). The delegate decides on your behalf and each decision says so.
Argument Type Description company_idrequiredinteger actionstring
list | delegate | deletedelegate_idinteger starts_onstring Y-m-d ends_onstring Y-m-d, empty = until ended notestring idinteger -
manage_approval_setupchanges data Approval setup (approval_setup.manage). action get: each request kind's chain (empty = its default)...Approval setup (approval_setup.manage). action get: each request kind's chain (empty = its default) and the approval templates. action save_chains: chains {kind: value}, value one of manager, hr, "manager,hr", "tpl:<template id>" (or "none" for payroll_batch). action save_template: add one, or change it with template_id: name {en, ar}, object_type (a transaction type such as leave, overtime, general, expense) and object_id (its sub-type), assign {work_location_ids, department_ids, section_ids, business_unit_ids, division_ids, segment_ids, hierarchy_group_ids, job_role_ids, project_ids, employee_ids}, steps in order — ZenHR's "Approved By": approvals_officer, manager, manager_2, manager_3, financial_officer, supervisor, hr, payroll, "employee:<employee id>", "department:<department or section id>", "position:<job role id>", "role:<role id>", "user:<user id>", or {kind: committee, members: ["e<employee id>" or user ids]}; action approvers lists every one this template (template_id) or a new one may name, from its own branch only, skip_after with skip_after_unit days|hours, notify_user_ids, override_enabled with overrider_ids and override_self. action delete_template: one no chain points at.
Argument Type Description company_idrequiredinteger actionrequiredstring
get | approvers | save_chains | save_template | delete_templatechainsobject template_idinteger fieldsobject -
manage_assessmentscan delete Assessments. action grade (answer_id; needs assessments.grade or assessments.manage): fields points...Assessments. action grade (answer_id; needs assessments.grade or assessments.manage): fields points (0 to the question's points), note, reason (required when changing a grade already given, the automatic one too; kept in the attempt's grade_history). Every other action needs assessments.manage. save_category (category_id to change): fields name {en, ar}, description, competency_id. delete_category. save_question (question_id to change): fields type (single, multiple, true_false, short_text, long_text, ordering, matching, numeric, file_upload), assessment_category_id, difficulty (easy, medium, hard), prompt {en, ar}, options [{key?, text {en, ar}}] (choices, items in the right order, or the left side of matching), targets (the right side of matching), answer (single: a key; multiple: keys; true_false: true/false; short_text: accepted answers; matching: {left key: right key}; numeric: {value, tolerance}), points, time_limit_seconds, explanation, is_active, media {name, content_base64} (an image jpg/png/gif/webp, audio mp3/m4a/wav/ogg or video mp4/webm, each within the upload_file_kb limit of company_limits; also options[n].media; options sent back with the same key keep theirs), remove_media (true), options[n].remove_media. delete_question. save_test (test_id to change): fields title {en, ar}, description, instructions, purpose (pre_employment, post_employment), time_limit_minutes, shuffle_questions, shuffle_options, attempts_allowed, pass_mark (%), negative_marking, negative_ratio, show_score, competency_id, pass_stage, fail_stage (recruitment stages), status (draft, active, archived), items [{kind: question, assessment_question_id} or {kind: random, assessment_category_id, difficulty?, draw_count}]. delete_test (only if nobody took it). invite (test_id): fields candidate_ids, employee_ids, expires_at, locale, pass_stage, fail_stage (the gate for candidates); returns the candidates' links. resend_invitation (invitation_id; fields expires_at, needed when the link has expired; returns sent and reason: sandbox, mail_off, employees_held, no_email, failed). cancel_invitation (invitation_id). install_template: fields key (from list_assessments kind templates).
Argument Type Description company_idrequiredinteger actionrequiredstring
save_category | delete_category | save_question | delete_question | save_test | delete_test | invite | resend_invitation | cancel_invitation | grade | install_templatecategory_idinteger question_idinteger test_idinteger invitation_idinteger answer_idinteger fieldsobject -
manage_assetchanges data Company assets and asset types (assets.manage). action save: add an asset, or change it with asset_i...Company assets and asset types (assets.manage). action save: add an asset, or change it with asset_id: fields asset_type_id, name, serial_number (unique), owner_branch_id, purchase_date, production_date, expiry_date, value, description, notes. action assign: hand it to an employee in scope (fields assigned_to, assigned_at, return_date, notes). action release: take it back. action status: fields.status damaged, under_repair, archived or available. action delete: an asset nobody holds. action save_type: an asset type, or change one with asset_type_id: fields name {en, ar}, branch_ids (ids or ["all"]), active. action delete_type: a type no asset uses. Attachments go through the API or the screen.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | assign | release | status | delete | save_type | delete_typeasset_idinteger asset_type_idinteger fieldsobject -
manage_business_travelchanges data Change the business travel setup (payroll_setup.manage, HR module). action update_setup: fields trip...Change the business travel setup (payroll_setup.manage, HR module). action update_setup: fields trip_per_diem_type_id, trip_air_ticket_type_id, trip_accommodation_type_id (transaction type ids, required), trip_payment in_payroll|off_cycle, trip_remind_days (0-60), trip_expense_type_ids[], trip_slip_breakdown, trip_show_amounts, components[] {id, name_en, name_ar} (a listed component with both names empty is removed when no policy uses it). action create and update (policy_id): fields name_en (required), name_ar, position_ids[] (required), destinations[] {category domestic|international; domestic needs country, departure_cities and arrival_cities ("a,b"); international departure_countries[] and arrival_countries[] (codes); travel_types[] airplane|bus|car|train, air_classes[] economy|business|first, max_air_ticket, max_travel_cost, hotel_tiers[] 1-5, max_accommodation, components[] {type_id, amount, mandatory}}, switches active, requestable, notes_required, attachments_required (off unless true). action delete: policy_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
update_setup | create | update | deletepolicy_idinteger fieldsobject -
manage_calibrationcan delete Calibrating evaluation results (performance.calibrate, docs/talent-mobile.md). action board (cycle_i...Calibrating evaluation results (performance.calibrate, docs/talent-mobile.md). action board (cycle_id): who sits in which result band, and whose result you may move. action history (evaluation_id): the moves of one result. action move (evaluation_id): fields score (0 to 100), reason; only a completed evaluation in an open cycle, in your scope, never your own. The employee, the result writer and others who may calibrate are told.
Argument Type Description company_idrequiredinteger actionrequiredstring
board | history | movecycle_idinteger evaluation_idinteger fieldsobject -
manage_checklistchanges data Joining and leaving checklists (docs/terminations.md). action overview (employees.view: joiners and...Joining and leaving checklists (docs/terminations.md). action overview (employees.view: joiners and leavers in scope with their progress; fields type onboarding|offboarding, status not_started|in_progress|completed, default not completed). employees.manage over the employee: show (employee_id: the steps), add (employee_id; fields type, title {en, ar}), toggle (item_id: tick a step off or back on), delete (item_id). The standard steps are the setup list checklist-templates (save_setup_form_item).
Argument Type Description company_idrequiredinteger actionrequiredstring
overview | show | add | toggle | deleteemployee_idinteger item_idinteger fieldsobject -
manage_connected_accountchanges data Manages one of the company's connected accounts (docs/integration-connections.md), the same operatio...Manages one of the company's connected accounts (docs/integration-connections.md), the same operations as the screen and the API. action mode (provider, mode company|branch; also for the ledgers): one account for the whole company or one per branch. action save (provider, branch_id, app own|platform, client_id, client_secret write-only, tenant for microsoft, organization = LinkedIn page id). action authorize_url (provider, branch_id): the consent page to open in a browser signed in to Mihnaro as the same person. action test (provider, branch_id): reads the signed-in account. action disconnect (provider, branch_id): revokes and clears the tokens. branch_id empty = the whole company's connection. Providers zoom, google, microsoft, linkedin (ledgers are set up with manage_accounting and its branch_id).
Argument Type Description company_idrequiredinteger actionrequiredstring
mode | save | authorize_url | test | disconnectproviderrequiredstring
zoom | google | microsoft | linkedin | odoo | quickbooks | xero | netsuite | business_central | sap_b1 | sap_s4hana | dynamics_fobranch_idinteger The branch's own connection; empty = the whole company's. modestring
company | branchappstring
own | platformclient_idstring client_secretstring Write-only: never returned. tenantstring organizationstring -
manage_cost_allocationschanges data Cost center allocations for employees in my payroll scope (payroll.manage). action add: fields emplo...Cost center allocations for employees in my payroll scope (payroll.manage). action add: fields employee_id, start_date, end_date (optional, on or after the start), allocations[] {cost_center_id, percent} with distinct cost centers whose percentages add up to 100; an employee's periods can't overlap. action delete: allocation_id (the id list_payroll_costs kind cost_allocations shows); removes all its cost centers for that period.
Argument Type Description company_idrequiredinteger actionrequiredstring
add | deleteallocation_idinteger fieldsobject -
manage_cost_center_groupschanges data Cost center groups (payroll_setup.manage). action save: a new group, or changes to one with group_id...Cost center groups (payroll_setup.manage). action save: a new group, or changes to one with group_id; fields name_en (required), name_ar (else the English name), code (optional group code). action delete: group_id; a group that still includes cost centers can't be deleted. Cost centers join a group from the cost centers setup form. list_payroll_costs kind cost_center_groups lists them.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | deletegroup_idinteger fieldsobject -
manage_custom_reportcan delete Customized reports (reports.custom), as POST/PATCH/DELETE custom-reports. action sources: the data s...Customized reports (reports.custom), as POST/PATCH/DELETE custom-reports. action sources: the data sources and fields the person may pick (each source needs its permission; IDs and passports need employees.view_sensitive). action save: create, or change with id: fields name {en, ar}, locale en|ar, employee_status active|inactive|both, schedule none|daily|weekly|monthly|annually, notify_user_ids (only people who work in the report's branch and may open customized reports are kept), columns ["source.field", …] in order, shared_branch_ids (ZenHR's "Choose the branches…": other branches that may open it, only branches you work in; each viewer sees only the data their own access reaches). A report belongs to the branch it was made in; one shared with your branch can be run but changed only by its own branch. action delete: remove it with id. Run one with run_report and custom_report_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
sources | save | deleteidinteger fieldsobject -
manage_device_peoplechanges data People on devices (devices.manage, docs/devices.md); the PIN on devices is the employee's biometric...People on devices (devices.manage, docs/devices.md); the PIN on devices is the employee's biometric ID. action list: active people (q by number, biometric ID or name; department; page) with their profile, enrolled device ids and template count. action get: an employee's device profile, enrolments, why they are (not) on each device and template list. action enroll: by employees (individual enrolments) or by department|branch|position|group|all with ids, onto device_ids: an enrolment rule worked out at every sync, so people who join later are added and people who leave are taken off. action rules (device_id): the device's rules and its individually enrolled employee ids. action exclude: ids (employees) kept off device_ids whatever rule would add them. action delete_rule (rule_id). action unenroll: employee_id (or group_id) from device_ids. action profile: employee_id with card, password (digits), privilege (0 user, 2 enroller, 6 admin, 14 super admin), verify_mode (default, finger, face, card, password, card_and_finger, face_and_password...), enabled, push_photo. action remove: off every device now. action pull_templates: ask the devices for the person's templates again.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | get | enroll | rules | exclude | delete_rule | unenroll | profile | remove | pull_templatesdevice_idinteger rule_idinteger qstring departmentinteger pageinteger employee_idinteger group_idinteger bystring
employees | department | branch | position | group | allidsarray device_idsarray cardstring passwordstring privilegeinteger verify_modestring
default | any | finger | pin | password | card | finger_or_password | finger_or_card | card_or_password | pin_and_finger | finger_and_password | card_and_finger | card_and_password | finger_password_card | pin_finger_password | finger_and_card_or_pin | face | face_and_finger | face_and_password | face_and_card | face_finger_card | face_finger_password | vein | palmenabledboolean push_photoboolean -
manage_disciplinechanges data Disciplinary actions and their setup (docs/discipline.md). discipline.manage over the employee: acti...Disciplinary actions and their setup (docs/discipline.md). discipline.manage over the employee: action suggest (fields employee_id, disciplinary_type_id, incident_date: what the escalation rule prescribes); record (fields employee_id, disciplinary_type_id, incident_date, description, optional disciplinary_action_type_id, or action verbal_warning|written_warning|final_warning|deduction with deduction_amount when there is no rule; draft true to save for approval); approve (action_id of a draft); delete (action_id; refused once that month's payroll is approved); generate (fields leave_type_id, kind redundant|grace, effective_date, from, to, optional employee_id, branch_id, department_id: drafts from approved time off). discipline_setup.manage: save_action_type (optional id; fields name {en, ar}, deduction_type none|balanced_vacation|fixed|salary_day|percent, deduction_value, leave_type_id, transaction_type_id, allowance_type_ids, letter_template_id); delete_action_type (id); save_rule (optional id; fields disciplinary_type_id, name {en, ar}, rule_type sequential|separate, drop_after, drop_unit day|month|year, prevent_repetition, prevent_unit, action_type_ids in order); delete_rule (id); save_time_off (id: a time-off type; fields disciplinary_type_id for the generator, redundancy_interval day|week|month, exceed_actions and redundant_actions: rows {amount, rule_id, action_type_id}).
Argument Type Description company_idrequiredinteger actionrequiredstring
suggest | record | approve | delete | generate | save_action_type | delete_action_type | save_rule | delete_rule | save_time_offaction_idinteger The disciplinary action (approve, delete). idinteger The action type or rule (save to change, delete), or the time-off type (save_time_off). fieldsobject -
manage_eos_policieschanges data End-of-service (STB) policies (HR module, payroll_setup.manage), the same rules as the screen. actio...End-of-service (STB) policies (HR module, payroll_setup.manage), the same rules as the screen. action create / update (policy_id): fields name_en, name_ar, termination_category (any|resignation|termination|end_of_contract|retirement|other), min_years, tiers ("from-to:days" per line such as "0-5:15\n5-:30", or a list of {from_years, to_years, days_per_year}), worth_tiers (same form, the value a percent), contract_type both|limited|unlimited, exclude_unpaid[], nationalities[], end_date, allowance_type_ids[], calc_base calendar|365|360, year_definition calendar|fixed with fixed_year_days, calc_type service|remaining|both, remaining_direction add|deduct, service_min_salaries, service_max_salaries, remaining_min_salaries, remaining_max_salaries, flags tax_exempt, is_default (one default per category), thirty_day_months, distribute_per_slice, override_amount. action delete: policy_id (refused while a monthly provision uses it).
Argument Type Description company_idrequiredinteger actionrequiredstring
create | update | deletepolicy_idinteger fieldsobject -
manage_evaluation_cyclechanges data Evaluation cycles (performance.manage). action create: fields evaluation_template_id, name, branch_i...Evaluation cycles (performance.manage). action create: fields evaluation_template_id, name, branch_ids, year, evaluation_part (Y, H1–H2, Q1–Q4 or M1–M12 by the template period), stages {writing_okrs|auditing_okrs|self_assessment|evaluation|auditing_results: {start, end}} (evaluation required). With cycle_id: launch (an evaluation for each active employee, weights must make 100), close, dates (fields.stages), add_employees (fields.employees ids), delete (drafts). With evaluation_id, for an employee in scope: task_holders (fields okr_writer_id, okr_auditor_ids, result_writer_id, result_auditor_ids: employee ids), evaluation_dates (fields.stages), remove.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | launch | close | dates | add_employees | delete | task_holders | evaluation_dates | removecycle_idinteger evaluation_idinteger fieldsobject -
manage_eventchanges data Company events (events.manage). action save: add one, or change one with event_id: fields title {en,...Company events (events.manage). action save: add one, or change one with event_id: fields title {en, ar}, date, start_time (HH:MM), location, description, branch_id (empty = company-wide; default the current branch). action delete: remove the event_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | deleteevent_idinteger fieldsobject -
manage_exchange_rateschanges data Exchange rates (payroll_setup.manage). action save: fields from_currency, to_currency (ISO codes, di...Exchange rates (payroll_setup.manage). action save: fields from_currency, to_currency (ISO codes, different), rate (> 0), effective_date, optional reverse_rate (else 1 ÷ rate) and branch_id (empty = company-wide); saves the pair and its reverse, replacing a rate for the same pair, branch and date. action copy: fields branch_ids[] and effective_date; copies each pair's latest company-wide rate to those branches. action toggle: fields multi_currency true|false turns multi-currency on or off. action delete: rate_id. list_payroll_costs kind exchange_rates lists them.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | copy | toggle | deleterate_idinteger fieldsobject -
manage_feedbackchanges data 360° feedback and feedback forms. For everyone: submit (request_id; fields scores {criterion id: 1–5...360° feedback and feedback forms. For everyone: submit (request_id; fields scores {criterion id: 1–5}, comment; on a survey cycle fields answers {question index: 1–max or text}), open_form (assignment_id: a form assigned to me with its questions and my answers), answer_form (assignment_id; fields.answers {question id: value}), results (cycle_id, employee_id: HR any time, the employee once closed, and their direct manager when the cycle allows; survey cycles add overall, the weighted score). For performance.manage: list_cycles, create_cycle (fields name, evaluation_template_id, due_date, peers_per_employee; or ZenHR's survey cycle: name, description, start_date, due_date, manager_sees_results, groups {manager: {weight}, report: {count, weight}, peer: {count, weight}, self: {}} with weights adding up to 100, assign_to individual with employees ids or group with group {...}, and questions [{type rating|open, text, helper, required, max 2–10, low, high}] or starter general|leadership|customer|culture), show_cycle, launch, close, delete_cycle (cycle_id); list_forms, create_form (fields title, description, start_date, end_date, anonymous, questions [{type text|textarea|checkbox|radio|rating|yes_no, label, helper, mandatory, options [{label, value}], min_rating, max_rating}], assign_to individual with employees ids or group with group {branch, position, department, work_location, work_type}), show_form, delete_form (form_id).
Argument Type Description company_idrequiredinteger actionrequiredstring
submit | open_form | answer_form | results | list_cycles | create_cycle | show_cycle | launch | close | delete_cycle | list_forms | create_form | show_form | delete_formcycle_idinteger employee_idinteger request_idinteger assignment_idinteger form_idinteger fieldsobject -
manage_field_customerschanges data FSM customers (docs/fsm-mobile.md), as GET/POST/PATCH/DELETE field/customers, with the same permissi...FSM customers (docs/fsm-mobile.md), as GET/POST/PATCH/DELETE field/customers, with the same permissions. action list (filters: q, branch_id, active; field.customers.view), get (id), save (field.customers.create, or .edit with id; fields: name, contact_name, phone, email, address, notes, active, branch_id for a new one), delete (id; field.customers.delete; only a customer with no sites).
Argument Type Description company_idrequiredinteger actionrequiredstring
list | get | save | deleteidinteger filtersobject fieldsobject branchstring -
manage_field_jobschanges data Field work orders and sites (docs/field-proof.md, docs/fsm-mobile.md), as POST/PATCH/DELETE field/jo...Field work orders and sites (docs/field-proof.md, docs/fsm-mobile.md), as POST/PATCH/DELETE field/jobs and field/sites; each action its permission, all covered by field.jobs.manage: save_job field.jobs.create or .edit, decide field.jobs.review or .cancel, submit_without_departure field.jobs.review (job_id, fields.reason required: a job waiting for its departure photo goes to review without it, as POST field/jobs/{job}/submit-without-departure), delete_job field.jobs.delete (job_id; only an assigned one with no photos, parts or overtime), save_site field.sites.create or .edit (also field_customer_id), delete_site field.sites.delete (site_id; only with no work orders). action save_job: add a job, or change an assigned or in-progress one with job_id; fields title, description, branch_id (new only), field_site_id, priority (low, normal, high, urgent), planned_start_at, planned_end_at, estimated_minutes, assignee_ids (active employees of the job's branch), min_progress_photos and progress_interval_min (the job's own stage rules; only when field_job_stage_override is on, empty = the company's). action decide: job_id, fields.action approve or reject (a submitted job) or cancel (an open one), fields.note (required to reject or cancel). action save_site: add a site, or change one with site_id; fields name, address, latitude, longitude, radius_m (empty = company default), active, branch_id (new only).
Argument Type Description company_idrequiredinteger actionrequiredstring
save_job | decide | submit_without_departure | delete_job | save_site | delete_sitejob_idinteger site_idinteger fieldsobject branchstring -
manage_financechanges data Financial transactions, loans, salary packages and salary stop for employees in my payroll scope (pa...Financial transactions, loans, salary packages and salary stop for employees in my payroll scope (payroll.manage). action add_transaction: fields employee_id, transaction_type_id (or type earning|deduction with category), amount, month YYYY-MM or effective_date YYYY-MM-DD (then the payroll month it falls in, after the cut-off the next one), description, off_cycle (then paid_cash, deduct_tax, amount_type total|net, mark_paid), extra_salary, is_net. action update_transaction: transaction_id and the same fields (an unpaid transaction added by HR). action delete_transaction: transaction_id (its month must be open). action add_loan: fields employee_id, loan_type_id, amount, currency (ISO code, default the company currency; payroll deducts each installment converted with the exchange rate of its month), installments or installment_amount, effective_date, first_installment_date (or start_month YYYY-MM), reason (notes), payout off_cycle|payroll. action delete_loan: loan_id (no repayments yet). action loan_details: loan_id (the loan with its installment schedule: id, position, amount, due_date, status unpaid|paid|skipped, cash, in_payroll, payroll_amount and exchange_rate in the payroll currency). action skip_installment / pay_installment_cash: loan_id, installment_id (an unpaid installment not in a payroll; a skipped one moves to the end). action reschedule_loan: loan_id; fields installment_amount or number_of_payments (what is still owed, from the first unpaid installment). action add_salary_package: employee_id; fields effective_on, basic_salary, salary_count (12-16), currency, ss_salary, company_bank_account_id, tax_number, ss_number, gl_account, notes, items[] {kind allowance|deduction|company_expense, transaction_type_id or name_en/name_ar, amount}. action withdraw_salary_package: employee_id, package_id (not started yet). action stop_salary (fields reason) and resume_salary: employee_id. Attachments go through the API or the screen. action bulk_delete_transactions: ids (unpaid regular-payroll transactions; off-cycle and approved months are skipped). action next_month: transaction_id moves to the next payroll month. action settle_off_cycle: ids of unpaid off-cycle transactions marked paid.
Argument Type Description company_idrequiredinteger actionrequiredstring
add_transaction | update_transaction | delete_transaction | bulk_delete_transactions | next_month | settle_off_cycle | add_loan | delete_loan | loan_details | skip_installment | pay_installment_cash | reschedule_loan | add_salary_package | withdraw_salary_package | stop_salary | resume_salaryemployee_idinteger transaction_idinteger loan_idinteger installment_idinteger package_idinteger idsarray fieldsobject -
manage_goalschanges data Goals. action add: fields title, description, due_date, and employee_ids (performance.manage over th...Goals. action add: fields title, description, due_date, and employee_ids (performance.manage over them; default: myself). action update: goal_id, fields progress 0–100, status open|achieved|missed (the owner or HR). action delete: goal_id (whoever set it, or HR).
Argument Type Description company_idrequiredinteger actionrequiredstring
add | update | deletegoal_idinteger fieldsobject -
manage_insurancechanges data Medical insurance (HR module), the same rules as the screen. action create_policy / update_policy (p...Medical insurance (HR module), the same rules as the screen. action create_policy / update_policy (policy_id) (payroll_setup.manage): fields insurer, policy_number, start_date, expiry_date (after the start), cost_adult, cost_minor, currency_adult, currency_minor, branch_id (empty = all branches), pro_rata, per_employee. action delete_policy (payroll_setup.manage): policy_id. action add_member (payroll.manage, employee in my scope): policy_id; fields employee_id, family_member_id (one of the employee's family, empty = the employee), offline_insurance_id, start_date, end_date, adult_dependents, minor_dependents, custom_setup with custom_cost, monthly_deduction; the same owner again updates their row. action remove_member (payroll.manage): member_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
create_policy | update_policy | delete_policy | add_member | remove_memberpolicy_idinteger member_idinteger fieldsobject -
manage_inventorychanges data FSM inventory (docs/fsm-sections.md), as field/inventory/*, with the same permissions. Reading (fiel...FSM inventory (docs/fsm-sections.md), as field/inventory/*, with the same permissions. Reading (field.inventory.view or .manage): list_parts (filters: q, category, low, active, branch_id, per_page), get_part (id), list_locations, get_location (id), list_movements (filters: part_id, location_id, job_id, type, from, to), job_parts (job_id). export_parts and export_movements (field.inventory.export; headers and rows). Parts: save_part (.create, or .edit with id; fields sku, name, category, unit, unit_cost, supplier, min_stock, notes, active, branch_id), delete_part (.delete). Locations (.locations): save_location (fields name, kind of warehouse, van, site, address, active, branch_id), delete_location. Stock on part id: receive (.receive; fields location_id, quantity, reference, note), adjust (.adjust; location_id, counted, note), transfer (.transfer; from_location_id, to_location_id, quantity, note), issue (.issue; location_id, job_id, quantity, employee_id, note), return (.issue; location_id, job_id, quantity, note).
Argument Type Description company_idrequiredinteger actionrequiredstring
list_parts | get_part | list_locations | get_location | list_movements | job_parts | export_parts | export_movements | save_part | delete_part | save_location | delete_location | receive | adjust | transfer | issue | returnidinteger job_idinteger filtersobject fieldsobject branchstring -
manage_leave_balanceschanges data Leave balances of the employees your role reaches. action balances (leaves.view): employee_id, year...Leave balances of the employees your role reaches. action balances (leaves.view): employee_id, year or as_of. Each action needs its own permission, and leaves.manage grants them all: add_leave (leaves.manage) (approved leave for an employee: employee_id, leave_type_id, start_date, end_date or start_time and end_time, reason), adjust (leaves.adjustments.manage: employee_id, leave_type_id, year, days (+/-), reason), delete_adjustment (adjustment_id; leaves.adjustments.manage, or leaves.moved_balances.manage for a moved balance), move (leaves.moved_balances.manage: leave_type_id, year, max_days; the whole company), set_setup (leaves.balance_corrections.manage: (employee_id, leave_type_id, entitlement_days, open_balance, carry_balance, balance_year, active; reset true for the company setup), apply_type (leaves.balance_corrections.manage: leave_type_id to employee_ids or everyone, with entitlement_days and open_balance), encashments (leaves.encashments.view: year, default this year; the encashments of the employees in scope), encash (leaves.encashments.manage: employee_id, leave_type_id, days, notes), cancel_encashment (leaves.encashments.manage: encashment_id). action balance_breakdown (leaves.view; employee_id, leave_type_id): ZenHR's Show balance, each year split into opening, previous, adjustments, encashed, hourly, total, used, pending, remaining.
Argument Type Description company_idrequiredinteger to_leave_type_idinteger actionrequiredstring
balances | balance_breakdown | encashments | add_leave | adjust | delete_adjustment | move | set_setup | apply_type | encash | cancel_encashment | cancel_future | deactivate_moveemployee_idinteger employee_idsarray leave_type_idinteger yearinteger as_ofstring daysnumber reasonstring max_daysnumber start_datestring end_datestring start_timestring end_timestring entitlement_daysnumber open_balancenumber carry_balancenumber balance_yearinteger activeboolean resetboolean notesstring adjustment_idinteger encashment_idinteger -
manage_miscellaneous_requestschanges data ZenHR's "Manage Miscellaneous Requests". action list (default): the miscellaneous (general) requests...ZenHR's "Manage Miscellaneous Requests". action list (default): the miscellaneous (general) requests of the employees in your requests.miscellaneous.view scope (or requests.view / requests.manage), filtered by miscellaneous_type_id, status (pending, approved, rejected, cancelled), employee_id, active (active (default), inactive, all), from/to (effective date) and q; each row has the serial number, employment number, employee, transaction name, effective date, status and whether the employee is active. action update (requests.miscellaneous.manage or requests.manage, request_id): change miscellaneous_type_id, subject, effective_date, end_date, details or fields {field id: value}. action delete (requests.miscellaneous.manage or requests.manage, request_id): delete the request and its trail.
Argument Type Description company_idrequiredinteger actionstring
list | update | deleterequest_idinteger miscellaneous_type_idinteger statusstring
pending | approved | rejected | cancelledemployee_idinteger activestring
active | inactive | allfromstring tostring qstring pageinteger per_pageinteger end_datestring subjectstring effective_datestring detailsstring fieldsobject -
manage_my_connected_appcan delete Disconnect one of the signed-in person's own AI apps (kind oauth) or revoke one of their access toke...Disconnect one of the signed-in person's own AI apps (kind oauth) or revoke one of their access tokens (kind token): id and kind from list_my_connected_apps. Anything using it stops at once; if it is the app making this call, this connection ends too. Confirm first. docs/ai-integrations.md.
Argument Type Description idrequiredinteger kindrequiredstring
oauth | token -
manage_my_dashboardschanges data The person's own dashboards (docs/dashboards.md): tabs of widgets on top of the fixed dashboards, ea...The person's own dashboards (docs/dashboards.md): tabs of widgets on top of the fixed dashboards, each showing one figure the person may see. action metrics: what can be added. action list: their dashboards (the first time, ZenHR's "Default Dashboard" is made for them with its stock widgets they may see; is_default marks it). action show: dashboard_id with every widget's figure. action create: name {en, ar}. action rename: dashboard_id, name. action delete: dashboard_id. action add_widget: dashboard_id, metric, title {en, ar}, chart, width 1–4 (quarters). action update_widget: widget_id with title, chart, width. action remove_widget: widget_id. action reorder: dashboard_id, ids (widget ids in order). action set_interval: dashboard_id, interval (1–6 for every widget whose report offers it, 0 for each widget's own). action order_dashboards: ids (the person's dashboard ids in order). action home_widgets: the HR dashboard Home Page widgets the person may see (the widget registry, config/dashboard-widgets.php), in their order, with width, shown and the permission each needs; a widget without its permission is never listed. action save_home_widgets: order [keys], show [keys] (the rest hidden) and widths {key: 1–4}, each optional. action home_sections / save_home_sections (show [keys]): the older form, which widgets show. A Command Center report widget (Mawarid's ZenHR Command Center, employees.view): metric report with report_type (approved_leaves, approved_vacations, contract_expiry, document_expiry, termination_reasons, end_of_probation, headcount, joiners_leavers, overtime_hours, pending_tasks, retention_rate, turnover), breakdown for headcount (age_group, gender, nationality, service_period, work_type), level (company, branch, work_location, department, section, group, project, job_role) with unit_ids, interval (1 Today, 2 7D, 3 30D, 4 3M, 5 6M, 6 12M, as the report offers), upcoming, options (the report's extra field, e.g. leave_type_id, document_type_id, termination_category, overtime_type, task_kind; company_documents for document_expiry) and chart (numbers, stacked, bar, line, area, donut, pie, as the shape allows).
Argument Type Description company_idrequiredinteger actionrequiredstring
metrics | list | show | create | rename | delete | add_widget | update_widget | remove_widget | reorder | set_interval | order_dashboards | home_sections | save_home_sections | home_widgets | save_home_widgetsdashboard_idinteger widget_idinteger nameobject metricstring
headcount | joined_this_month | employees_by_department | on_leave_today | pending_leaves | leave_days_by_type | attendance_rate | waiting_on_me | upcoming_holidays | attendance_trend | most_late | payroll_trend | active_loans | payroll_cost | loans_outstanding | assets_by_status | assets_expiring | performance_completion | performance_average | performance_overdue | performance_stages | performance_distribution | performance_by_department | performance_top | goal_progress | field_jobs_today | my_leave_remaining | my_net_salary | unread_notifications | reporttitleobject chartstring widthinteger idsarray report_typestring
approved_leaves | approved_vacations | contract_expiry | document_expiry | termination_reasons | end_of_probation | headcount | joiners_leavers | overtime_hours | pending_tasks | retention_rate | turnover | loans | net_salaries | overtime_paybreakdownstring
none | age_group | gender | nationality | service_period | work_typelevelstring
company | branch | work_location | department | section | group | project | job_roleunit_idsarray intervalinteger upcomingboolean optionsobject showarray orderarray widthsobject -
manage_my_list_columnschanges data Show / hide columns of a list for the signed-in user (saved on the account, same on every device). L...Show / hide columns of a list for the signed-in user (saved on the account, same on every device). Lists: salaries, salary_batches, transactions, transactions_off_cycle, overtimes, loans, and requests.<type> for My Requests per request type. action get: one list (list) or all, with each column's key, label and visible. action set: list and hidden (column keys to hide; empty shows them all).
Argument Type Description actionrequiredstring
get | setliststring A list key, e.g. salaries or requests.leave. hiddenarray Column keys to hide (action set). -
manage_my_notificationschanges data The person's own notices and channels (docs/notifications.md). action read: mark notice_id read (unr...The person's own notices and channels (docs/notifications.md). action read: mark notice_id read (unread true to mark it unread). action read_all: mark every notice read. action preferences: their channels per category (in_app, email, whatsapp). action save_preferences: categories {category: {in_app, email, whatsapp}}; sign-in alerts always stay in the bell, and WhatsApp needs a mobile number on the profile.
Argument Type Description company_idrequiredinteger actionrequiredstring
read | read_all | preferences | save_preferencesnotice_idinteger unreadboolean categoriesobject -
manage_my_push_tokenschanges data The phones the signed-in person gets push notices on through the Mihnaro mobile app (docs/mobile-app...The phones the signed-in person gets push notices on through the Mihnaro mobile app (docs/mobile-app.md). action list: the phones (tokens shortened, provider fcm | apns | expo, active, disabled_reason). action register: token (the phone's native FCM registration token or APNs device token; Expo tokens are refused), platform (ios or android), provider (fcm or apns, defaults from the platform), device_name, apns_environment (production or sandbox, which of Apple's servers this build uses, if known). action forget: token, to stop pushes to that phone. Notices that reach the bell are pushed straight to Google/Apple for every active phone.
Argument Type Description actionrequiredstring
list | register | forgettokenstring platformstring
ios | androidproviderstring
fcm | apnsdevice_namestring apns_environmentstring
production | sandbox -
manage_my_system_announcementschanges data Messages from the Mihnaro team for the signed-in person (docs/platform-control.md). action list: the...Messages from the Mihnaro team for the signed-in person (docs/platform-control.md). action list: the ones still open on a channel (web or app, default web), in the person's language. action dismiss: close one (id) that may be dismissed. action acknowledge: confirm reading one (id) that must be acknowledged.
Argument Type Description actionrequiredstring
list | dismiss | acknowledgeidinteger channelstring
web | app -
manage_nine_boxchanges data The 9-box grid (performance × potential, docs/succession.md). action grid (performance.view or .mana...The 9-box grid (performance × potential, docs/succession.md). action grid (performance.view or .manage, their scope): filters cycle_id, branch_id, department_id, position_id, box (1–9; 1 low/low, 9 high/high) → each box with its employees, and those not placed yet. action history: employee_id → their box in each cycle and their potential assessments. action assess (performance.manage over the employee, or their direct manager): fields employee_id, rating (low|medium|high), criteria {learning_agility, leadership, drive, adaptability, aspiration: 1–5}, notes, evaluation_cycle_id, assessed_on. action delete_assessment: assessment_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
grid | history | assess | delete_assessmentcycle_idinteger branch_idinteger department_idinteger position_idinteger boxinteger employee_idinteger assessment_idinteger fieldsobject -
manage_notification_setupchanges data The company's Notifications setup (notifications.manage, docs/notifications.md). Without save: categ...The company's Notifications setup (notifications.manage, docs/notifications.md). Without save: categories_off, receiver_emails, the reminders and document_notice (each expiring document type with its notify_before period). save true with any of: categories_off (list of categories no one is told about; security can't be off), receiver_emails (list, copies of employee-record reminders), reminders {key: value}: switches rem_contract_on, rem_probation_on, rem_documents, rem_anniversary, rem_anniversary_employee, rem_birthday, rem_birthday_greetings, punch_alerts_on (true/false); days rem_contract_hr_days, rem_contract_manager_days, rem_contract_employee_days, rem_probation_hr_days, rem_probation_manager_days, rem_probation_employee_days, rem_documents_hr_days, rem_documents_manager_days, rem_documents_employee_days, rem_anniversary_hr_days, rem_anniversary_manager_days, rem_birthday_hr_days (0–365, null = not told); minutes punch_alert_employee, punch_alert_manager, punch_alert_hr (0–2880).
Argument Type Description company_idrequiredinteger saveboolean categories_offarray receiver_emailsarray remindersobject document_noticeobject Per document type that expires, how long before expiry HR is told: {"type id": "week|2_weeks|month|2_months|3_months|6_months"} (ZenHR's list). email_everyoneboolean Also send every notice by email to everyone who has an email. -
manage_okrschanges data An employee's OKRs in a cycle, for their OKR writer, OKR auditors, result writer or performance.mana...An employee's OKRs in a cycle, for their OKR writer, OKR auditors, result writer or performance.manage over them, while unpublished. action save_objective: evaluation_id (new) or objective_id (change), fields name {en, ar}, description {en, ar}, weight, key_results [{name {en, ar}, weight, measurement_unit_id, target}] (weights make 100). action delete_objective: objective_id. action publish: evaluation_id (objectives must make 100%). action mass_assign: template_id (OKR template), fields.evaluations (ids).
Argument Type Description company_idrequiredinteger actionrequiredstring
save_objective | delete_objective | publish | mass_assignevaluation_idinteger objective_idinteger template_idinteger fieldsobject -
manage_overtimeschanges data Manage Overtimes for employees in my payroll scope (payroll.overtime.manage, which payroll.manage gr...Manage Overtimes for employees in my payroll scope (payroll.overtime.manage, which payroll.manage grants). action add: fields employee_id, overtime_type_id, date (YYYY-MM-DD, not in the future), from_time and till_time (HH:MM) or hours, reason; it is approved at once and paid with the open payroll month. action update: overtime_id, the same fields without employee_id (refused once paid in an approved payroll or converted to time off). action convert_to_time_off (ZenHR's Overtime Converter): fields from, to, leave_type_id, rate (% of the hours), effective_date, minimum_hours, combined, notes, optional department, work_location, section, main_project; approved, unconverted overtime not yet in an approved payroll becomes leave balance (off until legally validated). action batch_as_income: fields employee_id, transaction_type_id (an earning type), overtime_type_id, hours, date, description: hours × the employee's overtime rate as an earning in the open payroll month. GET /overtimes on the API lists them.
Argument Type Description company_idrequiredinteger actionrequiredstring
add | update | convert_to_time_off | batch_as_incomeovertime_idinteger fieldsobject -
manage_part_timechanges data Part-time transactions for employees in my payroll scope (payroll.manage). action add: fields employ...Part-time transactions for employees in my payroll scope (payroll.manage). action add: fields employee_id, transaction_type_id (a part-time transaction type), amount (else the type's default amount, times recurring_value when given; required when it has none), recurring_value (ZenHR's "Recurring": the number of units), net (true: the amount is net and grossed up for tax), effective_date, end_date (optional), recurring true (paid every month from the date) or false (once), note. action update: assignment_id and the same fields without employee_id. action delete: assignment_id. list_payroll_costs kind part_time lists them.
Argument Type Description company_idrequiredinteger actionrequiredstring
add | update | deleteassignment_idinteger fieldsobject -
manage_payroll_runchanges data Payroll runs (payroll.manage). action calculate: Manage salaries → Calculate (fields salary_type mon...Payroll runs (payroll.manage). action calculate: Manage salaries → Calculate (fields salary_type monthly|extra, month YYYY-MM, picks[] from list_payroll_costs kind calculate_options: branch:<id>, employee:<id>, org:<id>, anyone matching one is calculated, none = everyone not paid yet; monthly: period_from / period_to YYYY-MM-DD (default: the cut-off range), batch_id to add to a draft batch of the month instead of a new one, move_pending true to move this month's transactions dated after period_to to next month; extra: title, percent_of_basic). action run: calculate a month (fields month YYYY-MM; optional batch departments[], branches[], employees[] ids). action off_cycle: an extra payment (fields title, month, percent_of_basic). action recalculate, approve (approved at once, or sent through the salary batch approval chain: result approved or sent), paid (fields paid_at, payment_reference) and delete (a draft) take run_id. action adjust: a one-off amount on a draft payslip (payslip_id; fields adjustment, note). action remove_employee: Delete on a salary row, takes the employee of payslip_id out of draft run_id (recalculating leaves them out). action revert_check: whether approved run_id can go back to draft (can_revert, blockers). action revert: Revert to draft, undoing what approving did (installments unpaid, loans active again, provisions as before); refused while blockers exist (fields reason). action settlement_candidates: leavers in scope whose leaving month has no slip yet (employee_id, employee_number, employee_name, terminated_on, month). action off_cycle_settlement: ZenHR's Off-Cycle Settlement slip, the leaver's final settlement worked out on its own as a draft one-person batch of the leaving month (fields employee_id; refused when the month already has their slip); approve it with action approve.
Argument Type Description company_idrequiredinteger actionrequiredstring
calculate | run | off_cycle | recalculate | approve | paid | delete | adjust | remove_employee | revert_check | revert | settlement_candidates | off_cycle_settlementrun_idinteger payslip_idinteger fieldsobject -
manage_payroll_setupchanges data Change payroll setup (payroll_setup.manage), the same as the screens. action update_settings: sectio...Change payroll setup (payroll_setup.manage), the same as the screens. action update_settings: section payroll_setup | in_advance | extra_salaries | tax_setup | journal | provision_setup, fields = only the settings to change (names and value shapes as list_payroll_setup kind settings gives them; the others keep their values; e.g. journal fields je_type summary|detailed, je_match_levels[], acct_* codes; extra_salaries es_reimburse_type_id is required when es_reimburse_tax is on). action add_rule / update_rule (id) / delete_rule (id): section social-security (name_en, name_ar, employee_percent, employer_percent, salary_from, salary_to, floor (ZenHR minimum salary: the least SS wage charged), ceiling, base basic|gross, min_work_days, effective_from, effective_to, active, external_ref), tax (name_en, name_ar, effective_from, effective_to, bracket_rows [{min, max, rate, extra_exemption}] with bracket_period monthly|annual, or brackets "from:rate" per line, personal_exemption, family_exemption, other_exemption, notes, external_ref), extra-salaries (name_en, name_ar, percent, base basic|gross, distribution once|monthly, pay_month 1-12, prorate, taxable, in_final_settlement, active), bank-accounts (bank_name, account_number, iban, bank_branch, account_name, country, currency, exchange_account, establishment_number, branch_id, bank_export_template_id, is_default), bank-templates (name_en, name_ar, kind, bank, extension, delimiter, header_lines, footer_lines, columns_text "field|Header" per line, date_format, amount_decimals, include_header, active) or slip-templates (slip_type, language, header, footer); update_rule takes the whole record (a switch left out is off); an item in use can't be deleted. action update_ss_salaries: fields.base basic|gross sets the SS salary of the active employees in my payroll.manage scope.
Argument Type Description company_idrequiredinteger actionrequiredstring
update_settings | add_rule | update_rule | delete_rule | update_ss_salariessectionstring
payroll_setup | in_advance | extra_salaries | tax_setup | journal | provision_setup | social-security | tax | extra-salaries | bank-accounts | bank-templates | slip-templatesidinteger fieldsobject -
manage_performance_setupchanges data Performance setup. action list (performance.view/manage/setup): kind evaluation-templates, general-f...Performance setup. action list (performance.view/manage/setup): kind evaluation-templates, general-factor-templates, okr-templates, rating-types, categories, levels, competencies or position-competencies. The rest need performance_setup.manage; id changes an existing record. save_template (fields as on the template form: name {en, ar}, period, result_format, branch_ids, self_assessment, max_okrs, general_factor_template_id, okrs_creator, okr_auditors [supervisor|manager_1|manager_2|key_staff], result_writer, result_auditors [same], self_assessment_stage, okr_followup, evaluate_based_on objectives|key_results, factors {okrs|general_factors|competencies: {active, weight}}, scales [{name, min, max}], active), delete_template, add_criterion (id = template; title {en, ar}, weight, kind factor|okr, target, measurement_unit_id), delete_criterion, save_factor_template (name, branch_ids, factors [{name, weight}]), delete_factor_template, save_okr_template (name), delete_okr_template, save_template_objective (id = OKR template, index to replace; the objective fields), delete_template_objective (id, index), save_rating_type (name, units [{id?, name}]), delete_rating_type, save_category (name, levels, linked_to_position), save_level (name, rank), save_competency (name, description, competency_category_id), delete_category, delete_level, delete_competency, link_position (position_id, competency_id, required_level, weight), unlink_position. action rate_competency (performance.manage or the line manager): employee_id, competency_id, level.
Argument Type Description company_idrequiredinteger actionrequiredstring kindstring idinteger indexinteger fieldsobject -
manage_project_contributionschanges data Per-project contribution percentages of an employee in my payroll scope (docs/payroll-project-contri...Per-project contribution percentages of an employee in my payroll scope (docs/payroll-project-contributions.md), as GET/PUT /employees/{id}/project-contributions. action get (payroll.view or payroll.manage): employee_id, optional month YYYY-MM; returns total, complete (adds up to 100) and projects[] {assignment_id, project_id, project, code, contribution_percent, hours (approved timesheet hours that month), hours_share (% of the month's hours)}. action set (payroll.manage): employee_id, projects[] {project_id, contribution_percent} for the projects the employee is assigned to, adding up to exactly 100 (a project left out gets 0). The Calculated Costs report by project and the Project Summary report split salaries by these.
Argument Type Description company_idrequiredinteger actionrequiredstring
get | setemployee_idrequiredinteger monthstring YYYY-MM projectsarray -
manage_provisionschanges data Monthly provisions (payroll.manage), the same as the screen. action calculate: month YYYY-MM, or fro...Monthly provisions (payroll.manage), the same as the screen. action calculate: month YYYY-MM, or from + to (YYYY-MM, up to 24 months, worked out oldest first), for every employee or only those picked by any of employee_ids, job_role_ids, department_ids, work_location_ids, section_ids, project_ids, hierarchy_group_ids, business_unit_ids, division_ids, segment_ids (id lists), work_type and contract_type (limited | unlimited); follows provision setup and replaces what those months had for them; gives the number of employees. action delete_month: month, deletes that month's provisions of the employees in my payroll.manage scope. action bulk_delete: ids (provision row ids); only an employee's latest month can go, so deleted can be less than chosen. Provision setup is manage_payroll_setup update_settings section provision_setup.
Argument Type Description company_idrequiredinteger actionrequiredstring
calculate | delete_month | bulk_deletemonthstring YYYY-MM fromstring YYYY-MM tostring YYYY-MM work_typestring
full_time | part_time | freelance | internship | contractorcontract_typestring
limited | unlimitedidsarray employee_idsarray job_role_idsarray work_location_idsarray department_idsarray section_idsarray project_idsarray hierarchy_group_idsarray business_unit_idsarray division_idsarray segment_idsarray -
manage_recruitmentcan delete Recruitment (recruitment.manage). action save_job: post a job opening, or change one with job_id: fi...Recruitment (recruitment.manage). action save_job: post a job opening, or change one with job_id: fields title {en, ar}, department_id, branch_id, position_id, employment_type (full_time, part_time, contract, internship), description, requirements, positions, closing_date, status (draft, open, closed). action delete_job: an opening nobody was hired from. action add_candidate (job_id): fields name, email, phone, source (careers_page, referral, linkedin, job_board, other), cover_note. action update_candidate (candidate_id): fields stage (not hired), rejection_reason, rating 1–5. action delete_candidate. action add_note (candidate_id): fields body. action schedule_interview (candidate_id): fields interviewer_id (an employee), panel_ids, scheduled_at, kind (onsite, video, phone), duration_minutes, location, video_provider (zoom, google_meet, teams, manual), video_link; the candidate gets an invitation with an .ics. action update_interview (interview_id): fields status (scheduled, done, cancelled), rating, feedback. action hire (candidate_id): creates the employee record (needs employees.manage); fields employee_number, hire_date, branch_id, department_id, position_id, manager_id, basic_salary, create_login. action careers: fields enabled true/false turns the public careers page on or off. CV uploads go through the API or the screen.
Argument Type Description company_idrequiredinteger actionrequiredstring
save_job | delete_job | add_candidate | update_candidate | delete_candidate | add_note | schedule_interview | update_interview | hire | careersjob_idinteger candidate_idinteger interview_idinteger fieldsobject -
manage_recruitment_atscan delete Applicant tracking (recruitment.manage unless noted), with fields in `fields`. Pipeline: move (candi...Applicant tracking (recruitment.manage unless noted), with fields in `fields`. Pipeline: move (candidate_id; stage, reason), bulk (ids, action move/reject/tag/untag/pool/unpool/email/delete, stage, reason, tags, template), profile (candidate_id; tags, in_talent_pool, linkedin_url), email (candidate_id; template = a stage), pool_add (name, email, phone, linkedin_url, tags, source, cover_note), add_to_job (candidate_id; job_opening_id). AI (only when the platform has a key and the company turned AI on; candidate data needs the company's consent): ai_parse (candidate_id), ai_match (candidate_id), ai_rank (job_id; refresh), ai_questions (job_id; count), ai_draft (title, department, employment_type, notes). LinkedIn: linkedin (job_id): posts to the connected page or returns the share link. Interviews: booking_link (candidate_id; interviewer_id, panel_ids, kind, duration_minutes, location, video_provider, video_link, booking_from, booking_to), availability (employee_id; windows [{weekday 0-6, starts_at, ends_at}]), scorecard (interview_id; your own as a panel member: ratings [{criterion, rating}], overall, recommendation strong_yes/yes/no/strong_no, notes). Offers: offer_draft (candidate_id; offer_template_id, salary_package_id, job_title, start_date, basic_salary, currency, items, expires_on, language), offer_update (offer_id), offer_submit, offer_send, offer_withdraw (offer_id), offer_decide (offer_id; decision approve/reject, note; needs recruitment.approve_offers), offer_convert (offer_id; employee_number, branch_id, department_id, boarding_template_id; needs employees.manage). Assessments: send_assessment (candidate_id; assessment_id, due_date Y-m-d, pass_stage, fail_stage, locale): sends a test link by the "Assessment" email, with an optional gate that moves the candidate on a pass or a fail; stage_assessments (fields {stage: {assessment_test_id (null removes), auto_send, pass_stage, fail_stage, due_days}}): the test a stage sends when a candidate enters it. Setup: email_template (stage, or "assessment" for the test link email with {test_name} {assessment_link} {due_date} {time_limit}; subject, body, auto_send), offer_template (template_id to change; name, body, active), offer_template_delete (template_id), settings (ai_enabled, ai_candidate_data, ai_auto_parse, recruitment_email_language).
Argument Type Description company_idrequiredinteger actionrequiredstring
move | bulk | profile | email | pool_add | add_to_job | ai_parse | ai_match | ai_rank | ai_questions | ai_draft | linkedin | booking_link | availability | scorecard | offer_draft | offer_update | offer_submit | offer_send | offer_withdraw | offer_decide | offer_convert | send_assessment | stage_assessments | email_template | offer_template | offer_template_delete | settingscandidate_idinteger job_idinteger offer_idinteger interview_idinteger employee_idinteger template_idinteger stagestring
applied | screening | interview | offer | hired | rejected | assessmentfieldsobject -
manage_salary_package_templateschanges data Salary package templates (ZenHR Salary Package Templates, payroll.manage), the same rules as the scr...Salary package templates (ZenHR Salary Package Templates, payroll.manage), the same rules as the screen. action create: fields name_en, name_ar, basic_salary, active (default true), external_ref (the ZenHR id). action update (template_id): only the fields to change. action delete (template_id). action add_item (template_id): fields type allowance|deduction, transaction_type_id or name_en/name_ar, amount. action remove_item (template_id, item_id). An inactive template isn't offered when applying a template to an employee. list_payroll kind templates lists them.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | update | delete | add_item | remove_itemtemplate_idinteger item_idinteger fieldsobject -
manage_salary_scaleschanges data Salary scales (HR module), the same rules as the screen. Setup actions need payroll_setup.manage. ac...Salary scales (HR module), the same rules as the screen. Setup actions need payroll_setup.manage. action create_scale / update_scale (scale_id): fields name_en, name_ar, has_grades, has_bands, has_levels (at least one), salary_range_layer, benefits_layer, timeoffs_layer (grade|band|level, a layer the scale has), exceed_range_percent, exceed_benefits_percent, compa_from, compa_to, activation_date YYYY-MM-DD, status active|inactive|draft, auto_move_vacations. action delete_scale: scale_id (refused while an employee sits on it). action add_layer / update_layer (layer_id): scale_id, layer grade|band|level; fields name_en, name_ar, scale_grade_id (band, level), scale_band_id (level), min_salary, mid_salary, max_salary, entitled_to_overtime, and id lists job_role, loan_type, air_ticket_policy, insurance_policy, annual_leave, sick_leave (a list sent replaces the old one), allowances [{transaction_type_id, amount}]. action delete_layer: scale_id, layer, layer_id (refused while in use). action update_job_grade: grade_id; fields ideal_compa_ratio (0.5-1.5), benefits, leave {leave_type_id: days}. action add_job_grade_level: grade_id; fields name_en, name_ar, rank, salary. action delete_job_grade_level: level_id. action set_enforcement: fields salary_scale_enforce off|block. action place_employee (payroll.manage, employee in my scope): employee_id; fields scale_level_id, scale_band_id, scale_grade_id (all empty = off the scale); returns a warning when the salary is outside an enforced range.
Argument Type Description company_idrequiredinteger actionrequiredstring
create_scale | update_scale | delete_scale | add_layer | update_layer | delete_layer | update_job_grade | add_job_grade_level | delete_job_grade_level | set_enforcement | place_employeescale_idinteger layerstring
grade | band | levellayer_idinteger grade_idinteger A job grade (job grades screen). level_idinteger A job grade level. employee_idinteger fieldsobject -
manage_saved_reportcan delete The person's saved report options ("Save selected options"), as POST /reports/{report}/saved and DEL...The person's saved report options ("Save selected options"), as POST /reports/{report}/saved and DELETE /saved-reports/{id}. action save: report (key), name, options (the run_report filters, cols, show); the same name replaces. action delete: id. Run saved options with run_report and saved_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | deletereportstring namestring optionsobject idinteger -
manage_slackchanges data The company's Slack channel (integrations.slack.manage, which integrations.manage grants; docs/integ...The company's Slack channel (integrations.slack.manage, which integrations.manage grants; docs/integrations.md): a readable line is posted there for the webhook events chosen. action show: connected or not, and the events (the webhook address is a secret and is never returned). action save: fields webhook_url (a Slack incoming webhook, https://hooks.slack.com/…; empty keeps the current one), events (see list_integrations kind events), disconnect, test (post a test line now; the answer has Slack's test_status).
Argument Type Description company_idrequiredinteger actionrequiredstring
show | savefieldsobject -
manage_stb_encashmentschanges data End-of-service benefit encashments (HR module), the same rules as the screen. action create (payroll...End-of-service benefit encashments (HR module), the same rules as the screen. action create (payroll.stb_encashments.manage, which payroll.manage grants; employee in my scope): fields employee_id, amount (at most what list_stb_encashments kind available allows), payment payroll|off_cycle, notes; it adds an earning to the open payroll month (paid now when off_cycle). action delete (payroll.manage): encashment_id, while its payroll month is not approved and it was not paid off-cycle. action settings (payroll_setup.manage): fields = only the settings to change (the others keep their values): stb_encash_enabled, stb_encash_max_percent (0-100), stb_encash_min_years, stb_encash_every_years, stb_encash_min_amount, stb_encash_max_amount, stb_encash_after_months (after the hiring date), stb_encash_times per stb_encash_per_years, stb_encash_eligible all|citizens|non_citizens, stb_encash_attachments_required, stb_encash_notes_required, stb_encash_requestable, stb_encash_default_payment payroll|off_cycle, stb_encash_limited_policy_id / stb_encash_unlimited_policy_id (STB policy ids), stb_encash_income_name_en/_ar, stb_encash_deduction_name_en/_ar. create also takes external_ref (the ZenHR id); payment defaults to stb_encash_default_payment.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | delete | settingsencashment_idinteger fieldsobject -
manage_successionchanges data Succession planning (succession.manage, limited to its scope). action list: key positions with succe...Succession planning (succession.manage, limited to its scope). action list: key positions with successors and whether each is critical (high risk, high impact, nobody ready now). action save: key_position_id to change, fields title {en, ar}, position_id, department_id, holder_id, risk_of_loss and impact (low|medium|high), notes. action delete: key_position_id. action add_successor: key_position_id, fields employee_id, readiness (ready_now|one_two_years|three_plus_years), development_plan. action remove_successor: successor_id.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | save | delete | add_successor | remove_successorkey_position_idinteger successor_idinteger fieldsobject -
manage_suspensionchanges data Employee suspensions (docs/discipline.md). HR (discipline.manage over the employee) acts at once; a...Employee suspensions (docs/discipline.md). HR (discipline.manage over the employee) acts at once; a manager up the employee's line asks, and the request follows the "Employee Suspensions & Resumptions" approval chain (HR without one). action create (fields employee_id, start_date, end_date, paid, suspension_reason_id, reason: notes, required unless the reason says otherwise). With suspension_id: decide (fields decision approve|reject, for the step it waits on), withdraw, resume (fields resumption_notes: come back early; HR's is approved at once), decide_resumption (decision), withdraw_resumption, cancel (HR at once, a manager asks), decide_cancel (decision, HR), cancel_resumption, decide_cancel_resumption (decision, HR), delete (HR, for one entered by mistake). Attachments go through the API or the screen.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | decide | withdraw | resume | decide_resumption | withdraw_resumption | cancel | decide_cancel | cancel_resumption | decide_cancel_resumption | deletesuspension_idinteger fieldsobject -
manage_taskchanges data Tasks. action assign: fields kind (custom, document_upload, document_download, give_asset, take_asse...Tasks. action assign: fields kind (custom, document_upload, document_download, give_asset, take_asset, add_bank_account, add_family_member), title, description, due_date, priority (low, normal, high), task_template_id, notes_required, attachments_required (left out, an ordinary custom task starts from the setting of each employee's branch; an explicit value wins), and employee_id (yourself, or anyone in tasks.manage's scope) or assign_mode group with group_dimension and group_value; document_type_id, document_id, asset_type_id, asset_id and target_employee_id for their kinds. action status: fields.status todo, in_progress or done. A give_asset task, once completed, waits (status awaiting_confirmation) until the employee who got the asset runs action confirm_receipt. action complete (the assignee): fields completion_notes, asset_id (give asset), profile {column: value} (complete profile, a workflow task: the columns its profile_fields ask for); files go through the API or the screen. Workflow tasks (docs/boarding.md) in a sequential workflow wait for the earlier ones (locked). action delete: a pending task. action bulk_delete: fields.tasks (ids). action save_template / delete_template (tasks.templates.manage): with template_id, fields title {en, ar}, description, priority, due_in_days, related_to, branch_id (empty: the whole company), steps. steps on assign or a template: a list of {name {en, ar}, photos_allowed, videos_allowed, min_photos, min_videos, max_photos, max_videos}; a template with steps needs tasks.templates.use to assign, its own steps tasks.proof.require. group_dimension my_team: everyone who reports to you. action settings (tasks.proof.settings): the task settings, as GET/PATCH tasks/settings; without values read them, values may set task_default_notes_required, task_default_attachments_required and the task_proof_* switches, branch_id for one branch (null takes a key back to the company).
Argument Type Description company_idrequiredinteger actionrequiredstring
assign | status | complete | confirm_receipt | delete | bulk_delete | save_template | delete_template | settingstask_idinteger template_idinteger fieldsobject valuesobject branch_idinteger -
manage_technicianschanges data FSM technicians (docs/fsm-sections.md), as GET/POST/PATCH/DELETE field/technicians, with the same pe...FSM technicians (docs/fsm-sections.md), as GET/POST/PATCH/DELETE field/technicians, with the same permissions. action list (filters: q, availability, skill, zone, branch_id, per_page; field.technicians.view or .manage), get (id), export (field.technicians.export; returns headers and rows), save (field.technicians.create, or .edit with id; fields: employee_id for a new one, skills, zones, availability of available, busy, off_duty, on_leave, available_until, work_days with 0 = Sunday, day_start, day_end, max_daily_jobs, notes), delete (id; field.technicians.delete).
Argument Type Description company_idrequiredinteger actionrequiredstring
list | get | export | save | deleteidinteger filtersobject fieldsobject branchstring -
manage_tvchanges data Office TV screens (tv.manage). action list: channels, TVs (no tokens) and items. save_channel (chann...Office TV screens (tv.manage). action list: channels, TVs (no tokens) and items. save_channel (channel_id to change): fields name, layout (full, split, quad), areas (one list per area of: today, announcements, birthdays, off_today, coming_up, content (slides and videos), clock, attendance_qr (the TV site's rotating clock-in QR code)), is_default (TVs without a channel show it; one per company), active. delete_channel. save_device (device_id to change): fields name, branch_id, work_location_id (site), tv_channel_id, locale (en, ar, or empty: the link's ?lang); a new TV comes back with its link and token, shown once. rotate_device: a new link and token, once; the old one stops working. delete_device. save_item (item_id to change): fields kind (news, slide, video), title {en, ar}, body {en, ar}, starts_on, ends_on, active; pictures and video files (mp4/webm, within the upload_file_kb limit of company_limits) go through the API or the screen. delete_item.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | save_channel | delete_channel | save_device | rotate_device | delete_device | save_item | delete_itemchannel_idinteger device_idinteger item_idinteger fieldsobject -
manage_vehicleschanges data FSM vehicles (docs/fsm-sections.md), as field/vehicles/*, with the same permissions. Reading (field....FSM vehicles (docs/fsm-sections.md), as field/vehicles/*, with the same permissions. Reading (field.vehicles.view or .manage): list (filters: q, status, driver_id, branch_id, per_page), get (id, with documents and logs), alerts (documents expiring and maintenance due), list_log (id, log of documents, maintenance, fuel). export (field.vehicles.export; headers and rows). save (.create, or .edit or .driver with id; fields plate_number, make, model, year, vin, status of active, maintenance, retired, driver_employee_id, odometer_km, notes, branch_id), delete (.delete). Log lines (field.vehicles.documents, .maintenance or .fuel): save_log (id is the vehicle, log, row_id to change one; documents: type, number, expires_on, note; maintenance: done_on, kind, description, vendor, cost, odometer_km, next_due_on; fuel: filled_on, liters, cost, odometer_km, station, employee_id), delete_log (id, log, row_id).
Argument Type Description company_idrequiredinteger actionrequiredstring
list | get | alerts | list_log | export | save | delete | save_log | delete_logidinteger row_idinteger logstring
documents | maintenance | fuelfiltersobject fieldsobject branchstring -
manage_webhookcan delete Company webhooks (integrations.api_keys.manage, which integrations.manage grants; docs/integrations....Company webhooks (integrations.api_keys.manage, which integrations.manage grants; docs/integrations.md). action create: fields url (public http/https), events (see list_integrations kind events), name, format json or xml, active, group (financial_employee or financial_journal for a financial integration), api_key_id (signs the call with that key's authentication). The signing secret is in the answer ONCE as secret. action update: webhook_id and the fields to change. action delete: webhook_id (its log goes too). action rotate_secret: a new secret, returned once. action test: send a test event now and return the delivery. action resend: delivery_id, send a failed delivery again now.
Argument Type Description company_idrequiredinteger actionrequiredstring
create | update | delete | rotate_secret | test | resendwebhook_idinteger delivery_idinteger fieldsobject -
manage_workflowchanges data Changes workflows (docs/boarding.md); the tasks themselves are completed with manage_task. employees...Changes workflows (docs/boarding.md); the tasks themselves are completed with manage_task. employees.manage over the employee: send (employee_id; fields category onboarding|offboarding, boarding_template_id, and optionally boarding_date, arrive_by, location_name, contact_employee_id, manager_employee_id, description, sequential, tasks [{include, due_days}] in the template's order), mass_onboard (fields boarding_template_id, employee_ids, description, notes), cancel (id). employee_settings.manage: save_template (id to edit, or none to add; fields category, name {en, ar}, description, when_to_send on_date|before, days_to_send, arrive_by, location_name, contact_employee_id, sequential, min_vacation_days, leave_type_id, filters {field: [values]}, resumption_trigger first_punch|employee_request|auto_send, auto_adjust, notify_after_days, notify_user_ids (employee ids told with the employee when resumption tasks are still open), tasks [{kind, title, document_type_id, document_id, asset_type_id, assignee employee|person, assignee_employee_id, due_days, notes, notes_required, attachments_required, profile_fields}]), copy_template (id), delete_template (id).
Argument Type Description company_idrequiredinteger actionrequiredstring
send | mass_onboard | cancel | save_template | copy_template | delete_templateidinteger employee_idinteger fieldsobject -
mark_announcement_readchanges data Marks a company announcement read for you (your notification of it), as opening it on the screen doe...Marks a company announcement read for you (your notification of it), as opening it on the screen does. Only one you may read; another is "not found". Returns how many notifications were marked.
Argument Type Description company_idrequiredinteger announcement_idrequiredinteger -
my_face_consentchanges data The employee's own face consent and presence check (self.face, docs/attendance-security.md §19). act...The employee's own face consent and presence check (self.face, docs/attendance-security.md §19). action get: the consent text, your answer, whether a template exists, and an open presence check. action withdraw: withdraws consent and deletes the template at once. Giving consent and taking the selfie only happen in the mobile app.
Argument Type Description company_idrequiredinteger actionrequiredstring
get | withdraw -
payroll_listschanges data The payroll list screens (docs/payroll.md), read through the API so filters and scope are the same....The payroll list screens (docs/payroll.md), read through the API so filters and scope are the same. action requests (list air-tickets|business-trips|expenses|missing-punches; payroll.view or the list's sub-module, e.g. payroll.expenses.view): requests with details and whether payroll paid them, filters in filters (status, from, to, travel_policy, travel_from, travel_to, expense_name, page). action screening (payroll.view): salary packages screening, filters active_employees, effective_from, effective_to, approval_status, package_status, page. action package (payroll.view): employee_id and package_id with totals and the package before it. action add_amortized (payroll.expenses.manage): fields employee_id, type earning|deduction, amount, months 2-60, start_month YYYY-MM, description.
Argument Type Description company_idrequiredinteger actionrequiredstring
requests | screening | package | add_amortizedliststring
air-tickets | business-trips | expenses | missing-punchesemployee_idinteger package_idinteger filtersobject fieldsobject -
phone_biometric_keyschanges data Phone keys bound to the faces and fingers on the phone (docs/attendance-security.md §19). action lis...Phone keys bound to the faces and fingers on the phone (docs/attendance-security.md §19). action list (attendance.buddy.view; filters employee, status active|broken|awaiting_key|retired). action approve or reset (attendance.device_key.approve; id): after a new face or finger a key is "broken" and that phone follows the company's setting until HR approves it, then the app makes a new key; reset takes a key away for a lost or changed phone. Same API: buddy-punching/keys.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | approve | resetidinteger employeeinteger statusstring -
publish_biometricschanges data Publish biometrics to devices (devices.manage, docs/devices.md). action decide: template_id with dec...Publish biometrics to devices (devices.manage, docs/devices.md). action decide: template_id with decision publish (device_ids to publish only there), source_only or reject. action publish_all_pending: every pending item (optional employee_id, or employee_ids for several people). action auto_publish: read the setting, or set it with on true|false (new biometrics then reach the person's other devices without approval). action publish_slot: template_id to device_id (or every device). action publish_missing: employee_id's approved slots to every device they may use. action remove_slot: template_id off device_id, or out of the master set without device_id; needs confirm true. action update_all: send every approved template, photo and user record again to all devices (optional employee_id); returns a batch. action progress: batch → queued/sent/done/failed per device. action matrix: employee_id's slots × devices.
Argument Type Description company_idrequiredinteger actionrequiredstring
decide | publish_all_pending | auto_publish | publish_slot | publish_missing | remove_slot | update_all | progress | matrixtemplate_idinteger employee_idinteger device_idinteger device_idsarray employee_idsarray onboolean decisionstring
publish | source_only | rejectconfirmboolean batchstring -
queue_reportchanges data Large reports in the background (docs/reports.md), the same as POST /reports/{report}/queue and GET...Large reports in the background (docs/reports.md), the same as POST /reports/{report}/queue and GET /me/report-files. action queue: report (a key from list_reports), format xlsx|csv, filters (as run_report) or saved_id; the file is built as you, in your current branch workspace, and you get a notification when it is ready. action list: your files with status (queued, running, ready, failed), row_count and download_path (GET it with your API token). action show: one file by id.
Argument Type Description company_idrequiredinteger actionrequiredstring
queue | list | showreportstring formatstring
xlsx | csvfiltersobject saved_idinteger idinteger -
read_sectionread only Reads an engine section: part=records (a list, with search, filters, sort, page), record (one, with...Reads an engine section: part=records (a list, with search, filters, sort, page), record (one, with its field_levels and actions), form (a form's starting values), options (choices of a field), blocks (cards and charts), export (the list as CSV text) or file (a record's file, in base64: a copy, so it needs documents.download). A hidden value isn't in the answer. A section under a record needs parent.
Argument Type Description company_idrequiredinteger sectionrequiredstring
employees | employee_contracts | employee_bank_accounts | employee_family | employee_documents | employee_job_history | terminations | attendance_sheet | attendance_records | missing_punches | team_locations | team_leaves | leave_balances | leave_adjustments | employee_shifts | team_schedule | work_shifts | approval_delegations | manage_announcements | manage_events | manage_tasks | manage_letters | disciplinary_actions | suspensions | company_assets | field_jobs | field_sites | field_customers | field_customer_sites | field_technicians | field_parts | field_part_movements | field_stock_locations | field_movements | field_vehicles | field_vehicle_documents | field_vehicle_maintenance | field_vehicle_fuel | field_overtime | evaluation_cycles | cycle_evaluations | goals | key_positions | successors | job_openings | job_candidates | candidates | candidate_notes | candidate_interviews | candidate_offers | my_interviews | offers | assessment_tests | assessment_questions | assessment_invitations | assessment_grading | my_assessments | boardings | boarding_tasks | boarding_templates | employee_checklists | payroll_runs | payroll_run_payslips | payroll_salaries | payroll_packages | payroll_package_templates | payroll_transactions | payroll_settlements | payroll_settlement_slips | payroll_loans | payroll_loan_installments | payroll_overtimes | payroll_insurance | payroll_air_tickets | payroll_provisions | setup_branches | setup_org_units | setup_positions | setup_org_levels | setup_termination_reasons | setup_checklist_templates | setup_shifts | setup_holidays | setup_overtime_types | setup_attendance_functions | setup_leave_types | setup_payroll_general | setup_payroll_advance | setup_payroll_extra_settings | setup_payroll_tax_settings | setup_payroll_social_security | setup_payroll_tax | setup_payroll_extra | setup_payroll_bank_accounts | setup_transaction_types | setup_part_time_transaction_types | setup_loan_types | setup_cost_centers | setup_salary_bands | setup_expense_types | setup_cities | setup_attendance_devices | setup_device_time_zones | setup_roles | setup_roles_assignments | setup_permission_groups | setup_permission_exceptions | setup_api_keys | setup_webhooks | setup_importspartrequiredstring
records | record | form | options | blocks | export | filerecord_idinteger parentinteger The parent record, for a section under a record (an employee, for employee_documents). fieldstring For options and file. searchstring sortstring directionstring
asc | descpageinteger per_pageinteger filtersobject -
rehire_employeechanges data ZenHR's "Add Employee for an Existing User": a new employee record for someone whose record has ende...ZenHR's "Add Employee for an Existing User": a new employee record for someone whose record has ended (employee_id = the ended record). Personal and contact data and the sign-in account carry over; hire_date is required and comes after the last working day; branch_id, employee_number, position_id, units, manager_id, work_type, contract_type_id, contract_end_date and probation_end_date set the new job. copy_bank_accounts and copy_family (default true) copy those. Counts against the license.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger The ended record hire_daterequiredstring YYYY-MM-DD branch_idinteger employee_numberstring position_idinteger work_location_idinteger department_idinteger section_idinteger project_idinteger manager_idinteger work_typestring
full_time | part_time | freelance | internship | contractorcontract_type_idinteger contract_end_datestring YYYY-MM-DD probation_end_datestring YYYY-MM-DD copy_bank_accountsboolean copy_familyboolean -
remove_project_assignmentcan delete Take an employee off a project (by assignment id from list_projects).Take an employee off a project (by assignment id from list_projects).
Argument Type Description company_idrequiredinteger assignment_idrequiredinteger -
remove_role_assignmentcan delete Take a role away from someone (by assignment id from list_role_assignments).Take a role away from someone (by assignment id from list_role_assignments).
Argument Type Description company_idrequiredinteger assignment_idrequiredinteger -
request_commentschanges data The comments under a request's Approval Cycle, as in ZenHR ("Comments and replies are visible to any...The comments under a request's Approval Cycle, as in ZenHR ("Comments and replies are visible to anyone who has access to this item", docs/approvals.md). kind requests (an employee request) or leaves (time off), id. action list (default): the comments oldest first, each with id, author, body and at. action add: post body (up to 2000 characters). Whoever may see the request: the employee, HR over them, their managers, or an approver.
Argument Type Description company_idrequiredinteger kindrequiredstring
requests | leavesidrequiredinteger actionstring
list | addbodystring -
request_field_uploadchanges data Asks the employees on an open field job to upload the signed photos still saved on their phones (fie...Asks the employees on an open field job to upload the signed photos still saved on their phones (field.jobs.request_upload in the job's branch, docs/field-proof.md §12), as POST field/jobs/{job}/request-upload. Fields: job_id, note (optional, up to 500 characters). They get a notice and a push; the phone sends its drafts by itself once it is online and the app can run. At most once per job every 10 minutes. It can't read the phone: the answer says who was told, not how many photos wait.
Argument Type Description company_idrequiredinteger job_idrequiredinteger notestring branchstring -
request_leavechanges data Ask for time off (action request): leave_type_id, start_date and end_date (YYYY-MM-DD), or for an ho...Ask for time off (action request): leave_type_id, start_date and end_date (YYYY-MM-DD), or for an hourly type start_date with start_time and end_time (HH:MM); reason, half_day. A type that needs a document is asked for on the screen or the API. Or withdraw your pending request (action withdraw, leave_id).
Argument Type Description company_idrequiredinteger actionrequiredstring
request | withdrawleave_type_idinteger start_datestring end_datestring start_timestring end_timestring reasonstring half_dayboolean leave_idinteger To withdraw -
reset_user_two_factorcan delete User setup: turn off a user's two-step verification (lost phone) so they set it up again. Not for yo...User setup: turn off a user's two-step verification (lost phone) so they set it up again. Not for yourself, the company admin, or someone who also works in another company (Mihnaro support does those).
Argument Type Description company_idrequiredinteger user_idrequiredinteger -
resolve_app_linkread only What a notification's or a search result's link opens in the mobile app for you: status open with it...What a notification's or a search result's link opens in the mobile app for you: status open with its target (an engine section or one of the app's screens, with the record), closed with the reason (permission, not_found, web_only) and a message, or none when there is no link. Checks your permissions and the record itself.
Argument Type Description company_idrequiredinteger urlstring The link, as a notification or a search result gives it -
resolve_template_conflictchanges data Settle a template conflict (devices.manage, docs/devices.md): template_id with version_id keeps that...Settle a template conflict (devices.manage, docs/devices.md): template_id with version_id keeps that version and pushes it to every device the person may use; or re_enroll_device_id asks that terminal to enrol the slot again (the newer enrolment then wins). Logged in the device audit log.
Argument Type Description company_idrequiredinteger template_idrequiredinteger version_idinteger re_enroll_device_idinteger -
resolve_terminationchanges data Resolve an item of the termination check, or cancel a termination (docs/terminations.md, employees.t...Resolve an item of the termination check, or cancel a termination (docs/terminations.md, employees.terminate over employee_id). action substitute (fields kind approvers|manager|supervisor|key_staff, substitute_id: an employee who takes the leaver's place), withdraw_requests (every pending request), take_asset (fields asset_id), expire_insurance (fields insurance_id), pay_loans (each remaining loan amount repaid in cash), deduct_loans (left for the final settlement; needs the legal rule validated), cancel_termination (undo a termination entered by mistake, before payroll paid the final settlement). Returns the check after the change.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger actionrequiredstring
substitute | withdraw_requests | take_asset | expire_insurance | pay_loans | deduct_loans | cancel_terminationfieldsobject -
restore_employeechanges data Brings an archived employee back as it was, with its number. Refused when another current employee n...Brings an archived employee back as it was, with its number. Refused when another current employee now has that number, the subscription is full, or the person already has a current record. Find archived records with list_employees status=archived. Needs employees.archive.
Argument Type Description company_idrequiredinteger employee_idinteger The internal id; or give employee_number. employee_numberstring branch_idinteger With employee_number, when numbers repeat across branches. -
review_evaluationchanges data Fill in an evaluation. action self (the employee, while in self review) or review (the result writer...Fill in an evaluation. action self (the employee, while in self review) or review (the result writer or performance.manage over the employee; completes it with the weighted score): fields scores {criterion id: 1–5}, actuals {template OKR criterion id: number reached}, kr_actuals {key result id: number reached}, comment; self also takes self_performance_summary, self_key_strengths, self_weaknesses, self_recommendations. action notes (result writer or HR): performance_summary, key_strengths, weaknesses, recommendations. action final (a result auditor or HR, once complete): final_rate_override 0–100, final_notes, notify_people.
Argument Type Description company_idrequiredinteger evaluation_idrequiredinteger actionrequiredstring
self | review | notes | finalfieldsobject -
review_field_evidencechanges data Signed field photos (field.evidence.review, docs/field-proof.md), as GET field/evidence and POST fie...Signed field photos (field.evidence.review, docs/field-proof.md), as GET field/evidence and POST field/evidence/{id}/void. action list: filters job_id, stage (arrival, progress, completion, departure), employee_id, accepted, flag (e.g. mock_location, outside_site, time_unverified), flagged (any flag, not voided: the review queue), voided, branch_id, from, to, per_page. action show: evidence_id, every detail (time, place, flags, device key, hash) and its void log. action void (field.evidence.void): evidence_id and reason (required); the photo stays, the void is logged, and the job goes back to the stage its standing photos show. action c2pa: evidence_id, its C2PA (Content Credentials) copy signed by the Mihnaro server: status (none, pending, signed, failed), validation, trust (self_signed = Mihnaro's own certificate, validators show an unknown signer), assertions, as GET field/evidence/{id}/c2pa. action c2pa_download: evidence_id, the signed copy as base64 (filename, mime, size, sha256), only when signed, valid and not voided, as GET field/evidence/{id}/c2pa/download. action devices (field.evidence.devices): the phone keys in the branches covered; action revoke_key (field.evidence.devices): key_id (a lost phone). Photos themselves are only taken by the mobile app with its hardware key, never through MCP.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | show | void | c2pa | c2pa_download | devices | revoke_keyevidence_idinteger reasonstring key_idstring filtersobject branchstring -
review_payroll_runread only The review of a payroll run: its totals, last month's and who joined, left or changed, only for the...The review of a payroll run: its totals, last month's and who joined, left or changed, only for the people you reach and the amounts open to you. Approve or return it with run_section_action on payroll_runs (docs/mobile-payroll.md).
Argument Type Description company_idrequiredinteger run_idrequiredinteger -
review_punchchanges data Decides a suspicious or held punch of the punch log (attendance.security.review, docs/attendance-sec...Decides a suspicious or held punch of the punch log (attendance.security.review, docs/attendance-security.md): decision approve or reject, note, approve_device (also approve its pending phone or browser). Approving a held punch applies it exactly like a normal punch at its original time, for that employee only; rejecting writes nothing. A flagged punch is already in attendance: the decision only records the review.
Argument Type Description company_idrequiredinteger idrequiredinteger decisionrequiredstring
approve | rejectnotestring approve_deviceboolean -
review_timesheetschanges data Timesheets submitted by the employees your role reaches (timesheets.approve): with no decision, list...Timesheets submitted by the employees your role reaches (timesheets.approve): with no decision, lists the submitted periods (timesheet ID, hours, contribution percentage, entries); with employee_id, week and decision (approved or rejected), approves or returns that period.
Argument Type Description company_idrequiredinteger employee_idinteger weekstring decisionstring
approved | rejected -
role_matrixchanges data Read a role's table of web and app switches for every action and of web and app levels for every fie...Read a role's table of web and app switches for every action and of web and app levels for every field. Send actions {"key": {"web": true, "app": false}} or fields {"entity.field": {"web": "edit", "app": "hidden"}} to change those rows; the rest stays. Company setup keys (setup.*) are closed on the app until opened here.
Argument Type Description company_idrequiredinteger role_idrequiredinteger actionsobject Rows to change: {"setup.positions.view": {"web": true, "app": true}} fieldsobject Rows to change: {"setup_positions.code": {"web": "edit", "app": "view"}} -
run_mass_actioncan delete One change for many employees (docs/activity-log.md "Mass actions"), through the same rules as chang...One change for many employees (docs/activity-log.md "Mass actions"), through the same rules as changing one. Always run with dry_run true first and show the person the lines. tab personal (employees.manage): gender, marital_status, religion, nationality (2 letters) with nationality_action empty (set it), add (as the second) or replace (with nationality_to_replace), citizen (citizen/non_citizen), roster_action add/remove with roster_shift_id, roster_from, roster_to and roster_conflict keep|replace (needs attendance.manage). tab professional (employees.manage): position_id, department_id and the other org unit ids, manager_id, supervisor_id, work_type, employee_kind, shift_id (default shift, at once), effective_date (required; dated professional data). tab financial (payroll.manage): one of basic_salary, raise_amount, raise_percent; salary_count, company_bank_account_id, payment_method, social_security_rule_id, effective_date (required; a new salary package), reason. employee_ids: every one must be in scope. kind history lists past mass actions.
Argument Type Description company_idrequiredinteger kindstring
run | historytabstring
personal | professional | financialchangesobject employee_idsarray dry_runboolean -
run_reportread only Runs a report for the employees in the person's scope, the same as the screen and GET /reports/{repo...Runs a report for the employees in the person's scope, the same as the screen and GET /reports/{report}/run. report: a key from list_reports. filters: the filter params (multi filters as arrays of ids or values, dates YYYY-MM-DD, date ranges as key_from / key_to, months YYYY-MM), plus cols (column keys), show (switch keys) and show_zero. saved_id starts from saved options. Or custom_report_id to generate a customized report (reports.custom). limit: rows per table, 100 by default, 2000 at most. Returns the columns, rows, totals (and sections for sectioned reports) and the row count.
Argument Type Description company_idrequiredinteger reportstring filtersobject saved_idinteger custom_report_idinteger limitinteger -
run_section_actionchanges data Does an action of an engine section on one record (record_id) or on up to 100 (ids): archive, restor...Does an action of an engine section on one record (record_id) or on up to 100 (ids): archive, restore, delete and others, as describe_section lists them for you. An action not listed for you is closed. With ids, each record is checked alone and the answer says which failed.
Argument Type Description company_idrequiredinteger sectionrequiredstring
employees | employee_contracts | employee_bank_accounts | employee_family | employee_documents | employee_job_history | terminations | attendance_sheet | attendance_records | missing_punches | team_locations | team_leaves | leave_balances | leave_adjustments | employee_shifts | team_schedule | work_shifts | approval_delegations | manage_announcements | manage_events | manage_tasks | manage_letters | disciplinary_actions | suspensions | company_assets | field_jobs | field_sites | field_customers | field_customer_sites | field_technicians | field_parts | field_part_movements | field_stock_locations | field_movements | field_vehicles | field_vehicle_documents | field_vehicle_maintenance | field_vehicle_fuel | field_overtime | evaluation_cycles | cycle_evaluations | goals | key_positions | successors | job_openings | job_candidates | candidates | candidate_notes | candidate_interviews | candidate_offers | my_interviews | offers | assessment_tests | assessment_questions | assessment_invitations | assessment_grading | my_assessments | boardings | boarding_tasks | boarding_templates | employee_checklists | payroll_runs | payroll_run_payslips | payroll_salaries | payroll_packages | payroll_package_templates | payroll_transactions | payroll_settlements | payroll_settlement_slips | payroll_loans | payroll_loan_installments | payroll_overtimes | payroll_insurance | payroll_air_tickets | payroll_provisions | setup_branches | setup_org_units | setup_positions | setup_org_levels | setup_termination_reasons | setup_checklist_templates | setup_shifts | setup_holidays | setup_overtime_types | setup_attendance_functions | setup_leave_types | setup_payroll_general | setup_payroll_advance | setup_payroll_extra_settings | setup_payroll_tax_settings | setup_payroll_social_security | setup_payroll_tax | setup_payroll_extra | setup_payroll_bank_accounts | setup_transaction_types | setup_part_time_transaction_types | setup_loan_types | setup_cost_centers | setup_salary_bands | setup_expense_types | setup_cities | setup_attendance_devices | setup_device_time_zones | setup_roles | setup_roles_assignments | setup_permission_groups | setup_permission_exceptions | setup_api_keys | setup_webhooks | setup_importsactionrequiredstring record_idinteger idsarray parentinteger inputobject -
save_attendance_recordchanges data Record a day for an employee your role reaches (attendance.records.manage): work_date, clock_in and...Record a day for an employee your role reaches (attendance.records.manage): work_date, clock_in and clock_out (HH:MM). With replace true the day's records are replaced (correct a day, e.g. a forgotten clock-out). Or trust (or untrust) a record with record_id.
Argument Type Description company_idrequiredinteger employee_idinteger work_datestring YYYY-MM-DD clock_instring HH:MM clock_outstring HH:MM replaceboolean record_idinteger To trust or untrust a record -
save_branchchanges data Add a branch (without branch_id) or change one. New branches stay within the license. Country sets t...Add a branch (without branch_id) or change one. New branches stay within the license. Country sets the default currency and timezone. Logos are uploaded in the app or with multipart POST to the API.
Argument Type Description company_idrequiredinteger branch_idinteger Leave out to add a branch. nameobject {"en": "...", "ar": "..."}; en is required for a new branch. codestring countrystring ISO code from the supported list, e.g. IQ, SA, AE. currencystring 3 letters; defaults to the country's. timezonestring e.g. Asia/Baghdad; defaults to the country's. is_activeboolean The main branch can't be turned off. -
save_clocking_securitychanges data Changes clocking security (attendance.security.manage, docs/attendance-security.md); send only what...Changes clocking security (attendance.security.manage, docs/attendance-security.md); send only what changes. checks: {check: off|flag|hold|block|on} for mock_location, integrity, new_device, browser_binding, shared_phone, shared_browser, offline_unproven, accuracy, ip_location, travel, wifi ("on" = the usual action: hold for offline_unproven, new_device and browser_binding, flag otherwise; integrity can only flag until a provider is configured). clock_sec_shared_window_hours, clock_sec_desktop_accuracy_m, clock_sec_travel_kmh, clock_sec_ip_distance_m, clock_sec_geoip_distance_km (IP city vs GPS, km), clock_sec_office_ips, clock_sec_datacenter_ips (comma-separated IPs or CIDR ranges), clock_sec_alert_email. clock_offline_enabled (the mobile app keeps punches made with no internet and sends them later) and clock_offline_hours (1–168, how far back). branch_id saves a branch's own values. add_wifi {bssid, ssid, label, branch_id, work_location_id} adds an office Wi-Fi access point; remove_wifi_id removes one.
Argument Type Description company_idrequiredinteger branch_idinteger checksobject check → off, flag, hold, block or on clock_sec_shared_window_hoursinteger clock_sec_desktop_accuracy_minteger clock_sec_travel_kmhinteger clock_sec_ip_distance_minteger clock_sec_geoip_distance_kminteger clock_sec_office_ipsstring clock_sec_datacenter_ipsstring clock_sec_alert_emailboolean clock_offline_enabledboolean clock_offline_hoursinteger add_wifiobject bssid (aa:bb:cc:dd:ee:ff), ssid, label, branch_id, work_location_id remove_wifi_idinteger -
save_company_settingschanges data Change System preferences → Account setup. Send only what changes; the rest stays. The logo is uploa...Change System preferences → Account setup. Send only what changes; the rest stays. The logo is uploaded on the screen or the API, not here (remove_logo works).
Argument Type Description company_idrequiredinteger company_name_enstring company_name_arstring company_addressstring company_phonestring company_emailstring currencystring work_startstring HH:MM work_endstring HH:MM late_grace_minutesinteger weekend_daysarray 0 = Sunday … 6 = Saturday eos_days_per_yearnumber eos_min_yearsnumber org_level_typestring
company | branchhide_org_chartboolean secure_documentsboolean The mobile app's file viewer is kept out of screenshots and recordings remove_logoboolean -
save_employeechanges data Add (without employee_id) or change an employee record. New employees count against the license acro...Add (without employee_id) or change an employee record. New employees count against the license across all branches. create_login: true makes a sign-in account from the work email and returns a temporary password once. Use transfer_employee to change branch.
Argument Type Description company_idrequiredinteger employee_idinteger Leave out to add an employee. employee_numberstring Leave out for the next number (E0001...). nameobject {"en": "...", "ar": "..."}; en required for a new employee. emailstring Work email; the sign-in account uses it. personal_emailstring phonestring Digits, optional +, e.g. +9647701234567. hire_datestring YYYY-MM-DD; required for a new employee. branch_idinteger Required for a new employee. statusstring
active | suspendedposition_idinteger work_location_idinteger department_idinteger section_idinteger project_idinteger manager_idinteger create_loginboolean name_partsobject Four-part names: {"en": [first, second, third, last], "ar": [...]}; builds the full name. genderstring
male | femalebirth_datestring marital_statusstring
single | married | divorced | widowednationalitystring Two-letter country code. national_idstring Needs employees.view_sensitive, like the passport and permit fields. passport_numberstring job_titleobject {"en": "...", "ar": "..."} work_typestring
full_time | part_time | freelance | internship | contractorjob_grade_idinteger contract_type_idinteger supervisor_idinteger probation_end_datestring change_effective_datestring The date written in the job history for these changes. custom_fieldsobject {"custom field id": "value"}; list fields take the choice number. -
save_employee_file_recordchanges data Add (without record_id) or change a contract, bank account or family member in an employee's file. B...Add (without record_id) or change a contract, bank account or family member in an employee's file. Bank accounts need employees.view_sensitive; their shares can't pass 100%. Documents need a file, so upload them through the app or the API.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger kindrequiredstring
contracts | bank_accounts | familyrecord_idinteger Leave out to add. fieldsobject Send the fields themselves at the top level. contracts: contract_type_id, start_date, end_date, auto_renewal (inherit|enabled|disabled), renew_within_days, notes. bank_accounts: bank_name, bank_branch, country, account_number, iban, swift_code, transfer_percent, custom_fields ({"field id": value} for the custom fields of the bank_account level). family: name_parts ({"en": [first, second, third, family], "ar": [...]}; builds name and name_ar) or name, name_ar, relation (spouse|child|parent|sibling|other), birth_date, national_id, is_dependent, gender, marital_status, nationalities, phone, email. -
save_employee_numberingchanges data Changes the employee numbering. Without branch_id: the company's prefix, padding, next_number, scope...Changes the employee numbering. Without branch_id: the company's prefix, padding, next_number, scope (company or branch) and allow_reuse; changing scope to company is refused while current employees of different branches share a number. With branch_id: that branch's own numbering (custom true with prefix, padding, next_number) or back to the company's (custom false). Numbers already given never change. Returns get_employee_numbering. Needs employee_settings.manage.
Argument Type Description company_idrequiredinteger branch_idinteger A branch's own numbering instead of the company's. customboolean With branch_id: true gives the branch its own prefix, padding and counter; false returns it to the company's. prefixstring Optional letters, digits, - or _, up to 20; empty for none. paddinginteger Pad the digits with zeros to this width (0 = none, up to 12). next_numberinteger Where new numbers start; numbers already used are skipped. scopestring
company | branchWithout branch_id: numbers unique across the company or per branch. allow_reuseboolean Without branch_id: let HR give out the numbers of archived and ended employees again. -
save_employee_settingchanges data Add (without record_id) or change an entry in one of the employee file lists (contract_types, job_gr...Add (without record_id) or change an entry in one of the employee file lists (contract_types, job_grades, document_types, custom_fields, org_levels, field_rules, e_signatures, banks). Names are {"en","ar"}; list custom fields need options [{"en","ar"}]. Document types take applies_to (employees|company|both), is_default, deletable, has_expiry and notify_before (week|2_weeks|month|2_months|3_months|6_months: how long before expiry HR is told); custom fields take field_level (personal|professional|financial|bank_account: bank_account fields are asked on each bank account); custom fields take group_name {"en","ar"} (ZenHR Manage Additional Info); field rules take allow_numbers/allow_lowercase/allow_uppercase/allow_special (false = not allowed); e_signatures take signer_title, user_id and image_base64 (a PNG/JPG data URL).
Argument Type Description company_idrequiredinteger kindrequiredstring
contract_types | job_grades | document_types | custom_fields | org_levels | field_rules | e_signatures | banksrecord_idinteger Leave out to add. nameobject {"en": "...", "ar": "..."} (not for field_rules). fieldstring field_rules only: one of the ZenHR field configuration keys (list_employee_settings kind=field_rules shows them). applies_tostring
employees | company | bothdocument_types only. notify_beforestring
week | 2_weeks | month | 2_months | 3_months | 6_monthsdocument_types only: how long before expiry HR is told. group_nameobject custom_fields only: the Additional Info group. image_base64string e_signatures only: data:image/png;base64,... countrystring banks only: ISO country code, e.g. IQ. branchesarray banks only: the branches, [{"en": "...", "ar": "..."}]. external_refstring The id this entry had in ZenHR (import). -
save_leave_typechanges data Add a time off type (category annual, casual, hourly or sick) or change one with leave_type_id (leav...Add a time off type (category annual, casual, hourly or sick) or change one with leave_type_id (leave_setup.manage), sending its whole form in fields as the screen does: name {en, ar}, entitlement_days (entitlement_hours for hourly), balance_type, notice and weekend rules, exceeding, accumulation, balance_setups, encashment, rules [{type, values}], hourly limits and deductions, sick_slices, switches (true/false). With balance_update_type "new" and effective_date, a changed amount counts from that date. delete true deletes an unused type.
Argument Type Description company_idrequiredinteger categorystring
annual | casual | hourly | sickleave_type_idinteger To change or delete one fieldsobject deleteboolean -
save_letter_templatechanges data Letter templates (letters.manage). action save: add one, or change it with template_id, sending fiel...Letter templates (letters.manage). action save: add one, or change it with template_id, sending fields: name {en, ar}, language ar|en, letter_category_id, body with {placeholders} (name, employee_no, job_title, department, branch, hire_date, salary, national_id, addressed_to, today, company; {signature:ID} prints an active e-signature from list_employee_settings e_signatures), active, is_draft, self_service, needs_confirmation, needs_approval, financial (a letter that shows pay: HR admins see it only where the branch allows; set by itself when the body uses {salary}, {salary_en} or {total_salary}). action duplicate: a draft copy. action favorite: star or un-star it for you.
Argument Type Description company_idrequiredinteger actionrequiredstring
save | duplicate | favoritetemplate_idinteger fieldsobject -
save_org_unitchanges data Add (without unit_id) or change a unit of the organization structure. A section needs parent_id (its...Add (without unit_id) or change a unit of the organization structure. A section needs parent_id (its department). branch_id ties a unit to one branch.
Argument Type Description company_idrequiredinteger unit_idinteger Leave out to add a unit. typestring
work_location | department | section | project | hierarchy_group | business_unit | division | segmentRequired for a new unit; can't change. nameobject {"en": "...", "ar": "..."} codestring establishment_numberstring branch_idinteger Null for all branches. parent_idinteger For a section: its department. is_activeboolean subsidiary_idstring establishment_namestring Governmental info (ZenHR), with governance_location, ss_number, tax_number, address and po_box. governance_locationstring ss_numberstring tax_numberstring addressstring po_boxstring -
save_permission_groupchanges data Add (without group_id) or change a group. Members: branch_ids narrow it, unit_rules ({"department":...Add (without group_id) or change a group. Members: branch_ids narrow it, unit_rules ({"department": [ids], "work_location": [ids]…}) and people (employee ids) fill it. Seats: manager_role_id reaches everyone under a registered manager inside the group, team_leader_role_id a registered supervisor's direct team inside the group, employee_role_id each member themselves. As POST and PATCH permission-groups. Needs roles.manage.
Argument Type Description company_idrequiredinteger group_idinteger Leave out to add a group. nameobject {"en": "...", "ar": "..."} descriptionobject is_activeboolean branch_idsarray unit_rulesobject {"department": [ids], "work_location": [ids], "section": [ids], "project": [ids]…} peoplearray Employee ids. manager_role_idinteger team_leader_role_idinteger employee_role_idinteger -
save_permission_overridechanges data Set one person's exception. kind action: subject is a permission key, web and app are open, closed o...Set one person's exception. kind action: subject is a permission key, web and app are open, closed or null (no exception there); closed beats every role and group. kind field: subject is a field (employee.basic_salary…), web and app are hidden, view, edit or null. Both null takes it off. As POST permission-overrides. Needs roles.manage.
Argument Type Description company_idrequiredinteger user_idrequiredinteger kindrequiredstring
action | fieldsubjectrequiredstring webstring
open | closed | hidden | view | editappstring
open | closed | hidden | view | editscopestring Where an opened action applies (company by default): a scope from list_roles. scope_idinteger reasonstring -
save_positionchanges data Add (without position_id) or change a job title (job role): name, code, active, type (regular or haz...Add (without position_id) or change a job title (job role): name, code, active, type (regular or hazardous), available across all branches, job description.
Argument Type Description company_idrequiredinteger position_idinteger Leave out to add a position. nameobject {"en": "...", "ar": "..."} codestring is_activeboolean job_role_typestring
regular | hazardouscompany_levelboolean Available across all branches job_descriptionstring -
save_professional_datachanges data A dated professional data record for an employee: new job role (position), units, manager, superviso...A dated professional data record for an employee: new job role (position), units, manager, supervisor, work type or outsourced, from effective_on (and until expires_on, after which the old values come back). Applied now if the date has come, otherwise on its date. Send only what changes; notes are ZenHR's Notes. Or cancel a future record with cancel_record_id; edit a record with update_record_id (a future one as it is, or the one in effect: ZenHR's "Update Current Professional Info", no new dated record); delete one with delete_record_id (the one in effect puts back what it replaced).
Argument Type Description company_idrequiredinteger employee_idinteger cancel_record_idinteger update_record_idinteger delete_record_idinteger notesstring effective_onstring YYYY-MM-DD expires_onstring YYYY-MM-DD notify_employeeboolean position_idinteger work_location_idinteger department_idinteger section_idinteger project_idinteger hierarchy_group_idinteger business_unit_idinteger division_idinteger segment_idinteger work_typestring manager_idinteger supervisor_idinteger employee_kindstring -
save_projectchanges data Add a project, or edit one with project_id (send only what changes). Code is unique; names in Arabic...Add a project, or edit one with project_id (send only what changes). Code is unique; names in Arabic and English are required; status is active or closed.
Argument Type Description company_idrequiredinteger project_idinteger To edit codestring nameobject {"en": "...", "ar": "..."} clientstring group_namestring group_codestring entity_codestring manager_idinteger Employee id start_datestring YYYY-MM-DD end_datestring YYYY-MM-DD budget_hoursnumber statusstring
active | closed -
save_regional_settingschanges data Change regional settings (docs/regional-settings.md). Without branch_id: the company defaults (setti...Change regional settings (docs/regional-settings.md). Without branch_id: the company defaults (settings.manage). With branch_id: that branch's own values (branches.manage), and also its country and timezone. Only the keys given change; null or "" goes back to the level above (branch → company → platform). Display only: no stored date or amount changes. The change is in the activity log and the company's admins are notified. Values: date_format j M Y | d/m/Y | Y-m-d | d-M-Y | j F Y | l j F Y | F j, Y | M j, Y | m/d/Y | d.m.Y; time_format 12 | 24; week_start saturday … friday; calendar gregorian | gregorian_hijri; month_names levant (كانون الثاني… تشرين الثاني) | gulf (يناير… نوفمبر); numerals latn | arab; thousands_separator comma | dot | space | arabic_thousands | none; decimal_separator dot | comma | arabic_decimal; currency_display name | code | symbol; currency_position after | before.
Argument Type Description company_idrequiredinteger branch_idinteger Leave out to change the company defaults. date_formatstring|null Platform default: j M Y time_formatstring|null Platform default: 24 week_startstring|null Platform default: sunday calendarstring|null Platform default: gregorian month_namesstring|null Platform default: levant numeralsstring|null Platform default: latn thousands_separatorstring|null Platform default: comma decimal_separatorstring|null Platform default: dot currency_displaystring|null Platform default: name currency_positionstring|null Platform default: after countrystring Branch only: ISO code, e.g. IQ. timezonestring Branch only: e.g. Asia/Baghdad. -
save_rolechanges data Add (without role_id) or change a role. permissions are keys from list_roles, module permissions or...Add (without role_id) or change a role. permissions are keys from list_roles, module permissions or sub-module ones (leaves.adjustments.manage…); preset (hr_manager, branch_manager, line_manager) fills a new role. is_active false switches a role off: its people keep it but it grants nothing until switched on.
Argument Type Description company_idrequiredinteger role_idinteger Leave out to add a role. nameobject {"en": "...", "ar": "..."} descriptionobject permissionsarray channelsobject Per permission: both, web, app or none. Set on a sub-module permission it decides over its module permission. Left out: it stays; a permission with no switch works on both. fieldsobject Per field from list_roles meta (employee.basic_salary…): {"web": "hidden|view|edit", "app": "hidden|view|edit"}. A field with no setting follows the permissions it always followed. is_activeboolean presetstring
hr_manager | branch_manager | line_manager | recruiter | finance -
save_section_recordchanges data Adds (no record_id) or changes a record of an engine section. Send only what changes, in values, by...Adds (no record_id) or changes a record of an engine section. Send only what changes, in values, by the keys describe_section gives. What you can't edit is dropped and named in ignored; send version from the record to refuse overwriting a newer change. Files go through the API.
Argument Type Description company_idrequiredinteger sectionrequiredstring
employees | employee_contracts | employee_bank_accounts | employee_family | employee_documents | employee_job_history | terminations | attendance_sheet | attendance_records | missing_punches | team_locations | team_leaves | leave_balances | leave_adjustments | employee_shifts | team_schedule | work_shifts | approval_delegations | manage_announcements | manage_events | manage_tasks | manage_letters | disciplinary_actions | suspensions | company_assets | field_jobs | field_sites | field_customers | field_customer_sites | field_technicians | field_parts | field_part_movements | field_stock_locations | field_movements | field_vehicles | field_vehicle_documents | field_vehicle_maintenance | field_vehicle_fuel | field_overtime | evaluation_cycles | cycle_evaluations | goals | key_positions | successors | job_openings | job_candidates | candidates | candidate_notes | candidate_interviews | candidate_offers | my_interviews | offers | assessment_tests | assessment_questions | assessment_invitations | assessment_grading | my_assessments | boardings | boarding_tasks | boarding_templates | employee_checklists | payroll_runs | payroll_run_payslips | payroll_salaries | payroll_packages | payroll_package_templates | payroll_transactions | payroll_settlements | payroll_settlement_slips | payroll_loans | payroll_loan_installments | payroll_overtimes | payroll_insurance | payroll_air_tickets | payroll_provisions | setup_branches | setup_org_units | setup_positions | setup_org_levels | setup_termination_reasons | setup_checklist_templates | setup_shifts | setup_holidays | setup_overtime_types | setup_attendance_functions | setup_leave_types | setup_payroll_general | setup_payroll_advance | setup_payroll_extra_settings | setup_payroll_tax_settings | setup_payroll_social_security | setup_payroll_tax | setup_payroll_extra | setup_payroll_bank_accounts | setup_transaction_types | setup_part_time_transaction_types | setup_loan_types | setup_cost_centers | setup_salary_bands | setup_expense_types | setup_cities | setup_attendance_devices | setup_device_time_zones | setup_roles | setup_roles_assignments | setup_permission_groups | setup_permission_exceptions | setup_api_keys | setup_webhooks | setup_importsrecord_idinteger parentinteger The parent record, for a section under a record. valuesrequiredobject versionstring -
save_setup_form_itemchanges data Add (without id) or change (with id, send only what changes) an item of a setup form, with name {"en...Add (without id) or change (with id, send only what changes) an item of a setup form, with name {"en","ar"} and the entity's fields from list_setup_form. Files (logo) are uploaded on the screen or the API. With delete=true and id, deletes it unless it is in use.
Argument Type Description company_idrequiredinteger entityrequiredstring
expense-types | cities | org-levels | miscellaneous-types | attendance-functions | transaction-types | loan-types | part-time-transaction-types | cost-centers | salary-bands | letter-categories | disciplinary-types | suspension-reasons | termination-reasons | checklist-templatesidinteger nameobject {"en": "...", "ar": "..."} deleteboolean level_typestring parent_idinteger rankinteger subsidiary_idstring key_staffarray [{"employee_id": 1, "role": "approvals|evaluation|financial"}] countrystring cities: the ISO country code (JO, IQ…) activeboolean -
save_time_settingschanges data Change attendance setup or timesheets setup (section), sending only the settings that change in valu...Change attendance setup or timesheets setup (section), sending only the settings that change in values, e.g. {"clock_geofence": true, "mp_max_days": 30} or {"ts_period": "biweekly"}. get_time_settings lists them. Punches by shift (docs/attendance.md): punch_in_window_minutes (early clock-in window before a shift, default 60), punch_out_grace_minutes (clock-out grace after it, past midnight too, default 30), shift_punches_from (Y-m-d H:i on the company clock: punches from then follow the shift; earlier ones keep the calendar day; empty = all, "off" = never).
Argument Type Description company_idrequiredinteger sectionrequiredstring
attendance | timesheetsvaluesrequiredobject -
save_time_setup_itemchanges data Add or change a time setup item (attendance_setup.manage). kind shifts or overtime_types: the whole...Add or change a time setup item (attendance_setup.manage). kind shifts or overtime_types: the whole item in fields, as on the screen (a shift: name {en, ar}, type, start_time, end_time..., punch_in_window_minutes and punch_out_grace_minutes for punches by shift, empty = the device's then the company's; an overtime type: name, applies_on, rate, allowance_method...). kind holidays: name, date, end_date, religions, recurring. kind geolocations: name, latitude, longitude, radius_m, restricted. kind biometric_devices: name, serial, work_location_id, punches_from (Y-m-d: older punches are kept but not added to attendance); a new machine's token is shown once. Give id to change one; for holidays, geolocations and machines send only what changes.
Argument Type Description company_idrequiredinteger kindrequiredstring
shifts | overtime_types | holidays | geolocations | biometric_devicesidinteger To change one fieldsrequiredobject -
schedule_employeeschanges data The employee shift schedule and work locations, for the employees your role reaches. action list, we...The employee shift schedule and work locations, for the employees your role reaches. action list, week and regular need attendance.shift_planner.view; assign_shift, plan and publish attendance.shift_planner.manage; set_locations and replace_location attendance.manage; location_for_everyone attendance_setup.manage (attendance.manage grants them all). action list: schedule rows between from and to (a week by default). action assign_shift: employees, shift_id (or "off"), start_date, end_date (none = open-ended), conflict replace or keep. action plan (ZenHR's roster): shift_ids, start_date, end_date (up to two months, e.g. a month), optional employees, max_in_a_row, days_off_a_week, max_weekly_hours, fair_nights: drafts days. action publish: start_date, end_date, optional employees, notify: publishes the drafts. action week: the Employee Shifts week (week = any date in it; filters q, department, job_role, manager, gender, schedule with|without) as one row per employee with a cell per day (the CSV export). action regular: regular (non-roster) shift assignments and each person's own default shift. action set_locations: employees, locations and mode assign, unassign or replace. action replace_location: everyone at from_location moves to to_location. action location_for_everyone: location_id with mode assign, unassign or replace for every active employee in reach. action reprocess_punches (attendance_setup.manage): match machine punches to employees again.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | week | regular | assign_shift | plan | publish | set_locations | replace_location | location_for_everyone | reprocess_punchesfromstring tostring employeeinteger employeesarray shift_idstring A shift id, or off start_datestring end_datestring conflictstring
replace | keepshift_idsarray max_in_a_rowinteger days_off_a_weekinteger max_weekly_hoursnumber fair_nightsboolean notifyboolean weekstring qstring departmentinteger job_roleinteger managerinteger genderstring
male | femaleschedulestring
with | withoutfrom_locationinteger to_locationinteger location_idinteger locationsarray modestring
assign | unassign | replace -
search_help_centerread only The public help center at help.mihnaro.com (docs/help-center.md): its topics, and its articles match...The public help center at help.mihnaro.com (docs/help-center.md): its topics, and its articles matching a search (`query`) or in a topic (`category`), with their title, summary and link. In English, or Arabic with `locale: ar`. Read one with get_help_article.
Argument Type Description querystring Words to search for, e.g. "leave balance". categorystring
getting-started | employees | payroll | leaves | attendance | documents | performance | recruitment | reports | settings | apilocalestring
en | ar -
send_company_test_emailchanges data Settings → Email server → "Send a test email" (settings.manage, docs/mail.md): one test email throug...Settings → Email server → "Send a test email" (settings.manage, docs/mail.md): one test email through the company's own mail server. A failure says why in plain words (wrong username or password, connection refused, encryption and port mismatch…). Only send when the person asked for a test.
Argument Type Description company_idrequiredinteger torequiredstring -
send_for_signaturechanges data E-signatures. action send (letters.manage): send a document for employee_ids in your scope to read a...E-signatures. action send (letters.manage): send a document for employee_ids in your scope to read and sign, as title + body or an issued letter_id. action decline: decline to sign your own document (signature_id, decline_reason). Signing itself is done by the employee on the screen or the API, with their password and a drawn signature.
Argument Type Description company_idrequiredinteger actionrequiredstring
send | declineemployee_idsarray titlestring bodystring letter_idinteger signature_idinteger decline_reasonstring -
send_phone_test_pushchanges data One test notification to one phone of a person in your scope (docs/notifications.md «الإشعار التجريب...One test notification to one phone of a person in your scope (docs/notifications.md «الإشعار التجريبي»): install_id from list_app_devices. Straight to Apple or Google, nothing in the bell, logged on the phone's timeline (push_test) with who sent it. Returns sent and, per token: provider, status (ok, invalid, error), error, environment (which of Apple's servers took it), fallback (the first server refused it) and reason in plain words. "ok" means accepted for delivery, not shown on screen. At most 5 a minute per phone. Needs app_devices.test_push.
Argument Type Description company_idrequiredinteger install_idrequiredinteger -
set_employee_emailschanges data Settings → Email server → "Email employees" (settings.manage, docs/mail.md): on lets the company ema...Settings → Email server → "Email employees" (settings.manage, docs/mail.md): on lets the company email its people (invitations, welcome emails, notices, reminders); off holds them (notices still reach the bell; password resets and candidate emails are not held). Kept per branch like the reminders: branch_id for one branch, else the branch being worked in (the main branch's value is the company's). Only change it when the person asked.
Argument Type Description company_idrequiredinteger onrequiredboolean branch_idinteger -
set_legal_validationchanges data Needs legal_rules.validate (the company admin always has it): record that a payroll rule was legally...Needs legal_rules.validate (the company admin always has it): record that a payroll rule was legally validated (who validated it and the reference, e.g. a lawyer's opinion), or withdraw the validation. A blocked rule starts working once validated.
Argument Type Description company_idrequiredinteger rulerequiredstring
overtime_to_leave | rest_day_overtime | holiday_overtime | loan_settlement_deduction | eos_formula | tax_scale | day_divisoractionrequiredstring
record | withdrawvalidated_bystring referencestring -
set_line_manager_accesschanges data Turn on or off what direct managers may do for the people who report to them, with or without a role...Turn on or off what direct managers may do for the people who report to them, with or without a role: lm_rate_competencies, lm_assess_potential, lm_salary_adjustments, lm_team_suspensions. Keys left out keep their value. Needs roles.manage.
Argument Type Description company_idrequiredinteger lm_rate_competenciesboolean Rate the competencies of their direct reports lm_assess_potentialboolean Assess the potential (9-box) of their direct reports lm_salary_adjustmentsboolean File salary adjustment requests for the people who report to them lm_team_suspensionsboolean See the suspensions of their direct reports -
set_main_branchchanges data Make an active branch the company's main one (owners land on it).Make an active branch the company's main one (owners land on it).
Argument Type Description company_idrequiredinteger branch_idrequiredinteger -
set_user_statuschanges data User setup: switch a company account on (active) or off (inactive). An inactive user can't work in t...User setup: switch a company account on (active) or off (inactive). An inactive user can't work in this company. Not for yourself or the company admin.
Argument Type Description company_idrequiredinteger user_idrequiredinteger statusrequiredstring
active | inactive -
shift_setupchanges data Shift and overtime setup actions (attendance_setup.manage, docs/attendance.md). action get: shift_id...Shift and overtime setup actions (attendance_setup.manage, docs/attendance.md). action get: shift_id with its fields and employee count. action copy_to_roster: a roster copy of shift_id. action sync: give shift_id to every active employee who has no shift (not roster or archived shifts). action get_overtime_limit / set_overtime_limit: the Limit Setup, ot_limit_scope per_type|total, ot_total_limit_hours (0-744), ot_total_limit_period day|week|month.
Argument Type Description company_idrequiredinteger actionrequiredstring
get | copy_to_roster | sync | get_overtime_limit | set_overtime_limitshift_idinteger ot_limit_scopestring
per_type | totalot_total_limit_hoursnumber ot_total_limit_periodstring
day | week | month -
show_notification_logread only One notice of the notifications log in full (notifications.log.view, docs/notifications.md "سجل الإش...One notice of the notifications log in full (notifications.log.view, docs/notifications.md "سجل الإشعارات"), as GET notification-log/{id}: the send, then every person in your scope with their branch, bell (read and when), push (status and what Google/Apple answered per phone), email (status, reason, and the mail log row: via, attempts, error) and WhatsApp; receiver emails too when you see the whole company.
Argument Type Description company_idrequiredinteger idrequiredinteger The notice (send) id from list_notification_log. -
succession_intelligencechanges data Succession intelligence (succession.manage, its scope; docs/succession.md). action coverage: key pos...Succession intelligence (succession.manage, its scope; docs/succession.md). action coverage: key positions with risk flags (vacant, single_incumbent, high_risk, high_impact, no_successors, no_ready_successor), exposure (critical|exposed|watch|covered), bench and bench strength, and the summary; filters exposure, department_id. action suggestions: key_position_id, limit → candidates ranked by a score out of 100 with each part (competency_fit, performance, potential, readiness, tenure), the weights, gaps and a suggested readiness. action explain: key_position_id, employee_id → why (rule-based, or the AI provider's text when it is set). action successor: successor_id → readiness history and development plan. action draft_plan: successor_id, apply (true saves the actions). action save_action: successor_id or action_id, fields title, kind (training|mentoring|assignment|project|other), owner_id, due_date, status (planned|in_progress|done), progress 0–100, competency_id, notes. action delete_action: action_id. Readiness itself is set with manage_succession add_successor.
Argument Type Description company_idrequiredinteger actionrequiredstring
coverage | suggestions | explain | successor | draft_plan | save_action | delete_actionkey_position_idinteger employee_idinteger successor_idinteger action_idinteger exposurestring department_idinteger limitinteger applyboolean fieldsobject -
switch_branchchanges data Switches the branch workspace (like the branch switcher in the app header): a branch id, or "all" fo...Switches the branch workspace (like the branch switcher in the app header): a branch id, or "all" for every branch (company-wide roles only). Remembered for the web app, the API and later tool calls.
Argument Type Description company_idrequiredinteger branchrequiredstring A branch id, or "all". -
task_proofchanges data Signed proof photos on tasks (docs/field-proof.md §23), the same as the tasks/{task}/proof API route...Signed proof photos on tasks (docs/field-proof.md §23), the same as the tasks/{task}/proof API routes. action list (tasks.proof.view): the tasks with photos of the people in scope, with show (open, flagged, done, all), employee (id), q, page, per_page; each with its photos, videos, needs_look and last_photo_at. action show (tasks.proof.view): task_id, the task, its rules and photos, and can {void, request_upload, waive} for you. action own (self.tasks.view): task_id, one of your own tasks with every photo you took, open or finished. action void (tasks.proof.void): evidence_id, reason. action request_upload (tasks.proof.request_upload): task_id, note; at most once per task every 10 minutes. action waive (tasks.proof.waive): task_id, reason; the task no longer needs photos. action settings (tasks.proof.settings): with values task_proof_enabled, task_proof_offline_allowed, task_proof_departure, task_proof_min_progress_photos, and branch_id for one branch (null takes a key back to the company). Photos are only taken by the mobile app with its hardware key, never through MCP. To require proof on a new task pass fields.proof_required to manage_task action assign (tasks.proof.require).
Argument Type Description company_idrequiredinteger actionrequiredstring
own | list | show | void | request_upload | waive | settingstask_idinteger evidence_idinteger reasonstring notestring valuesobject branch_idinteger showstring
open | flagged | done | allemployeeinteger qstring pageinteger per_pageinteger -
team_schedulechanges data Work shifts HR shares with managers (docs/attendance.md «مشاركة جداول الدوام»). HR (attendance_setup...Work shifts HR shares with managers (docs/attendance.md «مشاركة جداول الدوام»). HR (attendance_setup.manage): action shares (shift_id) lists who a shift is shared with; action share (shift_id, targets [{target_type department|group|employee, target_id, can_edit}]) replaces them. Managers (shifts.assign_team) and HR: action list: the shifts shared with you (every shift for HR) and your team; action assign: employees (your team only), shift_id (a shared shift, or "off"), start_date, end_date (none = open-ended; the same date for one roster day), conflict replace|keep, draft; action clear: employees, start_date, end_date; action plan: the shift planner for your team (shift_ids shared with you, start_date, end_date at most 62 days, employees optional = whole team, max_in_a_row, days_off_a_week, max_weekly_hours, fair_nights), drafts only; action copy: source_from, source_to, target_from, target_to (same length or a multiple), employees optional, draft; days on shifts not shared with you are not copied; action publish: start_date, end_date, employees optional (a manager publishes drafts on shared shifts and days off only); action update_shift: shift_id and the shift fields, only where a share lets you change it.
Argument Type Description company_idrequiredinteger actionrequiredstring
list | shares | share | assign | clear | plan | copy | publish | update_shiftshift_idstring A shift id, or off when assigning a day off targetsarray employeesarray start_datestring end_datestring conflictstring
replace | keepdraftboolean shift_idsarray plan: the shared shifts to use source_fromstring source_tostring target_fromstring target_tostring max_in_a_rowinteger days_off_a_weekinteger max_weekly_hoursnumber fair_nightsboolean -
terminate_employeecan delete End an employee's service. The record is kept, stops counting against the license, and the person ca...End an employee's service. The record is kept, stops counting against the license, and the person can't sign in any more (unless they are the owner). It is refused while the termination check (get_termination_check) has pending items; then the leaving record is kept, the offboarding checklist starts, and HR, the manager and key staff are told as Notifications setup says.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger terminated_onrequiredstring Last working day, YYYY-MM-DD. termination_typerequiredstring
resignation | dismissal | end_of_contract | other | retirement | transfernotestring termination_reason_idinteger A specific reason (setup list termination-reasons); it decides the termination type. custom_fieldsobject Custom fields shown at end of service: {"field id": "value"} (a list field takes its option index). -
transfer_employeechanges data Move an employee to another branch: the old record ends (transfer) on effective_date and a new one s...Move an employee to another branch: the old record ends (transfer) on effective_date and a new one starts there with the same number, hire date and sign-in. Returns the new record.
Argument Type Description company_idrequiredinteger employee_idrequiredinteger branch_idrequiredinteger effective_daterequiredstring YYYY-MM-DD position_idinteger work_location_idinteger department_idinteger section_idinteger project_idinteger notestring -
update_app_colorschanges data Changes the mobile app colors of a company or one of its branches (app_colors.manage): primary (butt...Changes the mobile app colors of a company or one of its branches (app_colors.manage): primary (buttons, active tabs, links), secondary (header, titles), as #RRGGBB. Only what is given changes; empty follows the level above; reset=true clears both. The admins are told. Same as PATCH and DELETE /api/v1/app/companies/{company}/settings/app-colors.
Argument Type Description company_idrequiredinteger branch_idinteger One branch's own colors; none: the company's. The main branch uses the company's. primarystring #RRGGBB for buttons, active tabs and links. Empty: follow the level above. secondarystring #RRGGBB for the header and titles. Empty: follow the level above. resetboolean Clear both colors at this level. -
update_company_appearancechanges data System preferences → Appearance (settings.manage): the company's default look for everyone, and allo...System preferences → Appearance (settings.manage): the company's default look for everyone, and allow_user_override (may people choose their own). Only the options given change; empty follows the platform. Same as PATCH /api/v1/app/companies/{company}/settings/appearance.
Argument Type Description company_idrequiredinteger allow_user_overrideboolean modestring
| light | dark | systemEmpty: follow the level above. layoutstring
| default | mini | detached | modern | transparent | horizontal | horizontal-single | horizontal-overlay | horizontal-box | horizontal-fullwidth | horizontal-sidemenu | twocolumn | stackedEmpty: follow the level above. colorstring
| primary | brightblue | lunargreen | lavendar | magenta | chromeyellow | lavaredEmpty: follow the level above. sidebarstring
| light | brand | darkgreen | darkgray | royalblue | indigoEmpty: follow the level above. topbarstring
| white | darkaqua | whiterock | rockblue | bluehaze | orangegradient | purplegradient | bluegradient | maroongradientEmpty: follow the level above. topbarcolorstring
| white | primary | blackpearl | maroon | bluegem | fireflyEmpty: follow the level above. cardstring
| bordered | borderless | shadowEmpty: follow the level above. sizestring
| default | compactEmpty: follow the level above. widthstring
| fluid | boxEmpty: follow the level above. loaderstring
| enable | disableEmpty: follow the level above. -
update_log_retentionchanges data Set how long the company keeps its activity log: 6, 12 or 24 months, or forever (only the choices un...Set how long the company keeps its activity log: 6, 12 or 24 months, or forever (only the choices under Mihnaro's maximum). Older entries are deleted by the nightly cleanup, which logs itself. Shorter retention deletes history for good: confirm with the user first.
Argument Type Description company_idrequiredinteger retentionrequiredstring
6 | 12 | 24 | forever -
update_my_appearancechanges data The signed-in person's own layout, colors and mode, when their company lets people choose. Only the...The signed-in person's own layout, colors and mode, when their company lets people choose. Only the options given change; empty follows the company. Same as PATCH /api/v1/app/me/appearance.
Argument Type Description company_idrequiredinteger modestring
| light | dark | systemEmpty: follow the level above. layoutstring
| default | mini | detached | modern | transparent | horizontal | horizontal-single | horizontal-overlay | horizontal-box | horizontal-fullwidth | horizontal-sidemenu | twocolumn | stackedEmpty: follow the level above. colorstring
| primary | brightblue | lunargreen | lavendar | magenta | chromeyellow | lavaredEmpty: follow the level above. sidebarstring
| light | brand | darkgreen | darkgray | royalblue | indigoEmpty: follow the level above. topbarstring
| white | darkaqua | whiterock | rockblue | bluehaze | orangegradient | purplegradient | bluegradient | maroongradientEmpty: follow the level above. topbarcolorstring
| white | primary | blackpearl | maroon | bluegem | fireflyEmpty: follow the level above. cardstring
| bordered | borderless | shadowEmpty: follow the level above. sizestring
| default | compactEmpty: follow the level above. widthstring
| fluid | boxEmpty: follow the level above. loaderstring
| enable | disableEmpty: follow the level above. -
update_my_preferenceschanges data Set the signed-in user's own language (en or ar) and theme (light, dark or system). Saved on the acc...Set the signed-in user's own language (en or ar) and theme (light, dark or system). Saved on the account, so it applies on every device. Only the fields given change.
Argument Type Description localestring
en | arInterface language. themestring
light | dark | systemsystem follows the device setting. -
update_sign_in_settingschanges data Change the company's sign-in security. Send only what changes. Two-step verification; the company's...Change the company's sign-in security. Send only what changes. Two-step verification; the company's own password policy (pw_*: it only tightens Mihnaro's); single sign-on on or off, its protocol (oidc or saml), OpenID Connect issuer URL and client ID, SAML provider entity ID, sign-in URL and email attribute; "SSO only" (no password sign-in except for the exempt users; turning it on exempts you) and the exempt user ids. The OIDC client secret and the SAML certificate or metadata can't be set here on purpose: enter them on the screen or through the API.
Argument Type Description company_idrequiredinteger two_factor_requiredboolean sso_enabledboolean sso_namestring sso_issuerstring sso_client_idstring sso_protocolstring
oidc | samlsso_onlyboolean No password sign-in for this company, except the exempt users. Needs single sign-on on. sso_exempt_user_idsarray The whole list of user ids still allowed a password (replaces it). saml_idp_entity_idstring saml_idp_sso_urlstring The provider's HTTP-Redirect sign-in URL (https). saml_email_attributestring The attribute holding the email; empty = the usual ones, then the NameID. pw_min_lengthinteger 6-64. pw_upperboolean pw_lowerboolean pw_numbersboolean pw_specialboolean pw_max_age_daysinteger 0 = never expire, up to 365. pw_reuseinteger The last N passwords can't be reused, 0-24. pw_max_attemptsinteger Failed sign-ins before the account locks, 3-20; 0 = Mihnaro's. pw_lock_minutesinteger Lock length in minutes, up to 1440; 0 = Mihnaro's. -
whoamiread only The signed-in company user and the companies they belong to, with whether each can be accessed now.The signed-in company user and the companies they belong to, with whether each can be accessed now.
No arguments.
https://api.mihnaro.com/mcp/platform
155 tools
-
add_backup_folder_destinationchanges data Add another folder on this server as a backup destination (docs/backups.md). A full path outside the...Add another folder on this server as a backup destination (docs/backups.md). A full path outside the app and web folders, empty or new. It does not survive losing the server. S3 and SFTP take keys, so they are added in the panel or the API.
Argument Type Description namerequiredstring pathrequiredstring A full path, for example /var/backups/mihnaro. enabledboolean keep_dailyinteger keep_weeklyinteger keep_monthlyinteger -
add_licensechanges data Renew or change a company's license by adding a new one (history is kept). It applies from its start...Renew or change a company's license by adding a new one (history is kept). It applies from its start date. max_branches cannot be lower than the branches the company already has.
Argument Type Description company_idrequiredinteger modulesrequiredarray max_employeesrequiredinteger Maximum active employees across all branches. max_branchesrequiredinteger starts_onrequiredstring YYYY-MM-DD ends_onrequiredstring YYYY-MM-DD notesstring -
archive_leadchanges data Archive a contact-form message (it leaves the Inbox and its counts; a soft delete, nothing is delete...Archive a contact-form message (it leaves the Inbox and its counts; a soft delete, nothing is deleted) or restore an archived one. action: archive or restore.
Argument Type Description lead_idrequiredinteger actionrequiredstring
archive | restore -
buddy_punching_defaultschanges data The platform default of each buddy-punching layer, which every company has until it sets its own (pl...The platform default of each buddy-punching layer, which every company has until it sets its own (platform.app_control, docs/attendance-security.md §19). All start off. action get: each layer's mode and settings, and the companies with their own. action set with layer bp_face|bp_device_key|bp_presence|bp_pattern and mode off|flag|refuse (bp_pattern can only flag), plus the layer's settings. Same API: GET platform/buddy-punching, PUT platform/buddy-punching/{layer}.
Argument Type Description actionrequiredstring
get | setlayerstring
bp_face | bp_device_key | bp_presence | bp_patternmodestring
off | flag | refuse -
calculate_hrread only Run one of mihnaro.com's free HR calculators for a country (ISO code, default IQ; list_calculator_co...Run one of mihnaro.com's free HR calculators for a country (ISO code, default IQ; list_calculator_countries lists the ones with rules) and get the breakdown, the total and the rules used, each with its source and basis "law" (verified on an official page), "confirmed" (the company accountant), "owner" (the owner, 2026-11-02) or "estimate". A calculator runs only when every rule it uses is verified against an official source; otherwise the answer is an error with code "not_confirmed", the rules not confirmed and the country's "requires confirmation" list. Results are not legal or tax advice; nothing is stored. tool: end-of-service (start_date, end_date as Y-m-d, basic; optional days_per_year, leaving_reason termination|resignation, min_years, unused_leave_days) | net-salary (basic; allowances, marital_status single|married, ss_employee_percent) | gross-salary (net; allowances, marital_status, ss_employee_percent) | overtime (basic; hours, rest_day_hours, holiday_hours, multiplier, rest_day_multiplier, holiday_multiplier, hours_per_day) | leave (basic; encash_days, unpaid_days, day_base) | cost-to-company (basic; allowances, other_monthly, annual_extras, marital_status, ss_employee_percent, ss_employer_percent). Some countries add region (state, province or region code), children (household tax) or month (1–12, cumulative tax) to the salary tools. The inputs a country takes are in list_hr_calculators. Money is monthly, in the country's currency. Same as GET /api/v1/tools/calculators/{tool}.
Argument Type Description toolrequiredstring
end-of-service | net-salary | gross-salary | overtime | leave | cost-to-companyinputsrequiredobject The tool's inputs, e.g. {"basic": 1500000, "allowances": 300000}. countrystring ISO country code, e.g. "SA". Default IQ. variantstring The country's rule variant when it has more than one (e.g. "saudi", "non-saudi"); default its first. datestring Use the rules in force on this day (Y-m-d); default today. -
cancel_broadcastchanges data Cancel a platform broadcast that hasn't started yet: a scheduled one, or one still waiting for the q...Cancel a platform broadcast that hasn't started yet: a scheduled one, or one still waiting for the queue (docs/platform-control.md).
Argument Type Description broadcast_idrequiredinteger -
check_company_field_availabilityread only Whether a value is free before creating or editing a company: name_en / name_ar (compared without ca...Whether a value is free before creating or editing a company: name_en / name_ar (compared without case, spaces, punctuation, Arabic diacritics or tatweel, with alef forms, taa marbuta/haa and yaa/alef maqsura folded; either name of another company counts), slug, owner_email (any account's email), personal_email, phone (E.164; 0770… is read as Iraqi), tax_number (another company's branch), company_email (another company's contact email). Returns available, the normalized value, the message and the company that holds it. Pass company_id / user_id when editing so their own values don't count. create_company and update_company refuse taken values with the same messages.
Argument Type Description fieldrequiredstring
name_en | name_ar | slug | owner_email | personal_email | phone | tax_number | company_emailvaluerequiredstring company_idinteger The company being edited. user_idinteger The account being edited. -
choose_login_designchanges data Set which sign-in design each area uses; only the areas given change. Live immediately. Same as PATC...Set which sign-in design each area uses; only the areas given change. Live immediately. Same as PATCH /api/v1/platform/login-designs/areas.
Argument Type Description appstring
classic | illustration | minimal | command | cardapp.mihnaro.com sign-in pages adminstring
classic | illustration | minimal | command | cardadmin.mihnaro.com sign-in demostring
classic | illustration | minimal | command | carddemo.mihnaro.com entry page -
company_deletion_previewread only What deleting a company would lose: its payroll runs, attendance records, employees and accounts; re...What deleting a company would lose: its payroll runs, attendance records, employees and accounts; real: true means delete_company needs force. Needs platform.companies.
Argument Type Description company_idrequiredinteger -
create_calculator_rule_setchanges data Create a calculator rule set as a draft: a new country (country_code ISO), a variant of one (variant...Create a calculator rule set as a draft: a new country (country_code ISO), a variant of one (variant slug + variant_label {en, ar}, e.g. nationals and expatriates) or a new version from a date (effective_from Y-m-d, copy_from the id to copy). Optional rules, sources, notes and requires_confirmation as in update_calculator_rule_set. Publish it with publish_calculator_rule_set. Same as POST /api/v1/platform/calculator-rule-sets.
Argument Type Description country_coderequiredstring effective_fromrequiredstring Y-m-d variantstring variant_labelobject copy_frominteger rulesobject sourcesobject notesobject requires_confirmationarray What is not confirmed yet: [{rules: [rule keys or group names], reason {en, ar}, needed {en, ar}}]; [] or null for none -
create_companychanges data Onboard a customer company: creates the company, its first license, its main branch and the company...Onboard a customer company: creates the company, its first license, its main branch and the company admin (owner). Returns the owner's one-time temporary password when a new user was created; they must change it at first sign-in.
Argument Type Description namerequiredobject slugrequiredstring Unique URL-safe id, e.g. "alfaris-trading". countryrequiredstring
AD | AE | AF | AG | AI | AL | AM | AO | AQ | AR | AS | AT | AU | AW | AX | AZ | BA | BB | BD | BE | BF | BG | BH | BI | BJ | BL | BM | BN | BO | BQ | BR | BS | BT | BW | BY | BZ | CA | CC | CD | CF | CG | CH | CI | CK | CL | CM | CN | CO | CR | CU | CV | CW | CX | CY | CZ | DE | DJ | DK | DM | DO | DZ | EC | EE | EG | EH | ER | ES | ET | FI | FJ | FK | FM | FO | FR | GA | GB | GD | GE | GF | GG | GH | GI | GL | GM | GN | GP | GQ | GR | GS | GT | GU | GW | GY | HK | HN | HR | HT | HU | ID | IE | IL | IM | IN | IO | IQ | IR | IS | IT | JE | JM | JO | JP | KE | KG | KH | KI | KM | KN | KP | KR | KW | KY | KZ | LA | LB | LC | LI | LK | LR | LS | LT | LU | LV | LY | MA | MC | MD | ME | MF | MG | MH | MK | ML | MM | MN | MO | MP | MQ | MR | MS | MT | MU | MV | MW | MX | MY | MZ | NA | NC | NE | NF | NG | NI | NL | NO | NP | NR | NU | NZ | OM | PA | PE | PF | PG | PH | PK | PL | PM | PN | PR | PS | PT | PW | PY | QA | RE | RO | RS | RU | RW | SA | SB | SC | SD | SE | SG | SH | SI | SJ | SK | SL | SM | SN | SO | SR | SS | ST | SV | SX | SY | SZ | TC | TD | TF | TG | TH | TJ | TK | TL | TM | TN | TO | TR | TT | TV | TW | TZ | UA | UG | UM | US | UY | UZ | VA | VC | VE | VG | VI | VN | VU | WF | WS | YE | YT | ZA | ZM | ZWISO country code of the company. timezonestring IANA timezone. Defaults to the country's. notesstring Internal notes. licenserequiredobject main_branchrequiredobject ownerrequiredobject -
create_platform_adminchanges data Add a Mihnaro platform admin (name, email, permissions). Returns a temporary password once; they cho...Add a Mihnaro platform admin (name, email, permissions). Returns a temporary password once; they choose their own at the first sign-in. An email of a company account is refused; a former platform admin gets the access back. Needs platform.admins.
Argument Type Description namerequiredstring emailrequiredstring permissionsarray -
delete_backup_destinationchanges data Remove a backup destination (docs/backups.md). New copies stop going there; copies already stored th...Remove a backup destination (docs/backups.md). New copies stop going there; copies already stored there stay there. Refused for the only destination that is on.
Argument Type Description destination_idrequiredinteger -
delete_companycan delete Delete a company (docs/company-management.md). Needs confirm_name (its English or Arabic name, or it...Delete a company (docs/company-management.md). Needs confirm_name (its English or Arabic name, or its slug, typed exactly) and confirm: true. Refused while it has payroll runs or attendance unless force: true. A backup of every row is written first; the company is hidden at once and can be restored (restore_company) for the restore window (30 days), then it is removed for good. The other platform admins are emailed. Call company_deletion_preview first to see what it holds. Needs platform.companies.
Argument Type Description company_idrequiredinteger confirm_namerequiredstring The company's English or Arabic name, or its slug, typed exactly. confirmrequiredboolean The second confirmation: true. forceboolean Delete although it has payroll runs or attendance. reasonstring -
delete_licensecan delete Delete a license entered by mistake. Refused for the company's only license and for the license in e...Delete a license entered by mistake. Refused for the company's only license and for the license in effect (add a newer one or suspend it first). Kept in the activity log. Needs platform.companies.
Argument Type Description company_idrequiredinteger license_idrequiredinteger -
delete_officecan delete Delete an office from the contact page. To hide it for now, use save_office with is_visible false in...Delete an office from the contact page. To hide it for now, use save_office with is_visible false instead.
Argument Type Description office_idrequiredinteger -
delete_plancan delete Delete a pricing plan. To take it off the site for now, use save_plan with is_active false instead.Delete a pricing plan. To take it off the site for now, use save_plan with is_active false instead.
Argument Type Description plan_idrequiredinteger -
delete_sectioncan delete Delete a page section. To hide it for now, use save_section with is_visible false.Delete a page section. To hide it for now, use save_section with is_visible false.
Argument Type Description section_idrequiredinteger -
delete_system_announcementcan delete Delete a system announcement that nobody has seen yet. One that was already shown can only be switch...Delete a system announcement that nobody has seen yet. One that was already shown can only be switched off (save_system_announcement with is_active false), so its numbers stay.
Argument Type Description idrequiredinteger -
device_data_defaultschanges data The platform defaults every company has until it sets its own in Mobile app rules (platform.app_cont...The platform defaults every company has until it sets its own in Mobile app rules (platform.app_control, docs/platform-control.md «الموقع شرط لفتح التطبيق» and «بيانات الهاتف»). action get: location_required {enabled, precise, reason_en, reason_ar} (the app shows a full-screen gate until location is on, and the server refuses the company's app calls with location_required; never for demo or store-reviewer accounts), categories {device|network|battery|permissions|security|time|locale|health: {enabled, retention_days 7–730}}, and the companies with their own. action set: any of location_required and categories (only what is given changes). Same API: GET/PUT /api/v1/platform/device-data.
Argument Type Description actionrequiredstring
get | setlocation_requiredobject {enabled, precise, reason_en, reason_ar} categoriesobject {category: {enabled, retention_days}} -
end_support_sessionchanges data End a support session now; the admin is taken out of the company on their next click.End a support session now; the admin is taken out of the company on their next click.
Argument Type Description support_session_idrequiredinteger -
event_location_defaultchanges data Keeping the phone's own GPS point with app sign-ins, app opens and version changes, the platform def...Keeping the phone's own GPS point with app sign-ins, app opens and version changes, the platform default (platform.app_control, docs/platform-control.md «موقع الأحداث»): what every company has until it sets its own in Mobile app rules (policy event_location). action get: mode, who changed it last, and the companies with their own setting. action set: mode auto (on for companies with live location or the clock-in geofence) | on | off. Only from people who already allowed location on the phone; demo and store-reviewer accounts are never recorded; points older than 10 minutes or from a fake-location app are dropped.
Argument Type Description actionrequiredstring
get | setmodestring
auto | on | off -
export_platform_notification_logread only The platform notifications log as a file (platform.notifications, docs/notifications.md), as GET /ap...The platform notifications log as a file (platform.notifications, docs/notifications.md), as GET /api/v1/platform/notification-log/export: tab notices, broadcasts or emails with the same filters as list_platform_notification_log (at most 10,000 rows), or send (a notice id) for that notice's recipients. format csv (default) or xlsx. Returns filename, mime, size and the file as base64.
Argument Type Description tabstring
notices | broadcasts | emailsformatstring
csv | xlsxsendinteger fromstring tostring companyinteger categorystring channelstring statusstring kindstring qstring -
get_ai_settingsread only The platform AI provider, model and on/off switch (docs/ai.md), and whether a key is saved. The key...The platform AI provider, model and on/off switch (docs/ai.md), and whether a key is saved. The key itself is never returned.
No arguments.
-
get_app_debug_reportread only One phone diagnostics report in full (docs/mobile-debug.md): the phone's state (version, server, acc...One phone diagnostics report in full (docs/mobile-debug.md): the phone's state (version, server, account, permissions, push, location and camera permission, offline drafts, clock skew, certificate pins) and its recent requests (method, path, status, time) and errors. Redacted: no tokens, passwords, bodies, photos, face data or coordinates.
Argument Type Description idrequiredinteger The report id. -
get_app_person_activityread only One person's phones with the Mihnaro app and their sign-in activity (docs/platform-control.md "Phone...One person's phones with the Mihnaro app and their sign-in activity (docs/platform-control.md "Phone activity"): each phone as in list_app_phones (version, state, push, first and last IP with the local GeoIP place) with its latest 30 events, and other_activity: events not tied to a known phone (sign-ins from an app too old to send its device id). user_id is required. Needs platform.app_control. Plus map_points, the events map (docs/platform-control.md «خريطة الأحداث»): [{type clock_in|clock_out|field_photo|sign_in|sign_in_failed|sign_out|app_open|other, event, at, lat, lng, approximate (true = a city from the local GeoIP for the event's IP), accuracy, place, event_id (its timeline row), install_id}], newest first; GPS points (punches, Field proof photos) only with the location permission (map_gps). Event GPS (docs/platform-control.md «موقع الأحداث»): every event row has has_gps (whether the app sent its own GPS point with it: sign_in, app_open, version_changed); with the location permission (platform.phones.location, or live_location.view in scope) the row also carries location {lat, lng, accuracy, at, source app_event, mocked}. Without it only the IP place shows, which is approximate (a city). map_points now also include live-location pings (type live) and the app's own GPS with events; each point has source punch|live|field|app_event|ip (ip = approximate, from the IP); map_gps_hidden = GPS points exist that this viewer may not see.
Argument Type Description user_idrequiredinteger -
get_app_person_contextread only A person's phone details from the Mihnaro app across companies (platform.app_control, docs/platform-...A person's phone details from the Mihnaro app across companies (platform.app_control, docs/platform-control.md «بيانات الهاتف»): phones with location_state and the latest of each category (device, network, battery, permissions, security, time, locale, health), and the history [{at, trigger open|resume|sign_in|punch, category, data}]. Filters: install_id, category, limit. Same API: GET /api/v1/platform/app-fleet/people/{id}/context.
Argument Type Description user_idrequiredinteger install_idinteger categorystring
device | network | battery | permissions | security | time | locale | healthlimitinteger -
get_app_releasesread only The mobile app release rules (docs/platform-control.md): per platform (android, ios) the latest and...The mobile app release rules (docs/platform-control.md): per platform (android, ios) the latest and minimum version, the version actually required (the latest when update_mode is force), the store link and message; plus each company's own rule (stricter or exempt), the versions a minimum can be picked from (known_versions), and each store's last check (store_checks; the latest version is read from the stores, never typed). Pass platform and version to see what that version would get: ok, suggest or force; add company_id for that company's rule.
Argument Type Description platformstring
android | iosversionstring company_idinteger -
get_app_update_impactread only Before forcing a mobile app update (docs/platform-control.md): how many signed-in phones and people...Before forcing a mobile app update (docs/platform-control.md): how many signed-in phones and people would get the update screen (426) if the platform required this version, against how many are blocked today. Without version: forcing today's latest version. Company rules (stricter, exempt) still apply; phones that never reported their version are counted as unknown, not blocked.
Argument Type Description platformrequiredstring
android | iosversionstring -
get_backup_connect_linkchanges data A link for the admin to open in a browser signed in to the panel, to connect a Google Drive, OneDriv...A link for the admin to open in a browser signed in to the panel, to connect a Google Drive, OneDrive or Dropbox destination to his own account (docs/backups.md). The sign-in happens on the service. It lasts 15 minutes. The link holds no secret.
Argument Type Description destination_idrequiredinteger -
get_backup_runread only One backup in full (docs/backups.md): its parts and checksums, each copy, the row count of every tab...One backup in full (docs/backups.md): its parts and checksums, each copy, the row count of every table, and its restore tests.
Argument Type Description run_idrequiredinteger -
get_backup_statusread only The automatic backups now (docs/backups.md): settings, next run, problems, the 3-2-1-1-0 checks, RPO...The automatic backups now (docs/backups.md): settings, next run, problems, the 3-2-1-1-0 checks, RPO and measured RTO, last good backup, last restore test, and destinations. Never holds a secret.
No arguments.
-
get_broadcast_previewread only Before a platform broadcast (docs/platform-control.md): how many people the audience reaches, how ma...Before a platform broadcast (docs/platform-control.md): how many people the audience reaches, how many have the mobile app (and how many working phones), how many have an email, and push status (enabled, fcm.configured, apns.configured: sent straight to Google and Apple). company_ids empty = every company; roles (owners, hr, employees) empty = everyone; user_ids, branch_ids, install_ids, platform, version_state and version narrow it to those people, branches and phones.
Argument Type Description company_idsarray rolesarray user_idsarray branch_idsarray install_idsarray platformstring
android | iosversion_statestring
below_min | outdated | latest | newer | store_unknown | unknownversionstring -
get_calculator_countryread only One country's calculator rules in force (per variant): every rule's value, its source (law, article,...One country's calculator rules in force (per variant): every rule's value, its source (law, article, official URL, the date it was read) and whether it is verified, the tools available and notes. available=false when the country has no rules yet. Same as GET /api/v1/tools/countries/{code}.
Argument Type Description countryrequiredstring ISO code ("JO") or the site's address part ("jordan"). -
get_calculator_ratesread only Read a country's rates in force for mihnaro.com's free HR calculators (country ISO code, default IQ;...Read a country's rates in force for mihnaro.com's free HR calculators (country ISO code, default IQ; variant when it has more than one): social security, income tax brackets and allowances, overtime rates, salary divisors and end of service. Sources and verified marks: get_calculator_rule_set.
Argument Type Description countrystring ISO code; default IQ. variantstring -
get_calculator_rule_setread only One calculator rule set with its rules, each rule source (law en/ar, article, url, as_of, verified,...One calculator rule set with its rules, each rule source (law en/ar, article, url, as_of, verified, verified_by, verified_at, note) and its change history. Same as GET /api/v1/platform/calculator-rule-sets/{id}.
Argument Type Description idrequiredinteger -
get_companyread only Get one company with its current license, full license history, branches and owners.Get one company with its current license, full license history, branches and owners.
Argument Type Description company_idrequiredinteger The company id. -
get_contact_settingsread only The contact page settings: form topics (interests, each with the team that gets its email: sales, su...The contact page settings: form topics (interests, each with the team that gets its email: sales, support or hello), company sizes, recipients per team, default phone country, auto-reply template, search-engine title/description, Turnstile and Google Maps keys. The Turnstile secret is never returned (has_turnstile_secret says whether it is set).
No arguments.
-
get_domainsread only Mihnaro's six domains (marketing, app, admin, api, help, demo) with each one's address, and the live...Mihnaro's six domains (marketing, app, admin, api, help, demo) with each one's address, and the live demo's state: enabled, ready, when it was last rebuilt and its nightly reset time.
No arguments.
-
get_flash_messagesread only How the web app shows its save, edit, delete and error messages, for everyone (docs/flash-messages.m...How the web app shows its save, edit, delete and error messages, for everyone (docs/flash-messages.md): position (top-center, top-start, top-end, center, bottom), duration_seconds (2 to 30), auto_close. Errors stay until closed whatever is set. last_change {by, at} is null while it is the default.
No arguments.
-
get_leadread only One contact-form message with its sender, topic, status, notes, assignee and whether the emails went...One contact-form message with its sender, topic, status, notes, assignee and whether the emails went out (mail_error says why not). Archived messages too (archived: true).
Argument Type Description lead_idrequiredinteger -
get_login_designsread only List the sign-in page designs (classic, illustration, minimal, command, card), which one the app, ad...List the sign-in page designs (classic, illustration, minimal, command, card), which one the app, admin and demo use, each design's editable fields, saved values and what it shows in English and Arabic, and the built-in illustrations. Same as GET /api/v1/platform/login-designs.
No arguments.
-
get_mail_healthread only Is email going anywhere (docs/mail.md): status ok | failing | not_delivering, the sending method (dr...Is email going anywhere (docs/mail.md): status ok | failing | not_delivering, the sending method (driver "log" and "disabled" deliver nothing), a plain message, counts for the last 24 hours (sent, logged, queued, failed), how many wait in the queue, and the last failure. "sent" means handed to the SMTP server, not proof of reaching an inbox.
No arguments.
-
get_messaging_statusread only Email and WhatsApp settings without secrets: driver, sender details, whether a password/token is sav...Email and WhatsApp settings without secrets: driver, sender details, whether a password/token is saved, and whether each channel is ready to send reset links.
No arguments.
-
get_platform_appearanceread only The theme customizer's platform default (layout, color, sidebar, topbar, topbarcolor, card, size, wi...The theme customizer's platform default (layout, color, sidebar, topbar, topbarcolor, card, size, width, loader, mode) for every company and the admin panel, and every allowed value. Same as GET /api/v1/platform/appearance.
No arguments.
-
get_platform_limitsread only Every limit at platform level (docs/limits.md): file sizes, counts and lengths, each with its defaul...Every limit at platform level (docs/limits.md): file sizes, counts and lengths, each with its default, its allowed range, the value saved and the server's ceiling for files.
No arguments.
-
get_security_policyread only Read the security policy: lockout, password rules and expiry, reset links, sessions and "Remember me...Read the security policy: lockout, password rules and expiry, reset links, sessions and "Remember me".
No arguments.
-
get_seoread only Read the SEO center: site-wide settings (verification tokens, analytics ids, consent, JSON-LD organi...Read the SEO center: site-wide settings (verification tokens, analytics ids, consent, JSON-LD organization), every public page with its saved tags per language (key like "marketing.pricing" or "help.article"), and robots.txt per domain. Same as GET /api/v1/platform/seo.
No arguments.
-
get_server_historyread only Server metrics over time (docs/server-monitor.md), as chart series: cpu, load1, memory, swap, disk (...Server metrics over time (docs/server-monitor.md), as chart series: cpu, load1, memory, swap, disk (% of the fullest mount), disk_read/disk_write and net_rx/net_tx (bytes/s), db_connections, errors and db_timeouts (the most in one minute). range 24h = 5-minute points, 7d = hourly, 30d = 4-hourly. Kept 30 days.
Argument Type Description rangestring
24h | 7d | 30dDefault 24h. -
get_server_overviewread only The server right now (docs/server-monitor.md): CPU per core and load, RAM/swap, every disk (usage, i...The server right now (docs/server-monitor.md): CPU per core and load, RAM/swap, every disk (usage, inodes, I/O), network, uptime, hardware, services (Nginx, PHP-FPM, PostgreSQL, Cloudflare Tunnel, cron), PostgreSQL connections/sizes/long queries/locks, Laravel errors and database connection timeouts, failed jobs, the ZenHR sync, biometric devices last seen, the newest backup, HTTPS/SSL of the public sites, whether email is delivered, push status (FCM and APNs configured yes/no; sent straight to Google and Apple), and alert_values (each alert metric now). Read-only. Pass section to get one part only.
Argument Type Description sectionstring
system | services | processes | database | app | sites | mail | push | alert_valuesOnly this part of the overview. -
get_server_switchread only Whether the mobile app's hidden live/dev switch works now (docs/mobile-server-switch.md): on, until...Whether the mobile app's hidden live/dev switch works now (docs/mobile-server-switch.md): on, until (when it turns itself off; null = only by hand), by and at (who changed it last and when). Off by default. While off, 15 taps do nothing, and a phone on dev goes back to the live server at its next open.
No arguments.
-
get_sign_in_optionsread only The sign-in screen switches for the mobile app and the web sign-in page (docs/platform-control.md):...The sign-in screen switches for the mobile app and the web sign-in page (docs/platform-control.md): forgot_password, sso, privacy (true = shown). Off hides the link and the server refuses forgot-password and SSO with 403. The privacy switch only hides the sign-in link; Settings always keeps the privacy policy. last_change {by, at} is null while they are the defaults (all on).
No arguments.
-
get_site_settingsread only Read mihnaro.com settings: site name, tagline, footer, colors, fonts, currency, emails, page titles,...Read mihnaro.com settings: site name, tagline, footer, colors, fonts, currency, emails, page titles, menu and header button. Texts are {"en","ar"}.
No arguments.
-
get_zenhr_connectionchanges data A company's ZenHR connection: status, where its keys are kept, masked keys, branches and last succes...A company's ZenHR connection: status, where its keys are kept, masked keys, branches and last success. Never returns a secret. Keys are typed by a person in the panel; no MCP tool takes them.
Argument Type Description company_idrequiredinteger -
get_zenhr_healthchanges data The sync's state for a company: running, paused or idle, next run, last run, last success, failures,...The sync's state for a company: running, paused or idle, next run, last run, last success, failures, open conflicts and alerts. Times carry the company's offset (Baghdad: +03:00). Read-only.
Argument Type Description company_idrequiredinteger -
get_zenhr_payroll_comparechanges data The last payroll comparison: ZenHR's figures against Mihnaro's engine, totals only.The last payroll comparison: ZenHR's figures against Mihnaro's engine, totals only.
Argument Type Description company_idrequiredinteger -
get_zenhr_runchanges data One run: counts per type, progress while running, and the records it touched (table, reference, colu...One run: counts per type, progress while running, and the records it touched (table, reference, column names; never values).
Argument Type Description company_idrequiredinteger run_idrequiredinteger actionstring
inserted | updated | flaggedper_pageinteger -
get_zenhr_syncread only The ZenHR → Mihnaro sync of a company (until the move is final): whether it is on, whether ZenHR's A...The ZenHR → Mihnaro sync of a company (until the move is final): whether it is on, whether ZenHR's API is configured, its ZenHR branches, open flagged rows and the last 10 runs with counts per area (inserted, updated, unchanged, skipped, flagged). Counts only, never employee data.
Argument Type Description company_idrequiredinteger -
get_zenhr_totalschanges data ZenHR and Mihnaro totals per branch and list: records read through the API against the rows they bec...ZenHR and Mihnaro totals per branch and list: records read through the API against the rows they became. Counts only.
Argument Type Description company_idrequiredinteger -
list_ai_modelsread only The models the chosen AI provider offers the saved key, read live from the provider (docs/ai.md). fr...The models the chosen AI provider offers the saved key, read live from the provider (docs/ai.md). fresh: true skips the six-hour copy.
Argument Type Description freshboolean -
list_app_activityread only Phone activity (docs/platform-control.md "Phone activity"): what happened on phones with the Mihnaro...Phone activity (docs/platform-control.md "Phone activity"): what happened on phones with the Mihnaro app, newest first. Each event has event (sign_in, sign_in_failed, sign_out, app_open, version_changed, push_registered, push_result, push_test, device_pending, device_approved, device_blocked, device_reset, device_mismatch), result (ok, failed, blocked), time, person, install_id, device_id, IP and place from the local GeoIP (country, city, ASN, organisation; approximate, never looked up outside), app version, system, model, who decided (actor) and detail (a failed sign-in's reason and half-hidden login, a version change's from/to, a push error; push_result and push_test also have push_reason, the answer in plain words). Filters: user_id, install_id (a phone from list_app_phones: its own timeline), device_id, event, result, from, to (dates); page, per_page (max 200). Needs platform.app_control. Event GPS (docs/platform-control.md «موقع الأحداث»): every event row has has_gps (whether the app sent its own GPS point with it: sign_in, app_open, version_changed); with the location permission (platform.phones.location, or live_location.view in scope) the row also carries location {lat, lng, accuracy, at, source app_event, mocked}. Without it only the IP place shows, which is approximate (a city).
Argument Type Description user_idinteger install_idinteger device_idstring eventstring
sign_in | sign_in_failed | sign_out | app_open | version_changed | push_registered | push_result | push_test | device_pending | device_approved | device_blocked | device_reset | device_mismatch | shared_device_detected | shared_device_blocked | shared_device_allowed | shared_device_revoked | location_turned_offresultstring
ok | failed | blockedfromstring tostring pageinteger per_pageinteger -
list_app_debug_reportsread only Phone diagnostics (docs/mobile-debug.md): the accounts with the app's debug mode (on, until, by) and...Phone diagnostics (docs/mobile-debug.md): the accounts with the app's debug mode (on, until, by) and the newest reports their phones sent (kept 14 days). Filters: user_id, install_id, build. Read one with get_app_debug_report.
Argument Type Description user_idinteger Only this account's reports. install_idstring Only this phone's reports. buildstring Only this build number. -
list_app_phonesread only Phones and versions (docs/platform-control.md): every phone the Mihnaro app is signed in on, with it...Phones and versions (docs/platform-control.md): every phone the Mihnaro app is signed in on, with its person, companies, branches, platform, system version, model, app version and build, state (below_min = refused with 426, outdated, latest, newer = above the store's latest (a test build), store_unknown = the store's latest isn't known yet, unknown = an old app before 1.1 that never reported its version), the last GPS location (location: the newest punch, live-location ping or Field proof point from that phone; only with platform.phones.location), push status (active, failing, none; last accepted/failed and the provider's error) and first/last seen; plus the summary per platform (people per version, below the minimum, people who never opened the latest version, % on the latest). Filters: q, company_id, branch_id, platform, version, state, push, signed_in, seen_days, shared (only phones used by more than one account; each row has shared {accounts, others, list} when it is); page, per_page (max 200).
Argument Type Description qstring company_idinteger branch_idinteger platformstring
android | iosversionstring statestring
below_min | outdated | latest | newer | store_unknown | unknownpushstring
active | failing | nonesigned_inboolean sharedboolean seen_daysinteger pageinteger per_pageinteger -
list_backup_restore_testsread only The restore tests, newest first (docs/backups.md): result, where the copy came from, tables, rows an...The restore tests, newest first (docs/backups.md): result, where the copy came from, tables, rows and files compared, how long it took, and any counts that did not match.
Argument Type Description limitinteger How many, 1 to 100. Default 25. -
list_backup_runsread only The backup history, newest first (docs/backups.md): status, size, duration, checksums, copies at eac...The backup history, newest first (docs/backups.md): status, size, duration, checksums, copies at each destination, and any error.
Argument Type Description limitinteger How many, 1 to 100. Default 25. -
list_branchesread only List a company's branches with country, currency, timezone, main/active flags and logo URLs, plus ho...List a company's branches with country, currency, timezone, main/active flags and logo URLs, plus how many more the license allows.
Argument Type Description company_idrequiredinteger -
list_broadcastsread only Platform broadcasts (docs/platform-control.md), newest first, with who sent them and counts per resu...Platform broadcasts (docs/platform-control.md), newest first, with who sent them and counts per result: push accepted (Google FCM or Apple APNs took it for delivery, sent directly with no relay; not proof it was shown) | failed | no_device | not_configured (the provider of that phone has no credentials yet) | disabled (push switched off) | sent_to_expo (older sends through Expo), receipts pending | ok | error (only on older Expo sends), email sent | logged (not delivered) | queued | skipped | off (mail switched off) | failed | no_email. Pass id for one with up to 200 of its people (result filters by push result).
Argument Type Description idinteger resultstring
accepted | failed | no_device | not_configured | disabled | sent_to_expo -
list_calculator_countriesread only The countries mihnaro.com's free HR calculators have rules for: each with the tools it can run, its...The countries mihnaro.com's free HR calculators have rules for: each with the tools it can run, its variants (e.g. nationals and expatriates), currency and how many of its rules are verified. A country not listed is "not available yet". Same as GET /api/v1/tools/countries.
No arguments.
-
list_calculator_rule_setsread only Every calculator rule set of mihnaro.com (docs/calculators.md), filtered by country (ISO) and status...Every calculator rule set of mihnaro.com (docs/calculators.md), filtered by country (ISO) and status (draft|published): id, country, variant, effective_from, status, in_force, tools available, verified coverage, rules and sources. Same as GET /api/v1/platform/calculator-rule-sets.
Argument Type Description countrystring ISO code. statusstring
draft | published -
list_companiesread only List customer companies with their current license status, modules, limits and owners. Search by nam...List customer companies with their current license status, modules, limits and owners. Search by name or slug, filter by status.
Argument Type Description searchstring Part of the company name (English or Arabic) or slug. statusstring
active | suspendedOnly companies with this status. pageinteger Page number, 25 companies per page. Default 1. -
list_company_usersread only List a company's accounts a page at a time, as the admin panel's table does: search by name or email...List a company's accounts a page at a time, as the admin panel's table does: search by name or email, filter by role (admin, user) and status (active, temporary, disabled), sort (name, email, role, status, joined).
Argument Type Description company_idrequiredinteger qstring Part of a name or email. rolestring
admin | userstatusstring
active | temporary | disabledsortstring
name | email | role | status | joineddirstring
asc | descper_pageinteger
10 | 25 | 50 | 100pageinteger -
list_deleted_companiesread only The deleted companies still restorable: when and why each was deleted, whether it was forced, its ba...The deleted companies still restorable: when and why each was deleted, whether it was forced, its backup file and the date it is removed for good. Needs platform.companies.
No arguments.
-
list_hr_calculatorsread only The free HR calculators of mihnaro.com for a country (ISO code, default IQ): each tool with whether...The free HR calculators of mihnaro.com for a country (ISO code, default IQ): each tool with whether it is available there, its inputs, and the country's rates in force. Same as GET /api/v1/tools/calculators?country=.
Argument Type Description countrystring ISO country code, e.g. "AE". Default IQ. variantstring datestring Y-m-d; default today. -
list_leadsread only List messages from the mihnaro.com contact form (the admin Inbox), newest first. Filter by status (n...List messages from the mihnaro.com contact form (the admin Inbox), newest first. Filter by status (new, contacted, closed), interest key, assigned_to (admin user id) or q (name, email, company, phone). Archived messages are left out; archived: true lists only them.
Argument Type Description statusstring
new | contacted | closedintereststring assigned_tointeger qstring archivedboolean true: only archived messages. pageinteger per_pageinteger -
list_mail_deliveriesread only Emails the app handed to a mailer, newest first (docs/mail.md): recipient, subject, company, via (sm...Emails the app handed to a mailer, newest first (docs/mail.md): recipient, subject, company, via (smtp, company_smtp, log), status (sent, logged, queued, failed), attempts and the error in plain words. Filter by status or search an address/subject. Kept 90 days.
Argument Type Description statusstring
sent | logged | queued | failedqstring Part of the recipient address or the subject. limitinteger 1-100, default 30. -
list_monitor_alert_eventsread only The server alerts log, newest first (docs/server-monitor.md): fired, repeat (still lasting after the...The server alerts log, newest first (docs/server-monitor.md): fired, repeat (still lasting after the cooldown) or recovered, the value and threshold, the message, the recipients and mail_result (sent, logged = written to the server log only and not delivered, queued, skipped, failed, no_recipients).
Argument Type Description kindstring
fired | repeat | recoveredmetricstring
cpu | memory | disk | load | db_connections | db_timeouts | errors | failed_jobs | service_down | site_down | ssl_days | zenhr_sync_failed | device_offline_hours | backup_age_hourslimitinteger 1-100, default 30. -
list_monitor_alert_rulesread only Server alert rules (docs/server-monitor.md): metric, threshold (fires at_or_above, or at_or_below fo...Server alert rules (docs/server-monitor.md): metric, threshold (fires at_or_above, or at_or_below for ssl_days), for_minutes it must last, cooldown_minutes between reminders, enabled, state ok|firing and the last value; plus the recipients and the alert language.
No arguments.
-
list_officesread only List Mihnaro's offices shown on the contact page (head office first), with addresses, phones, workin...List Mihnaro's offices shown on the contact page (head office first), with addresses, phones, working hours and map coordinates. Hidden ones have is_visible false.
No arguments.
-
list_plansread only List the pricing plans on mihnaro.com in order, including hidden ones.List the pricing plans on mihnaro.com in order, including hidden ones.
No arguments.
-
list_platform_adminsread only List the Mihnaro team's platform admins with their platform permissions and status (temporary passwo...List the Mihnaro team's platform admins with their platform permissions and status (temporary password, two-step). Filter by search (name or email) or one permission. Also returns every permission there is and what it allows. Needs platform.admins.
Argument Type Description searchstring permissionstring
platform.ai | server.monitor | platform.app_control | platform.broadcast | platform.companies | platform.phones.location | platform.admins | platform.notifications | platform.zenhr | platform.flash_messages | platform.server_switch | platform.app_debug | platform.backups | platform.backups_change | platform.backups_run -
list_platform_notification_logread only The platform notifications log (platform.notifications, docs/notifications.md "سجل إشعارات المنصة"),...The platform notifications log (platform.notifications, docs/notifications.md "سجل إشعارات المنصة"), as GET /api/v1/platform/notification-log. tab notices (default): every company's notices with category, event, text en/ar, company, triggered_by, recipients, bell read counts and per channel (push, email, whatsapp) each status count (logged = written to the server log only, NOT delivered), plus summary; filters from, to, company, category, channel, status, kind, q. tab broadcasts: the Mihnaro team's push broadcasts with their results; filters from, to, q. tab emails: system emails that are not notice copies (password resets, invitations, codes, reports) from the mail log; filters from, to, company, status (sent, logged, queued, failed), q. Also returns channels: whether email, push and WhatsApp can deliver right now.
Argument Type Description tabstring
notices | broadcasts | emailsfromstring tostring companyinteger categorystring channelstring
bell | push | email | whatsappstatusstring kindstring qstring pageinteger limitinteger 1-100, default 30. -
list_sectionsread only List the sections of a mihnaro.com page in order, with their content. Also returns the section types...List the sections of a mihnaro.com page in order, with their content. Also returns the section types and their fields.
Argument Type Description pagerequiredstring
home | pricing | contact | tools | end-of-service | net-salary | gross-salary | overtime | leave | cost-to-company | salary-guide | privacy | terms | account-deletion -
list_support_sessionsread only The support audit trail of a company: every time a platform admin opened its account, with the reaso...The support audit trail of a company: every time a platform admin opened its account, with the reason, times, state and how it ended. Newest first.
Argument Type Description company_idrequiredinteger -
list_system_announcementsread only System announcements from the Mihnaro team (docs/platform-control.md), newest first, optionally by s...System announcements from the Mihnaro team (docs/platform-control.md), newest first, optionally by state (live, scheduled, ended, off). Pass id for one with its stats: audience (people it is meant for now), seen, dismissed, acknowledged.
Argument Type Description idinteger statestring
live | scheduled | ended | off -
list_zenhr_auditchanges data The sync's audit log: who changed what, when and from where. Secrets are never recorded.The sync's audit log: who changed what, when and from where. Secrets are never recorded.
Argument Type Description company_idrequiredinteger actionstring per_pageinteger -
list_zenhr_data_typeschanges data What moves: each data type with on/off, how often, starting point, how it arrives, and what the code...What moves: each data type with on/off, how often, starting point, how it arrives, and what the code cannot do. With branch_id: that branch's values.
Argument Type Description company_idrequiredinteger branch_idinteger -
list_zenhr_runschanges data The company's run history, newest first: who started each, its counts, duration and errors in plain...The company's run history, newest first: who started each, its counts, duration and errors in plain words. Paused hours are left out unless status=off.
Argument Type Description company_idrequiredinteger statusstring triggerstring per_pageinteger -
list_zenhr_sync_conflictsread only Rows the ZenHR sync flagged instead of overwriting: changed in ZenHR and also edited in Mihnaro (rea...Rows the ZenHR sync flagged instead of overwriting: changed in ZenHR and also edited in Mihnaro (reason "edited"), or imported before the baseline (reason "no_baseline"). Gives the table, row id, external_ref and the column names involved, not their values.
Argument Type Description company_idrequiredinteger statusstring
open | applied | kept | alllimitinteger offsetinteger -
move_sectionchanges data Move a page section one place up or down. Returns the sections of the page in their new order.Move a page section one place up or down. Returns the sections of the page in their new order.
Argument Type Description section_idrequiredinteger directionrequiredstring
up | down -
phone_sharing_defaultchanges data One account per phone, the platform default (platform.app_control, docs/platform-control.md «الهاتف...One account per phone, the platform default (platform.app_control, docs/platform-control.md «الهاتف المشترك»): what every company has until it sets its own in Mobile app rules. action get: mode, max_accounts, who changed it last, and the companies with their own setting. action set: mode allow (only marked as shared) | warn (sign-in goes through, the phone is flagged, the company is notified) | block (the sign-in is refused with a message to ask HR), max_accounts 1–10. Demo and store-reviewer accounts are never stopped. Shared phones themselves: list_app_phones with shared=true.
Argument Type Description actionrequiredstring
get | setmodestring
allow | warn | blockmax_accountsinteger -
publish_calculator_rule_setchanges data Publish a draft calculator rule set (action publish; from its effective_from it is the set in force)...Publish a draft calculator rule set (action publish; from its effective_from it is the set in force) or take one off the site (action unpublish). Same as POST /api/v1/platform/calculator-rule-sets/{id}/publish and /unpublish.
Argument Type Description idrequiredinteger actionstring
publish | unpublish -
remove_platform_adminchanges data Remove a platform admin's access: no admin panel, no permissions, their platform API keys revoked an...Remove a platform admin's access: no admin panel, no permissions, their platform API keys revoked and their sessions ended. The account stays; create_platform_admin with the same email gives it back. The last admin with platform.admins can't be removed. Needs platform.admins.
Argument Type Description admin_idrequiredinteger -
reset_company_user_passwordcan delete Replace a company user's password with a new temporary one they must change at next sign-in. The old...Replace a company user's password with a new temporary one they must change at next sign-in. The old password stops working immediately. Returns the temporary password once.
Argument Type Description company_idrequiredinteger user_idrequiredinteger A user of that company (see get_company owners). -
reset_democan delete Rebuild the live demo's sandbox company (demo.mihnaro.com) now with fresh fictional data, instead of...Rebuild the live demo's sandbox company (demo.mihnaro.com) now with fresh fictional data, instead of at the nightly reset. Visitors inside it are signed out.
No arguments.
-
reset_user_two_factorcan delete Turn off a company user's two-step verification (lost phone), so they set it up again. Their recover...Turn off a company user's two-step verification (lost phone), so they set it up again. Their recovery codes stop working.
Argument Type Description company_idrequiredinteger user_idrequiredinteger -
resolve_zenhr_sync_conflictcan delete Settle a row the ZenHR sync flagged: "apply" writes ZenHR's values over the Mihnaro edit; "keep" lea...Settle a row the ZenHR sync flagged: "apply" writes ZenHR's values over the Mihnaro edit; "keep" leaves Mihnaro's row and stops flagging the same ZenHR values (a later ZenHR change is flagged again).
Argument Type Description company_idrequiredinteger conflict_idrequiredinteger actionrequiredstring
apply | keep -
restore_calculator_rule_setchanges data Put a calculator rule set back to how one of its history entries (revision_id, from get_calculator_r...Put a calculator rule set back to how one of its history entries (revision_id, from get_calculator_rule_set) left it; the restore is itself kept in the history. Same as POST /api/v1/platform/calculator-rule-sets/{id}/restore/{revision}.
Argument Type Description idrequiredinteger revision_idrequiredinteger -
restore_companychanges data Restore a deleted company within its restore window: it shows again and its people can sign in. Need...Restore a deleted company within its restore window: it shows again and its people can sign in. Needs platform.companies.
Argument Type Description company_idrequiredinteger -
resume_zenhr_runchanges data Starts a new run with what a stopped or failed run was given. What it finished is not done twice.Starts a new run with what a stopped or failed run was given. What it finished is not done twice.
Argument Type Description company_idrequiredinteger run_idrequiredinteger -
retry_mail_deliverychanges data Put one failed email (from list_mail_deliveries, retryable true) back in the queue; it goes out with...Put one failed email (from list_mail_deliveries, retryable true) back in the queue; it goes out within a minute through the current settings. Only when the person asked to resend it.
Argument Type Description delivery_idrequiredinteger -
run_backupchanges data Start a backup now (docs/backups.md). It starts within a minute and never overlaps another; read get...Start a backup now (docs/backups.md). It starts within a minute and never overlaps another; read get_backup_run for its result.
No arguments.
-
run_backup_restore_testchanges data Restore one backup into a new throwaway database and compare its row counts (docs/backups.md). It st...Restore one backup into a new throwaway database and compare its row counts (docs/backups.md). It starts within a minute. It never touches a real database; there is no tool that does.
Argument Type Description run_idrequiredinteger -
run_zenhr_payroll_comparechanges data Queues a payroll comparison of the last months: recalculated and rolled back, so it changes nothing....Queues a payroll comparison of the last months: recalculated and rolled back, so it changes nothing. Takes the sync's lock.
Argument Type Description company_idrequiredinteger monthsinteger -
run_zenhr_syncchanges data Queue a ZenHR → Mihnaro sync run: one at a time, refused while another runs. source "api" reads what...Queue a ZenHR → Mihnaro sync run: one at a time, refused while another runs. source "api" reads what changed through ZenHR's API; "extraction" applies a new extraction. dry_run rolls everything back and only reports counts: do it first. data_types (list_zenhr_data_types), branch_ids and since (a date, API only, not for attendance) narrow it. Follow it with get_zenhr_run.
Argument Type Description company_idrequiredinteger sourcestring
api | extractiondry_runboolean data_typesarray branch_idsarray sincestring YYYY-MM-DD -
save_company_branchchanges data Add a branch to a company (no branch_id; within the license's branch limit) or edit one: names, code...Add a branch to a company (no branch_id; within the license's branch limit) or edit one: names, code, legal name, country, currency, timezone, city, active, main (is_main: true makes it the main branch) and the governmental details. Logos are uploaded through the API. Needs platform.companies.
Argument Type Description company_idrequiredinteger branch_idinteger Leave out to add a new branch. nameobject Required for a new branch. legal_nameobject codestring countrystring ISO code, e.g. IQ. Sets the currency and timezone unless they are given. currencystring ISO code, e.g. IQD timezonestring e.g. Asia/Baghdad citystring is_activeboolean The main branch stays on. is_mainboolean true makes it the main branch. establishment_numberstring establishment_namestring governance_locationstring ss_numberstring ss_governance_locationstring tax_numberstring addressstring po_boxstring zip_codestring mol_numberstring -
save_officechanges data Add an office (no office_id; name.en required) or change one (office_id; only the fields given chang...Add an office (no office_id; name.en required) or change one (office_id; only the fields given change). Texts are {"en","ar"}; address lines are separated by new lines. phones: list of international numbers. hours: [{"days": ["sun","mon",...], "opens": "09:00", "closes": "17:00"}]. latitude/longitude in decimal degrees. is_primary makes it the head office.
Argument Type Description office_idinteger Omit to add a new office. nameobject addressobject cityobject countryobject country_codestring postal_codestring phonesarray whatsappstring emailstring hoursarray hours_noteobject timezonestring latitudenumber longitudenumber map_zoominteger is_primaryboolean is_visibleboolean -
save_planchanges data Create a plan (no plan_id) or update one (with plan_id; only fields given change). A null price show...Create a plan (no plan_id) or update one (with plan_id; only fields given change). A null price shows as "Coming soon".
Argument Type Description plan_idinteger Omit to create a plan. slugstring Required when creating, e.g. "hrm". nameobject {"en": "...", "ar": "..."}; en required when creating. summaryobject unitobject e.g. {"en": "per employee / month"} price_monthlynumber price_yearlynumber Monthly price when billed yearly. featuresobject {"en": ["...", "..."], "ar": [...]} is_featuredboolean is_activeboolean false hides it from the site. -
save_sectionchanges data Add a section to a page (page + type, no section_id; added at the end) or replace the content of a s...Add a section to a page (page + type, no section_id; added at the end) or replace the content of a section (section_id). Content follows the fields of its type from list_sections; texts are {"en","ar"}, repeated items go in "items".
Argument Type Description section_idinteger Omit to add a new section. pagestring
home | pricing | contact | tools | end-of-service | net-salary | gross-salary | overtime | leave | cost-to-company | salary-guide | privacy | terms | account-deletionRequired when adding. typestring
hero | modules | features | plans_preview | plans | faq | cta | page_header | contact | contact_form | offices | social | calculator | tools_grid | salary_guide | textRequired when adding. contentrequiredobject The fields of the section. is_visibleboolean -
save_system_announcementchanges data Create a system announcement shown after sign-in (docs/platform-control.md), or change one by id (on...Create a system announcement shown after sign-in (docs/platform-control.md), or change one by id (only what is passed changes; is_active false withdraws it). New ones need title_en, title_ar, body_en, body_ar, severity (info|warning|critical), starts_at, channel (web|app|both) and display (dismissible|acknowledge). ends_at optional. company_ids empty = every company; roles (owners, hr, employees) empty = everyone.
Argument Type Description idinteger title_enstring title_arstring body_enstring body_arstring severitystring
info | warning | criticalstarts_atstring ends_atstring company_idsarray rolesarray channelstring
web | app | bothdisplaystring
dismissible | acknowledgeis_activeboolean existing_onlyboolean Only accounts made before it starts: for news about a change, so a new employee doesn't see it. -
send_app_update_reminderchanges data "Please update" (docs/platform-control.md): a push to the people whose phone on this platform runs a..."Please update" (docs/platform-control.md): a push to the people whose phone on this platform runs an older version than the latest (version_state outdated, the default) or one below the minimum (below_min), linking to the store, with the release's update message (or a default text). Needs platform.app_control and platform.broadcast. Goes out in the background; follow it with list_broadcasts.
Argument Type Description platformrequiredstring
android | iosversion_statestring
outdated | below_min -
send_broadcastchanges data Send a push notification (and optionally an email) to every company or chosen ones (docs/platform-co...Send a push notification (and optionally an email) to every company or chosen ones (docs/platform-control.md). Check get_broadcast_preview first. Needs title_en, title_ar, body_en, body_ar; url (an app path starting with / or an https link, opened on tap) optional; push (default true), email (default false). Narrow it with user_ids, branch_ids, install_ids (phones from list_app_phones), platform, version_state (outdated, below_min, latest, unknown = an old app before 1.1 that never reported its version) or version (exact); scheduled_at (a future date and time) sends it later; test=true sends it now only to your own phones and email. Images are added from the admin panel or the API (an uploaded file). It goes out in the background in batches; follow it with list_broadcasts. "accepted" means Google (FCM) or Apple (APNs) took it for delivery, sent straight from the server; it is not proof the phone showed it. iPhones get nothing until APNs is configured (see get_server_overview push).
Argument Type Description title_enrequiredstring title_arrequiredstring body_enrequiredstring body_arrequiredstring urlstring pushboolean emailboolean scheduled_atstring testboolean company_idsarray rolesarray user_idsarray branch_idsarray install_idsarray platformstring
android | iosversion_statestring
below_min | outdated | latest | newer | store_unknown | unknownversionstring -
send_phone_test_pushchanges data One test notification to one phone (docs/notifications.md «الإشعار التجريبي»): install_id from list_...One test notification to one phone (docs/notifications.md «الإشعار التجريبي»): install_id from list_app_phones. Straight to Apple or Google, nothing in the bell, logged on the phone's timeline (push_test) with who sent it. Returns sent and, per token: provider, status (ok, invalid, error), error, environment (which of Apple's servers took it), fallback (the first server refused it) and reason in plain words. "ok" means accepted for delivery, not shown on screen. At most 5 a minute per phone. Needs platform.app_control.
Argument Type Description install_idrequiredinteger -
send_test_emailchanges data Send one test email through the platform email settings saved in Admin → Security and messaging (doc...Send one test email through the platform email settings saved in Admin → Security and messaging (docs/mail.md). A failure says why in plain words (wrong username or password, connection refused, encryption and port mismatch, sender refused…). result "sent" means the server accepted it (not that it reached the inbox); "logged" means it was only written to the server log. Only send when the person asked for a test.
Argument Type Description torequiredstring -
set_company_app_rulechanges data One company's own mobile app update rule (docs/platform-control.md). mode stricter: its people need...One company's own mobile app update rule (docs/platform-control.md). mode stricter: its people need at least min_android / min_ios (or the platform minimum if higher); exempt: they are never blocked for an old version; none: remove the rule.
Argument Type Description company_idrequiredinteger moderequiredstring
stricter | exempt | nonemin_androidstring min_iosstring notestring -
set_company_user_accesschanges data Switch a company account on or off (is_active) and make it a company admin or not (is_owner). The co...Switch a company account on or off (is_active) and make it a company admin or not (is_owner). The company always keeps one active company admin; a platform admin can't be one. Logged. Needs platform.companies.
Argument Type Description company_idrequiredinteger user_idrequiredinteger is_activeboolean is_ownerboolean -
set_monitor_alert_recipientschanges data Who receives server alerts (docs/server-monitor.md): the full list of addresses (replaces the saved...Who receives server alerts (docs/server-monitor.md): the full list of addresses (replaces the saved one; an empty list stops alert emails) and the language, en or ar. Only addresses the person gave. While email is in log mode nothing is delivered (see get_mail_health).
Argument Type Description recipientsrequiredarray languagestring
en | ar -
set_zenhr_emergency_stopchanges data The emergency stop: on stops every company's sync at once, a run in progress included; off lifts it.The emergency stop: on stops every company's sync at once, a run in progress included; off lifts it.
Argument Type Description onrequiredboolean -
show_platform_notification_logread only One company notice of the platform notifications log in full (platform.notifications, docs/notificat...One company notice of the platform notifications log in full (platform.notifications, docs/notifications.md), as GET /api/v1/platform/notification-log/{id}: the send, every person with branch, bell (read and when), push (per phone what Google/Apple answered), email (status, mail log row with via, attempts and error) and WhatsApp, and the receiver emails.
Argument Type Description idrequiredinteger -
start_support_sessionchanges data Open a support session in a company as the signed-in platform admin. Returns a one-time entry_url (v...Open a support session in a company as the signed-in platform admin. Returns a one-time entry_url (valid 2 minutes) that signs the admin into the company's account in a browser. Give the link only to that admin. A reason is required and is kept in the audit trail.
Argument Type Description company_idrequiredinteger reasonrequiredstring Why support is entering, e.g. a ticket number (5-500 characters). -
stop_zenhr_runchanges data Stops a queued or running run. A running one stops at its next safe place; what finished stays.Stops a queued or running run. A running one stops at its next safe place; what finished stays.
Argument Type Description company_idrequiredinteger run_idrequiredinteger -
submit_contact_leadchanges data Add a message to the Inbox as if sent from the contact form (e.g. a lead taken by phone), and email...Add a message to the Inbox as if sent from the contact form (e.g. a lead taken by phone), and email the team that handles its topic. interest is a key from get_contact_settings; phone_country an ISO code (IQ by default); consent must be true.
Argument Type Description namerequiredstring emailrequiredstring interestrequiredstring messagerequiredstring consentrequiredboolean companystring phone_countrystring phonestring company_sizestring preferred_contactstring
email | phone | whatsapplocalestring
en | arThe language of the auto-reply. -
suspend_licensechanges data Suspend a license (suspended: true) or reactivate it (false). A suspended license does not count: th...Suspend a license (suspended: true) or reactivate it (false). A suspended license does not count: the license before it applies again, or with none the company's users can't sign in. Needs platform.companies.
Argument Type Description company_idrequiredinteger license_idrequiredinteger suspendedrequiredboolean -
switch_zenhr_branchchanges data Pauses or resumes one branch's sync.Pauses or resumes one branch's sync.
Argument Type Description company_idrequiredinteger branch_idrequiredinteger enabledrequiredboolean -
switch_zenhr_syncchanges data Turn a company's ZenHR → Mihnaro sync on or off. Turn it off when employees have moved to Mihnaro fo...Turn a company's ZenHR → Mihnaro sync on or off. Turn it off when employees have moved to Mihnaro for good. It also needs ZENHR_SYNC_ENABLED=true on the server to run.
Argument Type Description company_idrequiredinteger enabledrequiredboolean -
sync_app_storeschanges data Read the app's latest version from the App Store (Apple's public lookup) and Google Play (the Play D...Read the app's latest version from the App Store (Apple's public lookup) and Google Play (the Play Developer API when PLAY_SERVICE_ACCOUNT is configured, otherwise the public Play listing) now, as the hourly check does (docs/platform-control.md). Returns each check (ok, failed or not_configured) and the releases.
No arguments.
-
test_backup_destinationchanges data Writes, reads and removes a small file at a backup destination and says what it found (docs/backups....Writes, reads and removes a small file at a backup destination and says what it found (docs/backups.md).
Argument Type Description destination_idrequiredinteger -
test_zenhr_connectionchanges data Makes one real read call to ZenHR to see the connection works. Refused while a sync runs. Ask a pers...Makes one real read call to ZenHR to see the connection works. Refused while a sync runs. Ask a person before calling it.
Argument Type Description company_idrequiredinteger -
unlock_userchanges data Lift the lock on a company user after too many failed sign-ins.Lift the lock on a company user after too many failed sign-ins.
Argument Type Description company_idrequiredinteger user_idrequiredinteger -
update_ai_settingschanges data Change the platform AI provider, model or on/off switch (docs/ai.md). provider: anthropic, openai or...Change the platform AI provider, model or on/off switch (docs/ai.md). provider: anthropic, openai or none. model: an id from list_ai_models, empty for the default. enabled: boolean. The key is only typed in the admin panel.
Argument Type Description providerstring
anthropic | openai | nonemodelstring enabledboolean -
update_app_debug_accountchanges data Turn the app's debug mode on or off for one account (docs/mobile-debug.md). user_id or email; on (bo...Turn the app's debug mode on or off for one account (docs/mobile-debug.md). user_id or email; on (boolean); hours (1–168, default 24; null = no end); send (true asks its phone for a report at its next open). The person sees a band on the phone while it is on. Recorded with your name and emailed to the other platform admins with platform.app_debug.
Argument Type Description user_idinteger The account. emailstring The account, by email, instead of user_id. onrequiredboolean On or off. hoursinteger|null Hours until it turns itself off (1–168). Default 24; null for no end. sendboolean Ask the phone for a report at its next open. -
update_app_releasechanges data Change the mobile app release rule for one platform (docs/platform-control.md): min_version (one of...Change the mobile app release rule for one platform (docs/platform-control.md): min_version (one of known_versions from get_app_releases; phones older than it get 426 update_required; empty = no minimum), update_mode none|suggest|force (needs the store's latest version), message_en, message_ar, release_notes_en, release_notes_ar ("what's new", shown on the app's update screen). Only what is passed changes. latest_version and store_url are read from the stores (sync_app_stores) and are refused here.
Argument Type Description platformrequiredstring
android | iosmin_versionstring One of known_versions from get_app_releases. update_modestring
none | suggest | forcemessage_enstring message_arstring release_notes_enstring release_notes_arstring -
update_backup_destinationchanges data Switch a backup destination on or off and change how many daily, weekly and monthly copies it keeps...Switch a backup destination on or off and change how many daily, weekly and monthly copies it keeps (docs/backups.md). Refused for the only destination that is on. S3 and SFTP destinations and their keys are entered in the panel or the API, so secrets never pass through a chat.
Argument Type Description destination_idrequiredinteger enabledboolean keep_dailyinteger 1 to 365. keep_weeklyinteger 0 to 104. keep_monthlyinteger 0 to 120. -
update_backup_settingschanges data Change the backup schedule and what it includes (docs/backups.md). Only what is passed changes. The...Change the backup schedule and what it includes (docs/backups.md). Only what is passed changes. The passphrase is not set here: it is typed in the panel. The other admins with platform.backups get an email.
Argument Type Description enabledboolean frequencystring
hours | daily | weeklyevery_hoursinteger With frequency hours: 1, 2, 3, 4, 6, 8 or 12. timestring HH:MM in the chosen time zone. weekdayinteger With frequency weekly: 0 is Sunday. timezonestring For example Asia/Baghdad. include_databaseboolean include_filesboolean include_secretsboolean .env and keys. Refused until a passphrase is set. restore_teststring
every_run | daily | weekly | monthly | offfree_space_factornumber Free disk needed, as a multiple of the expected size. overdue_grace_hoursinteger job_timeout_minutesinteger target_rto_minutesinteger notify_successboolean -
update_calculator_rateschanges data Change a country's rates in force for mihnaro.com's free HR calculators (country ISO code, default I...Change a country's rates in force for mihnaro.com's free HR calculators (country ISO code, default IQ; variant); only the keys given change, live immediately, kept in the history, and a changed rate loses its verified mark. For sources, versions and verifying use update_calculator_rule_set and verify_calculator_rules. Keys: ss_employee_percent, ss_employer_percent, ss_base gross|basic, ss_ceiling (0 = none), tax_period annual|monthly, tax_brackets [{min, max (null = no limit, last only), rate}], tax_exemption_single, tax_exemption_married, tax_allowances_exempt_percent, tax_ss_deductible, overtime_multiplier, rest_day_multiplier, holiday_multiplier, day_base, hours_per_day, eos_days_per_year, eos_min_years, currency_code (ISO).
Argument Type Description ss_employee_percentnumber ss_employer_percentnumber ss_basestring
gross | basicss_ceilingnumber tax_periodstring
annual | monthlytax_bracketsarray [{"min": 0, "max": 250000, "rate": 3}, …] tax_exemption_singlenumber tax_exemption_marriednumber tax_allowances_exempt_percentnumber tax_ss_deductibleboolean overtime_multipliernumber rest_day_multipliernumber holiday_multipliernumber day_basenumber hours_per_daynumber eos_days_per_yearnumber eos_min_yearsnumber currency_codestring countrystring ISO code; default IQ. variantstring -
update_calculator_rule_setchanges data Change a calculator rule set; only what is given changes, each change is kept in its history. rules:...Change a calculator rule set; only what is given changes, each change is kept in its history. rules: {key: value|null (null = not known yet)}; keys: currency_code, day_base, hours_per_day, work_days_per_week, annual_leave_days, overtime_multiplier, rest_day_multiplier, holiday_multiplier, ss_employee_percent, ss_employer_percent, ss_base gross|basic, ss_ceiling (monthly, 0 = none), ss_employee_brackets and ss_employer_brackets [{min, max, rate}] (monthly bands, override the percents), tax_period annual|monthly, tax_brackets [{min, max (null = no limit), rate}] ([] = no income tax), tax_exemption_single, tax_exemption_married, tax_allowances_exempt_percent, tax_ss_deductible, tax_round_down_to (taxable income rounded down to a multiple of it), tax_bracket_sets [{up_to, brackets}] (the scale chosen by total taxable income), tax_formula {round_down, zones: [{min, max, offset, divisor, a, b, c}]} ((a·t + b)·t + c, t = (x − offset) ÷ divisor), tax_expense_deduction {percent, min, max}, tax_credits [{label {en, ar}, kind credit|deduction, basis income|tax, rows [{from, to, base, rate}] (base + rate% × (x − from)), tax_on, max_income, marginal_relief, for single|married}], tax_surtaxes [{label, base tax|gross|taxable, rate, threshold, marginal_rate, exempt}], tax_household {single, married, children [parts], cap_per_half_part}, tax_cumulative (bool), tax_min_wage_exempt (monthly), tax_regions [{code, name {en, ar}, exemption, brackets or bracket_sets, credits, surtaxes, source {law, url, as_of, verified, note}}], tax_region_optional (bool) — amounts in tax_period units, eos_days_per_year, eos_min_years, eos_tiers [{from_year, to_year, days}], eos_cap_months, eos_resignation_tiers [{from_year, to_year, percent}]. sources: {key: {law: {en, ar}, article, url, as_of Y-m-d, note: {en, ar}, verified}}. Also notes {en, ar}, requires_confirmation [{rules: [keys or groups], reason {en, ar}, needed {en, ar}}] (what could not be confirmed from an official source; shown on the country page), allow_estimates (bool, default false: a calculator runs only when every rule it uses is verified; true lets this set run on estimates, marked so), variant_label, effective_from, position. A changed value loses its verified mark unless the same call verifies it. Same as PATCH /api/v1/platform/calculator-rule-sets/{id}.
Argument Type Description idrequiredinteger rulesobject sourcesobject notesobject allow_estimatesboolean Let this set's calculators run on rules not verified yet (results marked "estimate"). Off by default; every change is logged. requires_confirmationarray What is not confirmed yet: [{rules: [rule keys or group names], reason {en, ar}, needed {en, ar}}]; [] or null for none variant_labelobject effective_fromstring positioninteger -
update_companychanges data Change a company's details or status. Only the fields given change. Setting status to "suspended" bl...Change a company's details or status. Only the fields given change. Setting status to "suspended" blocks sign-in for all its users; "active" restores it.
Argument Type Description company_idrequiredinteger nameobject Company name; give one or both languages. slugstring statusstring
active | suspendedcountrystring
AD | AE | AF | AG | AI | AL | AM | AO | AQ | AR | AS | AT | AU | AW | AX | AZ | BA | BB | BD | BE | BF | BG | BH | BI | BJ | BL | BM | BN | BO | BQ | BR | BS | BT | BW | BY | BZ | CA | CC | CD | CF | CG | CH | CI | CK | CL | CM | CN | CO | CR | CU | CV | CW | CX | CY | CZ | DE | DJ | DK | DM | DO | DZ | EC | EE | EG | EH | ER | ES | ET | FI | FJ | FK | FM | FO | FR | GA | GB | GD | GE | GF | GG | GH | GI | GL | GM | GN | GP | GQ | GR | GS | GT | GU | GW | GY | HK | HN | HR | HT | HU | ID | IE | IL | IM | IN | IO | IQ | IR | IS | IT | JE | JM | JO | JP | KE | KG | KH | KI | KM | KN | KP | KR | KW | KY | KZ | LA | LB | LC | LI | LK | LR | LS | LT | LU | LV | LY | MA | MC | MD | ME | MF | MG | MH | MK | ML | MM | MN | MO | MP | MQ | MR | MS | MT | MU | MV | MW | MX | MY | MZ | NA | NC | NE | NF | NG | NI | NL | NO | NP | NR | NU | NZ | OM | PA | PE | PF | PG | PH | PK | PL | PM | PN | PR | PS | PT | PW | PY | QA | RE | RO | RS | RU | RW | SA | SB | SC | SD | SE | SG | SH | SI | SJ | SK | SL | SM | SN | SO | SR | SS | ST | SV | SX | SY | SZ | TC | TD | TF | TG | TH | TJ | TK | TL | TM | TN | TO | TR | TT | TV | TW | TZ | UA | UG | UM | US | UY | UZ | VA | VC | VE | VG | VI | VN | VU | WF | WS | YE | YT | ZA | ZM | ZWtimezonestring notesstring -
update_contact_settingschanges data Change the contact page settings; only the keys given change, lists (interests, company_sizes) are r...Change the contact page settings; only the keys given change, lists (interests, company_sizes) are replaced whole. interests: [{"key","label":{"en","ar"},"team":"sales|support|hello"}]. recipients: {"sales": ["[email protected]"], ...}. auto_reply: {"enabled", "subject": {"en","ar"}, "body": {"en","ar"}} with {name}, {interest}, {site}. A blank turnstile_secret keeps the saved one; clear_turnstile_secret true removes it.
Argument Type Description interestsarray company_sizesarray recipientsobject default_countrystring
IQ | JO | SA | AE | KW | QA | BH | OM | EG | LB | SY | PS | YE | LY | TN | DZ | MA | SD | TR | IR | GB | DE | FR | US | IN | PKauto_replyobject seo_titleobject seo_descriptionobject turnstile_site_keystring turnstile_secretstring clear_turnstile_secretboolean google_maps_keystring -
update_flash_messageschanges data Change how the web app shows its save, edit, delete and error messages, for every company and user (...Change how the web app shows its save, edit, delete and error messages, for every company and user (docs/flash-messages.md). Only what is passed changes. Errors stay until closed whatever is set. The other platform admins with platform.flash_messages get an email.
Argument Type Description positionstring
top-center | top-start | top-end | center | bottomWhere messages appear. Start and end flip in Arabic. duration_secondsinteger How long a message stays, 2 to 30 seconds. auto_closeboolean Whether messages close by themselves. Errors never do. -
update_leadchanges data Change a contact-form message: status (new, contacted, closed), internal notes, or assigned_to (a pl...Change a contact-form message: status (new, contacted, closed), internal notes, or assigned_to (a platform admin user id, or null). Only the fields given change.
Argument Type Description lead_idrequiredinteger statusstring
new | contacted | closednotesstring assigned_tointeger A platform admin user id; null to unassign. -
update_licensechanges data Edit one of a company's licenses in place (dates, modules, limits, notes); fields left out keep thei...Edit one of a company's licenses in place (dates, modules, limits, notes); fields left out keep their value. Returns the license and any other licenses whose dates it overlaps: while they overlap, the one that started last is in effect. Needs platform.companies.
Argument Type Description company_idrequiredinteger license_idrequiredinteger modulesarray max_employeesinteger max_branchesinteger Not below the branches the company already has. starts_onstring YYYY-MM-DD ends_onstring YYYY-MM-DD notesstring -
update_login_designchanges data Change one sign-in design's texts and images: eyebrow (command only), headline and text as {"en","ar...Change one sign-in design's texts and images: eyebrow (command only), headline and text as {"en","ar"}; image and background as a path under public/ (e.g. "auth-art/authentication-bg-05.svg") or a full URL. Fields a design does not use are ignored; empty values bring back the default. Same as PATCH /api/v1/platform/login-designs/{design}.
Argument Type Description designrequiredstring
classic | illustration | minimal | command | cardeyebrowobject headlineobject textobject imagestring backgroundstring -
update_monitor_alert_rulechanges data Change one server alert rule (docs/server-monitor.md), found by its metric: threshold, for_minutes (...Change one server alert rule (docs/server-monitor.md), found by its metric: threshold, for_minutes (1-1440), cooldown_minutes (5-10080) or enabled. Only what is passed changes. Switching off a firing rule clears it without a recovery email.
Argument Type Description metricrequiredstring
cpu | memory | disk | load | db_connections | db_timeouts | errors | failed_jobs | service_down | site_down | ssl_days | zenhr_sync_failed | device_offline_hours | backup_age_hoursthresholdnumber for_minutesinteger cooldown_minutesinteger enabledboolean -
update_platform_adminchanges data Rename a platform admin and change their platform permissions: permissions is the whole list they ke...Rename a platform admin and change their platform permissions: permissions is the whole list they keep, or grant / revoke one. At least one admin always keeps platform.admins. Needs platform.admins.
Argument Type Description admin_idrequiredinteger namestring permissionsarray grantstring
platform.ai | server.monitor | platform.app_control | platform.broadcast | platform.companies | platform.phones.location | platform.admins | platform.notifications | platform.zenhr | platform.flash_messages | platform.server_switch | platform.app_debug | platform.backups | platform.backups_change | platform.backups_runrevokestring
platform.ai | server.monitor | platform.app_control | platform.broadcast | platform.companies | platform.phones.location | platform.admins | platform.notifications | platform.zenhr | platform.flash_messages | platform.server_switch | platform.app_debug | platform.backups | platform.backups_change | platform.backups_run -
update_platform_appearancechanges data Change the platform's default look; only the options given change, an empty value brings back the or...Change the platform's default look; only the options given change, an empty value brings back the original. Same as PATCH /api/v1/platform/appearance.
Argument Type Description modestring
| light | dark | systemEmpty: follow the level above. layoutstring
| default | mini | detached | modern | transparent | horizontal | horizontal-single | horizontal-overlay | horizontal-box | horizontal-fullwidth | horizontal-sidemenu | twocolumn | stackedEmpty: follow the level above. colorstring
| primary | brightblue | lunargreen | lavendar | magenta | chromeyellow | lavaredEmpty: follow the level above. sidebarstring
| light | brand | darkgreen | darkgray | royalblue | indigoEmpty: follow the level above. topbarstring
| white | darkaqua | whiterock | rockblue | bluehaze | orangegradient | purplegradient | bluegradient | maroongradientEmpty: follow the level above. topbarcolorstring
| white | primary | blackpearl | maroon | bluegem | fireflyEmpty: follow the level above. cardstring
| bordered | borderless | shadowEmpty: follow the level above. sizestring
| default | compactEmpty: follow the level above. widthstring
| fluid | boxEmpty: follow the level above. loaderstring
| enable | disableEmpty: follow the level above. -
update_platform_limitschanges data Change limits at platform level (docs/limits.md): values {key: number, or null for the built-in defa...Change limits at platform level (docs/limits.md): values {key: number, or null for the built-in default}, sizes in KB. Only the keys sent change. Companies without their own value follow it at once. See get_platform_limits for the keys.
Argument Type Description valuesrequiredobject {key: number or null}. -
update_robotschanges data Replace robots.txt rules for one or more domains (marketing, help, api, demo, app, admin). The Sitem...Replace robots.txt rules for one or more domains (marketing, help, api, demo, app, admin). The Sitemap line is added automatically; an empty text restores the default. Same as PATCH /api/v1/platform/seo/robots.
Argument Type Description marketingstring helpstring apistring demostring appstring adminstring -
update_security_policychanges data Change parts of the security policy; fields not given keep their value. Applies from the next reques...Change parts of the security policy; fields not given keep their value. Applies from the next request. See get_security_policy for the fields.
Argument Type Description max_attemptsinteger Failed sign-ins before the account locks (3-20). lock_minutesinteger How long a locked account stays locked. password_min_lengthinteger 8-64. password_require_mixed_caseboolean password_require_numbersboolean password_require_symbolsboolean password_expiry_monthsinteger 0 = passwords never expire. reset_link_minutesinteger How long a reset link works (5-1440). reset_requests_per_hourinteger reset_channelsarray app_idle_minutesinteger Sign out of the app after this long without activity. admin_idle_minutesinteger expire_on_closeboolean Also sign out when the browser closes. remember_me_daysinteger 0 hides "Remember me". admin_remember_meboolean support_session_minutesinteger How long a support session inside a company lasts (5-480). activity_log_max_monthsinteger
0 | 6 | 12 | 24The longest any company keeps its activity log, in months; 0 = no maximum (companies may keep it forever). -
update_seo_pagechanges data Set one public page's search and sharing tags per language. Fields: title, description, keywords, ca...Set one public page's search and sharing tags per language. Fields: title, description, keywords, canonical, robots ("index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"), og_title, og_description, og_image, twitter_title, twitter_description. An empty string clears a field (the page then uses its own content). Template pages (help.category, help.article) accept {title}, {description}, {site}. Same as PATCH /api/v1/platform/seo/pages/{key}.
Argument Type Description pagerequiredstring
marketing.home | marketing.pricing | marketing.contact | marketing.tools | marketing.end-of-service | marketing.net-salary | marketing.gross-salary | marketing.overtime | marketing.leave | marketing.cost-to-company | marketing.salary-guide | help.home | help.category | help.article | help.search | demo.home | developers.home | developers.referenceenobject English fields. arobject Arabic fields. -
update_seo_settingschanges data Change the SEO center's site-wide settings; only the keys given change. Live immediately on every pu...Change the SEO center's site-wide settings; only the keys given change. Live immediately on every public page. Same as PATCH /api/v1/platform/seo/settings.
Argument Type Description title_separatorstring Between a page title and the site name, e.g. " | ". google_verificationstring Google Search Console token(s), the content="" value only; several separated by spaces. bing_verificationstring Bing Webmaster Tools token(s). ga_idstring Google Analytics 4 id, G-XXXXXXX, or null. gtm_idstring Google Tag Manager id, GTM-XXXXXX, or null. consent_modestring
banner | nonebanner: no measuring until the visitor accepts. consent_textobject {"en","ar"} text of the cookie banner. noindex_allboolean Hide every public page from search engines (staging only). default_og_imagestring Path under public/ or full URL; 1200x630. apple_touch_iconstring twitter_sitestring @handle organizationobject {"legal_name", "logo", "same_as": [urls]} for the Organization JSON-LD. software_applicationboolean application_categorystring
BusinessApplication | FinanceApplication | ProductivityApplication | WebApplication -
update_server_switchchanges data Turn the mobile app's hidden live/dev switch on or off (docs/mobile-server-switch.md). on: boolean....Turn the mobile app's hidden live/dev switch on or off (docs/mobile-server-switch.md). on: boolean. hours: how long it stays on (1–168, default 24; null = until turned off by hand). Off: 15 taps do nothing, and phones on dev go back to the live server at their next open; their dev drafts stay on the phone for dev. The other platform admins with platform.server_switch get an email.
Argument Type Description onrequiredboolean On or off. hoursinteger|null Hours until it turns itself off (1–168). Default 24; null for no end. -
update_sign_in_optionschanges data Switch the sign-in screen links on or off for the mobile app and the web sign-in page (docs/platform...Switch the sign-in screen links on or off for the mobile app and the web sign-in page (docs/platform-control.md): forgot_password, sso, privacy (booleans; only what is passed changes). Off hides the link and the server refuses forgot-password and SSO with 403 sign_in_option_off. privacy off hides only the sign-in link: Settings always keeps the privacy policy (Apple 5.1.1, Google Play). The other platform admins with platform.app_control get an email.
Argument Type Description forgot_passwordboolean Show "Forgot password" on sign-in. ssoboolean Show "Sign in with SSO". privacyboolean Show "Privacy policy" on the sign-in screen. -
update_site_settingschanges data Change mihnaro.com and system settings (app_theme is the system palette); only the keys given change...Change mihnaro.com and system settings (app_theme is the system palette); only the keys given change and each replaces the whole value (e.g. send the full colors object). Colors are #RRGGBB; fonts are slugs from config/site.php. Changes are live immediately.
Argument Type Description site_nameobject {"en": "...", "ar": "..."} taglineobject footer_textobject colorsobject brand, accent, ink, muted, surface as #RRGGBB. fontsobject latin_heading, latin_body, arabic_heading, arabic_body. currencyobject emailsobject hello, sales, support. page_titlesobject home, pricing, contact, each {"en","ar"}. navarray Menu links in order: [{"label": {"en","ar"}, "url": "/pricing"}]. app_themeobject The system palette (HRM, FSM, admin, sign-in): {"primary","secondary","sidebar","login_panel"} as #RRGGBB, and "sidebar_style": light|colored. Send all five. auth_panelobject Sign-in page panel: {"headline": {"en","ar"}, "text": {"en","ar"}} header_buttonobject {"label": {"en","ar"}, "url": "mailto:..."} -
update_user_contactchanges data Set where the password reset links of a company user go: personal email and WhatsApp phone (+ and co...Set where the password reset links of a company user go: personal email and WhatsApp phone (+ and country code).
Argument Type Description company_idrequiredinteger user_idrequiredinteger personal_emailstring phonestring International format, e.g. +9647701234567. -
update_zenhr_data_typechanges data Turns a data type on or off (it also pauses that type in a running sync), or sets how often it is re...Turns a data type on or off (it also pauses that type in a running sync), or sets how often it is read and its starting point. With branch_id: for that branch only. Refuses what the code cannot do.
Argument Type Description company_idrequiredinteger data_typerequiredstring branch_idinteger enabledboolean frequencystring
hourly | every_6h | daily | weekly | manualstarting_fromstring YYYY-MM-DD -
verify_calculator_ruleschanges data Mark rules of a calculator rule set verified (checked against the official source recorded for each;...Mark rules of a calculator rule set verified (checked against the official source recorded for each; a rule without a source is refused) or, with verified=false, back to estimate. Same as POST /api/v1/platform/calculator-rule-sets/{id}/verify.
Argument Type Description idrequiredinteger keysrequiredarray Rule keys, e.g. ['ss_employee_percent']. verifiedboolean Default true.