{"base_url":"https:\/\/api.mihnaro.com\/api\/v1","authentication":{"app":"Authorization: Bearer <app token from POST \/api\/v1\/app\/token, or a company API key mhk_\u2026>","platform":"Authorization: Bearer <a platform admin's API key from the admin panel>","device":"X-Device-Token: <the fingerprint machine's token>"},"locale":"Accept-Language: en | ar","endpoints":[{"methods":["GET"],"path":"\/api\/v1\/app\/brand","name":"api.v1.app.brand","audience":"public","section":"brand","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET \/api\/v1\/app\/brand (docs\/mobile-app.md, \"\u0623\u064a\u0642\u0648\u0646\u0629 \u0627\u0644\u062a\u0637\u0628\u064a\u0642\"): 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.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/branding","name":"api.v1.app.branding","audience":"public","section":"branding","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"What the mobile app is painted with before anyone signs in: the system palette and logos from the admin panel.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/help\/categories","name":"api.v1.help.categories","audience":"public","section":"help","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/help\/articles","name":"api.v1.help.articles.index","audience":"public","section":"help","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[{"name":"q","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"category","rules":"nullable|string|in:getting-started,employees,payroll,leaves,attendance,documents,performance,recruitment,reports,settings,api","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/help\/articles\/{category}\/{article}","name":"api.v1.help.articles.show","audience":"public","section":"help","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"category","type":"string","pattern":"[a-z0-9-]+"},{"name":"article","type":"string","pattern":"[a-z0-9-]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/meta","name":"api.v1.app.meta","audience":"public","section":"meta","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/password\/options","name":"api.v1.app.password.options","audience":"public","section":"password","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/password\/forgot","name":"api.v1.app.password.forgot","audience":"public","section":"password","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[{"name":"email","rules":"required|email","required":true},{"name":"channel","rules":"required|Rule::in(self::availableChannels())","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/password\/reset","name":"api.v1.app.password.reset","audience":"public","section":"password","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[{"name":"token","rules":"required|string","required":true},{"name":"password","rules":"required|string|confirmed|\\App\\Support\\PasswordPolicy::rule($link->user)|new \\App\\Rules\\NotRecentlyUsedPassword($link->user)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/server-switch","name":"api.v1.app.server-switch","audience":"public","section":"server-switch","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"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.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/site\/contact\/options","name":"api.v1.site.contact.options","audience":"public","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/site\/contact","name":"api.v1.site.contact.store","audience":"public","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":null,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/sso\/token","name":"api.v1.app.sso.token","audience":"public","section":"sso","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"The mobile app after single sign-on (MobileSso): the one-time code and its PKCE code_verifier. No 2FA code: the provider checked.","parameters":[],"fields":[{"name":"code","rules":"required|string|max:100","required":true},{"name":"code_verifier","rules":"required|string|min:43|max:128","required":true},{"name":"device_name","rules":"required|string|max:80","required":true},{"name":"device_id","rules":"nullable|string|max:100","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/token","name":"api.v1.app.token","audience":"public","section":"token","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[{"name":"email","rules":"required|string|max:190","required":true},{"name":"password","rules":"required|string","required":true},{"name":"device_name","rules":"required|string|max:80","required":true},{"name":"code","rules":"nullable|string|max:20","required":false},{"name":"device_id","rules":"nullable|string|max:100","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/tools\/calculators","name":"api.v1.tools.calculators.index","audience":"public","section":"tools","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["GET","POST"],"path":"\/api\/v1\/tools\/calculators\/{tool}","name":"api.v1.tools.calculators.show","audience":"public","section":"tools","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"tool","type":"string","pattern":"end-of-service|net-salary|gross-salary|overtime|leave|cost-to-company"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/tools\/countries","name":"api.v1.tools.countries.index","audience":"public","section":"tools","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"Every country with rules: the tools each can run, its variants and how many of its rules are verified.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/tools\/countries\/{country}","name":"api.v1.tools.countries.show","audience":"public","section":"tools","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"A country's rules in force, with each rule's source and verified mark; a country with none says so.","parameters":[{"name":"country","type":"string","pattern":"[A-Za-z0-9-]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/time-zones","name":"api.v1.app.access.time-zones","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/time-zones","name":"api.v1.app.access.time-zones.store","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"device_tz_id","rules":"required|integer|between:2,50|unique:access_time_zones","required":true},{"name":"schedule","rules":"array","required":false},{"name":"schedule.*","rules":"array|max:3","required":false},{"name":"schedule.*.*","rules":"array|size:2","required":false},{"name":"schedule.*.*.*","rules":"date_format:H:i","required":false},{"name":"holidays_closed","rules":"sometimes|boolean","required":false},{"name":"branch_id","rules":"sometimes|nullable|integer|exists:branches,id","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/time-zones\/{zone}","name":"api.v1.app.access.time-zones.update","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"zone","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"device_tz_id","rules":"required|integer|between:2,50|unique:access_time_zones","required":true},{"name":"schedule","rules":"array","required":false},{"name":"schedule.*","rules":"array|max:3","required":false},{"name":"schedule.*.*","rules":"array|size:2","required":false},{"name":"schedule.*.*.*","rules":"date_format:H:i","required":false},{"name":"holidays_closed","rules":"sometimes|boolean","required":false},{"name":"branch_id","rules":"sometimes|nullable|integer|exists:branches,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/levels","name":"api.v1.app.access.levels","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/levels","name":"api.v1.app.access.levels.store","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"access_time_zone_id","rules":"nullable|integer|exists:access_time_zones,id","required":false},{"name":"doors","rules":"required|array|min:1|max:200","required":true},{"name":"doors.*.device_id","rules":"required|integer|exists:biometric_devices,id","required":true},{"name":"doors.*.door","rules":"nullable|integer|between:0,8","required":false},{"name":"branch_id","rules":"sometimes|nullable|integer|exists:branches,id","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/levels\/{level}","name":"api.v1.app.access.levels.update","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"level","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"access_time_zone_id","rules":"nullable|integer|exists:access_time_zones,id","required":false},{"name":"doors","rules":"required|array|min:1|max:200","required":true},{"name":"doors.*.device_id","rules":"required|integer|exists:biometric_devices,id","required":true},{"name":"doors.*.door","rules":"nullable|integer|between:0,8","required":false},{"name":"branch_id","rules":"sometimes|nullable|integer|exists:branches,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/assignments","name":"api.v1.app.access.assignments","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/assignments","name":"api.v1.app.access.assignments.store","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"access_level_id","rules":"nullable|required_unless:effect,deny|integer|exists:access_levels,id","required":false},{"name":"target_type","rules":"required|in:employee,group,department,branch,position,all,visitor","required":true},{"name":"effect","rules":"required|in:allow,deny","required":true},{"name":"target_id","rules":"nullable|Rule::requiredIf(fn() => in_array($input['target_type'] ?? '', ['employee', 'gro...|integer","required":false},{"name":"biometric_device_id","rules":"nullable|integer|exists:biometric_devices,id","required":false},{"name":"visitor_name","rules":"nullable|required_if:target_type,visitor|string|max:100","required":false},{"name":"visitor_pin","rules":"nullable|required_if:target_type,visitor|string|max:32|regex:\/^[0-9]+$\/","required":false},{"name":"visitor_card","rules":"nullable|string|max:32","required":false},{"name":"starts_at","rules":"nullable|date","required":false},{"name":"ends_at","rules":"nullable|date|after:starts_at|required_if:target_type,visitor","required":false},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/assignments\/{assignment}","name":"api.v1.app.access.assignments.update","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[{"name":"access_level_id","rules":"nullable|required_unless:effect,deny|integer|exists:access_levels,id","required":false},{"name":"target_type","rules":"required|in:employee,group,department,branch,position,all,visitor","required":true},{"name":"effect","rules":"required|in:allow,deny","required":true},{"name":"target_id","rules":"nullable|Rule::requiredIf(fn() => in_array($input['target_type'] ?? '', ['employee', 'gro...|integer","required":false},{"name":"biometric_device_id","rules":"nullable|integer|exists:biometric_devices,id","required":false},{"name":"visitor_name","rules":"nullable|required_if:target_type,visitor|string|max:100","required":false},{"name":"visitor_pin","rules":"nullable|required_if:target_type,visitor|string|max:32|regex:\/^[0-9]+$\/","required":false},{"name":"visitor_card","rules":"nullable|string|max:32","required":false},{"name":"starts_at","rules":"nullable|date","required":false},{"name":"ends_at","rules":"nullable|date|after:starts_at|required_if:target_type,visitor","required":false},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/access\/{kind}\/{id}","name":"api.v1.app.access.destroy","audience":"app","section":"access","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"time-zones|levels|assignments"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting","name":"api.v1.app.accounting.index","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}","name":"api.v1.app.accounting.show","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}","name":"api.v1.app.accounting.save","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}","name":"api.v1.app.accounting.disconnect","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/test","name":"api.v1.app.accounting.test","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/refresh","name":"api.v1.app.accounting.refresh","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/catalog","name":"api.v1.app.accounting.catalog","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"The ledger's accounts, analytics, partners and journals as last read.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/oauth-url","name":"api.v1.app.accounting.oauth-url","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"OAuth 2 (QuickBooks, Xero): the consent link to open in a browser signed in to Mihnaro as the same person.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/mappings","name":"api.v1.app.accounting.mappings","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/mappings","name":"api.v1.app.accounting.mappings.update","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"PUT items: [{type, local_key, external_id}]; auto_match: true maps accounts whose codes match.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/preview","name":"api.v1.app.accounting.preview","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[{"name":"run_id","rules":"required|integer","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/post","name":"api.v1.app.accounting.post","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[{"name":"run_id","rules":"required|integer","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting\/{provider}\/sync-employees","name":"api.v1.app.accounting.sync","audience":"app","section":"accounting","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[{"name":"employee_ids","rules":"sometimes|array","required":false},{"name":"employee_ids.*","rules":"integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting-postings","name":"api.v1.app.accounting.postings","audience":"app","section":"accounting-postings","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting-postings\/{posting}","name":"api.v1.app.accounting.postings.show","audience":"app","section":"accounting-postings","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"posting","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/accounting-postings\/{posting}\/{action}","name":"api.v1.app.accounting.postings.act","audience":"app","section":"accounting-postings","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":30,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"posting","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"retry|reverse|repost"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/activity-log","name":"api.v1.app.activity.index","audience":"app","section":"activity-log","permissions":["activity.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET activity-log?tab=changes|requests|sign_ins plus the tab's filters","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies","name":"api.v1.app.payroll.air-ticket-policies","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies","name":"api.v1.app.payroll.air-ticket-policies.store","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"apply_changes","rules":"nullable|in:update,new","required":false},{"name":"balance_date","rules":"required_if:apply_changes,new|nullable|date","required":false},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"tickets","rules":"required|numeric|min:0|max:20","required":true},{"name":"period_months","rules":"required|integer|min:1|max:120","required":true},{"name":"period_anchor","rules":"required|in:hire,calendar","required":true},{"name":"accrual","rules":"required|in:period_start,monthly","required":true},{"name":"amount","rules":"required|numeric|min:0","required":true},{"name":"family_members","rules":"nullable|integer|min:0|max:20","required":false},{"name":"eligible_after_months","rules":"nullable|integer|min:0|max:120","required":false},{"name":"applies_to","rules":"required|in:all,assigned","required":true},{"name":"expire_option","rules":"nullable|in:after,immediately,none","required":false},{"name":"expire_after_months","rules":"required_if:expire_option,after|nullable|integer|min:1|max:120","required":false},{"name":"distribution","rules":"nullable|in:per_person,shared","required":false},{"name":"default_payroll","rules":"nullable|in:in_payroll,off_cycle","required":false},{"name":"default_request_type","rules":"nullable|in:cash_out,ticket","required":false},{"name":"transaction_type_id","rules":"nullable|exists:transaction_types,id","required":false},{"name":"gl_identifier","rules":"nullable|string|max:60","required":false},{"name":"clearance_account","rules":"nullable|string|max:60","required":false},{"name":"setups","rules":"nullable|array|max:30","required":false},{"name":"setups.*.position_ids","rules":"nullable|array","required":false},{"name":"setups.*.position_ids.*","rules":"integer|exists:positions,id","required":false},{"name":"setups.*.nationalities","rules":"nullable|string|max:500","required":false},{"name":"setups.*.years_from","rules":"nullable|numeric|min:0|max:60","required":false},{"name":"setups.*.years_to","rules":"nullable|numeric|min:0|max:60","required":false},{"name":"setups.*.amount","rules":"nullable|numeric|min:0","required":false},{"name":"setups.*.currency","rules":"nullable|string|max:3","required":false},{"name":"setups.*.beneficiaries","rules":"nullable|array","required":false},{"name":"setups.*.beneficiaries.*.relation","rules":"nullable|in:parent,spouse,child,sibling","required":false},{"name":"setups.*.beneficiaries.*.deduction","rules":"nullable|numeric|min:0|max:100","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies\/{policy}","name":"api.v1.app.payroll.air-ticket-policies.show","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The policy and the employees in my payroll.manage scope it was given to, with their opening balance.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies\/{policy}","name":"api.v1.app.payroll.air-ticket-policies.update","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[{"name":"apply_changes","rules":"nullable|in:update,new","required":false},{"name":"balance_date","rules":"required_if:apply_changes,new|nullable|date","required":false},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"tickets","rules":"required|numeric|min:0|max:20","required":true},{"name":"period_months","rules":"required|integer|min:1|max:120","required":true},{"name":"period_anchor","rules":"required|in:hire,calendar","required":true},{"name":"accrual","rules":"required|in:period_start,monthly","required":true},{"name":"amount","rules":"required|numeric|min:0","required":true},{"name":"family_members","rules":"nullable|integer|min:0|max:20","required":false},{"name":"eligible_after_months","rules":"nullable|integer|min:0|max:120","required":false},{"name":"applies_to","rules":"required|in:all,assigned","required":true},{"name":"expire_option","rules":"nullable|in:after,immediately,none","required":false},{"name":"expire_after_months","rules":"required_if:expire_option,after|nullable|integer|min:1|max:120","required":false},{"name":"distribution","rules":"nullable|in:per_person,shared","required":false},{"name":"default_payroll","rules":"nullable|in:in_payroll,off_cycle","required":false},{"name":"default_request_type","rules":"nullable|in:cash_out,ticket","required":false},{"name":"transaction_type_id","rules":"nullable|exists:transaction_types,id","required":false},{"name":"gl_identifier","rules":"nullable|string|max:60","required":false},{"name":"clearance_account","rules":"nullable|string|max:60","required":false},{"name":"setups","rules":"nullable|array|max:30","required":false},{"name":"setups.*.position_ids","rules":"nullable|array","required":false},{"name":"setups.*.position_ids.*","rules":"integer|exists:positions,id","required":false},{"name":"setups.*.nationalities","rules":"nullable|string|max:500","required":false},{"name":"setups.*.years_from","rules":"nullable|numeric|min:0|max:60","required":false},{"name":"setups.*.years_to","rules":"nullable|numeric|min:0|max:60","required":false},{"name":"setups.*.amount","rules":"nullable|numeric|min:0","required":false},{"name":"setups.*.currency","rules":"nullable|string|max:3","required":false},{"name":"setups.*.beneficiaries","rules":"nullable|array","required":false},{"name":"setups.*.beneficiaries.*.relation","rules":"nullable|in:parent,spouse,child,sibling","required":false},{"name":"setups.*.beneficiaries.*.deduction","rules":"nullable|numeric|min:0|max:100","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies\/{policy}","name":"api.v1.app.payroll.air-ticket-policies.destroy","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies\/{policy}\/assign","name":"api.v1.app.payroll.air-ticket-policies.assign","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"scope all | selected (employee_ids[]), opening_balance.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[{"name":"scope","rules":"required|in:all,selected","required":true},{"name":"employee_ids","rules":"required_if:scope,selected|array","required":false},{"name":"employee_ids.*","rules":"integer","required":false},{"name":"opening_balance","rules":"nullable|numeric|min:0|max:99","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/air-ticket-policies\/{policy}\/employees\/{employee}","name":"api.v1.app.payroll.air-ticket-policies.unassign","audience":"app","section":"air-ticket-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/air-tickets","name":"api.v1.app.payroll.air-tickets","audience":"app","section":"air-tickets","permissions":["payroll.air_tickets.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/air-tickets\/balances","name":"api.v1.app.payroll.air-tickets.balances","audience":"app","section":"air-tickets","permissions":["payroll.air_tickets.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Every active employee's balance in my scope under each of their policies (policy filters one).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/air-tickets","name":"api.v1.app.payroll.air-tickets.store","audience":"app","section":"air-tickets","permissions":["payroll.air_tickets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"policy_id","rules":"nullable|integer","required":false},{"name":"slice","rules":"nullable|integer|min:0","required":false},{"name":"tickets","rules":"required_without:owners|nullable|array|min:1|max:20","required":false},{"name":"tickets.*.owner","rules":"required|string|max:20|distinct","required":true},{"name":"tickets.*.count","rules":"nullable|numeric|gt:0|max:50","required":false},{"name":"tickets.*.amount","rules":"nullable|numeric|min:0","required":false},{"name":"owners","rules":"required_without:tickets|nullable|array|min:1","required":false},{"name":"owners.*","rules":"string|max:20","required":false},{"name":"cash_out","rules":"nullable|boolean","required":false},{"name":"amount","rules":"nullable|numeric|min:0","required":false},{"name":"destination","rules":"nullable|string|max:150","required":false},{"name":"travel_date","rules":"required|date","required":true},{"name":"return_date","rules":"nullable|date|after_or_equal:travel_date","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/air-tickets\/paid","name":"api.v1.app.payroll.air-tickets.paid","audience":"app","section":"air-tickets","permissions":["payroll.air_tickets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ids[], paid_at, payment_reference: booked (not cash out) unpaid ones are marked.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"ids","rules":"required|array|min:1","required":true},{"name":"ids.*","rules":"integer","required":false},{"name":"paid_at","rules":"required|date","required":true},{"name":"payment_reference","rules":"nullable|string|max:100","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/air-tickets\/bulk-delete","name":"api.v1.app.payroll.air-tickets.bulk-destroy","audience":"app","section":"air-tickets","permissions":["payroll.air_tickets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ids[]: the unpaid ones are deleted; returns how many.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"ids","rules":"required|array","required":true},{"name":"ids.*","rules":"integer","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/air-tickets\/{transaction}","name":"api.v1.app.payroll.air-tickets.destroy","audience":"app","section":"air-tickets","permissions":["payroll.air_tickets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"transaction","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements","name":"api.v1.app.announcements.index","audience":"app","section":"announcements","permissions":["self.announcements","announcements.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"q: search; show; per_page. Only those the person may read (their targets; all with announcements.manage).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/{announcement}","name":"api.v1.app.announcements.show","audience":"app","section":"announcements","permissions":["self.announcements","announcements.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/{announcement}\/read","name":"api.v1.app.announcements.read","audience":"app","section":"announcements","permissions":["self.announcements","announcements.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Marks one the person may read as read (their bell notice of it), as opening it on the screen does.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/images\/{file}","name":"api.v1.app.announcements.image","audience":"app","section":"announcements","permissions":["self.announcements","announcements.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A picture of the company's announcements (their text and galleries).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"file","type":"string","pattern":"[A-Za-z0-9_-]+\\.(png|jpe?g|gif|webp)"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/{announcement}\/attachments\/{index}","name":"api.v1.app.announcements.attachment","audience":"app","section":"announcements","permissions":["self.announcements","announcements.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An attached file of an announcement the person may read (copied from ZenHR or added in Mihnaro).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"announcement","type":"integer","pattern":null},{"name":"index","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/media","name":"api.v1.app.announcements.media","audience":"app","section":"announcements","permissions":["announcements.create","announcements.edit"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Multipart: file, kind (image: for the text or the gallery; file: an attachment). Returns the file to save with.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements","name":"api.v1.app.announcements.store","audience":"app","section":"announcements","permissions":["announcements.create"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, body {en, ar}, pinned, starts_on, expires_on, gallery, attachments, targets (Announcements::save). The people it is for are notified.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(200)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(200)","required":false},{"name":"body","rules":"required|array","required":true},{"name":"body.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(200000)","required":true},{"name":"body.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(200000)","required":false},{"name":"starts_on","rules":"nullable|date","required":false},{"name":"expires_on","rules":"nullable|date|after_or_equal:starts_on","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/{announcement}","name":"api.v1.app.announcements.update","audience":"app","section":"announcements","permissions":["announcements.edit"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/announcements\/{announcement}","name":"api.v1.app.announcements.destroy","audience":"app","section":"announcements","permissions":["announcements.delete"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/api-keys","name":"api.v1.app.api-keys.index","audience":"app","section":"api-keys","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/api-keys","name":"api.v1.app.api-keys.store","audience":"app","section":"api-keys","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":20,"summary":"POST api-keys: the token is in the answer this once.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$req|string|max:100","required":false},{"name":"abilities","rules":"$req|array|min:1","required":false},{"name":"abilities.*","rules":"in:read,write,update,delete","required":false},{"name":"ip_addresses","rules":"sometimes|nullable|string|max:1000","required":false},{"name":"expires_on","rules":"sometimes|nullable|date|after:today","required":false},{"name":"user_id","rules":"sometimes|nullable|integer","required":false},{"name":"auth_type","rules":"sometimes|in:basic,oauth1,oauth2,credentials","required":false},{"name":"consumer_key","rules":"sometimes|nullable|string|max:190","required":false},{"name":"consumer_secret","rules":"sometimes|nullable|string|max:500","required":false},{"name":"realm","rules":"sometimes|nullable|string|max:190","required":false},{"name":"client_id","rules":"sometimes|nullable|string|max:190","required":false},{"name":"client_secret","rules":"sometimes|nullable|string|max:500","required":false},{"name":"username","rules":"sometimes|nullable|string|max:190","required":false},{"name":"password","rules":"sometimes|nullable|string|max:500","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/api-keys\/{apiKey}","name":"api.v1.app.api-keys.update","audience":"app","section":"api-keys","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"apiKey","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$req|string|max:100","required":false},{"name":"abilities","rules":"$req|array|min:1","required":false},{"name":"abilities.*","rules":"in:read,write,update,delete","required":false},{"name":"ip_addresses","rules":"sometimes|nullable|string|max:1000","required":false},{"name":"expires_on","rules":"sometimes|nullable|date|after:today","required":false},{"name":"user_id","rules":"sometimes|nullable|integer","required":false},{"name":"auth_type","rules":"sometimes|in:basic,oauth1,oauth2,credentials","required":false},{"name":"consumer_key","rules":"sometimes|nullable|string|max:190","required":false},{"name":"consumer_secret","rules":"sometimes|nullable|string|max:500","required":false},{"name":"realm","rules":"sometimes|nullable|string|max:190","required":false},{"name":"client_id","rules":"sometimes|nullable|string|max:190","required":false},{"name":"client_secret","rules":"sometimes|nullable|string|max:500","required":false},{"name":"username","rules":"sometimes|nullable|string|max:190","required":false},{"name":"password","rules":"sometimes|nullable|string|max:500","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/api-keys\/{apiKey}\/revoke","name":"api.v1.app.api-keys.revoke","audience":"app","section":"api-keys","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"apiKey","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-activity","name":"api.v1.app.app-activity.index","audience":"app","section":"app-activity","permissions":["app_devices.view"],"modules":[],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices","name":"api.v1.app.app-devices.index","audience":"app","section":"app-devices","permissions":["app_devices.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET app-devices: the phones of the people in the app_devices.view scope, with the summary (docs\/platform-control.md).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/people\/{user}","name":"api.v1.app.app-devices.person","audience":"app","section":"app-devices","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"GET app-devices\/people\/{user}: one person's phones with their IPs and timelines (the person themselves, or app_devices.view in scope).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/people\/{user}\/context","name":"api.v1.app.app-devices.person.context","audience":"app","section":"app-devices","permissions":["app_devices.context"],"modules":[],"rate_limit_per_minute":60,"summary":"GET app-devices\/people\/{user}\/context (app_devices.context, docs\/platform-control.md \u00ab\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0647\u0627\u062a\u0641\u00bb): the phone details this company's switches collected for a person in scope, latest per phone and the history.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/phones\/{install}\/test-push","name":"api.v1.app.app-devices.test-push","audience":"app","section":"app-devices","permissions":["app_devices.test_push"],"modules":[],"rate_limit_per_minute":10,"summary":"POST app-devices\/phones\/{install}\/test-push (app_devices.test_push, docs\/notifications.md \u00ab\u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a\u00bb): what Apple or Google answered.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"install","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/shared","name":"api.v1.app.app-devices.shared","audience":"app","section":"app-devices","permissions":["app_devices.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET app-devices\/shared: the phones in scope used by more than one account (the fleet filters too).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/allowances","name":"api.v1.app.app-devices.allowances.index","audience":"app","section":"app-devices","permissions":["app_devices.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET app-devices\/allowances (?phone_key=, ?active=1): HR's exceptions for the people in scope.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/allowances","name":"api.v1.app.app-devices.allowances.store","audience":"app","section":"app-devices","permissions":["app_devices.allow_shared"],"modules":[],"rate_limit_per_minute":60,"summary":"POST app-devices\/allowances: user_id, install_id (or phone_key), reason.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"user_id","rules":"required|integer","required":true},{"name":"install_id","rules":"nullable|integer|required_without:phone_key","required":false},{"name":"phone_key","rules":"nullable|string|max:140|required_without:install_id","required":false},{"name":"reason","rules":"required|string|min:3|'max:' . \\App\\Support\\Limits::chars(500)","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/allowances\/{allowance}","name":"api.v1.app.app-devices.allowances.destroy","audience":"app","section":"app-devices","permissions":["app_devices.allow_shared"],"modules":[],"rate_limit_per_minute":60,"summary":"DELETE app-devices\/allowances\/{id}: takes the exception back.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"allowance","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/not-on-app","name":"api.v1.app.app-devices.not-on-app","audience":"app","section":"app-devices","permissions":["app_devices.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET app-devices\/not-on-app: q, branch_id, account (yes|no); page, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/app-devices\/reminders","name":"api.v1.app.app-devices.reminders","audience":"app","section":"app-devices","permissions":["app_devices.remind"],"modules":[],"rate_limit_per_minute":10,"summary":"POST app-devices\/reminders: channel (email|whatsapp), employee_ids[] or all=true (with filters {q, branch_id, account}).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"channel","rules":"required|in:email,whatsapp","required":true},{"name":"all","rules":"sometimes|boolean","required":false},{"name":"employee_ids","rules":"required_without:all|array|max:500","required":false},{"name":"employee_ids.*","rules":"integer","required":false},{"name":"filters","rules":"sometimes|array","required":false},{"name":"q","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"branch_id","rules":"nullable|integer","required":false},{"name":"account","rules":"nullable|in:yes,no","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/app-policy","name":"api.v1.app.app-policy","audience":"app","section":"app-policy","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Every mobile app rule for the signed-in employee: {live_location, app_lock, punch_auth} (docs\/live-location.md).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/app-policy\/screen-captures\/{kind}","name":"api.v1.app.app-policy.screen-captures","audience":"app","section":"app-policy","permissions":[],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"screenshot|recording"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/approval-chains","name":"api.v1.app.approvals.chains","audience":"app","section":"approval-chains","permissions":["approval_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"chain_<kind> per kind: a CHAINS value, \"tpl:<id>\", or \"none\" (salary batches).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/approval-setup","name":"api.v1.app.approvals.setup","audience":"app","section":"approval-setup","permissions":["approval_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Approval chains of each request kind ('' = the kind's default), and the approval templates.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/approval-setup\/approvers","name":"api.v1.app.approvals.approvers","audience":"app","section":"approval-setup","permissions":["approval_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET approval-setup\/approvers: who \"Approved By\" can name for a template (template_id) or a new one, from its own branch only.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/approval-templates","name":"api.v1.app.approvals.templates.store","audience":"app","section":"approval-templates","permissions":["approval_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"object_type","rules":"nullable|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,timesheet","required":false},{"name":"object_id","rules":"nullable|integer","required":false},{"name":"assign","rules":"nullable|array","required":false},{"name":"assign.*","rules":"nullable|array","required":false},{"name":"steps","rules":"required|array|min:1|max:8","required":true},{"name":"steps.*.kind","rules":"required|string","required":true},{"name":"steps.*.members","rules":"nullable|array","required":false},{"name":"skip_after","rules":"nullable|integer|min:0|max:720","required":false},{"name":"skip_after_unit","rules":"nullable|in:days,hours","required":false},{"name":"notify_user_ids","rules":"nullable|array","required":false},{"name":"overrider_ids","rules":"nullable|array","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/approval-templates\/{template}","name":"api.v1.app.approvals.templates.update","audience":"app","section":"approval-templates","permissions":["approval_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/approval-templates\/{template}","name":"api.v1.app.approvals.templates.destroy","audience":"app","section":"approval-templates","permissions":["approval_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/approvals","name":"api.v1.app.approvals.index","audience":"app","section":"approvals","permissions":["self.approvals.decide","requests.view","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The approvals page: tab (approvals, my, team, override), status, type. Leave requests and employee requests together.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"tab","rules":"nullable|'in:' . implode(',', $tabs)","required":false},{"name":"status","rules":"nullable|in:all,pending,approved,rejected,withdrawn,cancelled","required":false},{"name":"type","rules":"nullable|string","required":false},{"name":"my_action","rules":"nullable|in:waiting,pending,approved,rejected,withdrawn,approved_non_deduct,added_by_hr,delegated,skipped,cancelled,cancel_requested,none","required":false},{"name":"f","rules":"nullable|array","required":false},{"name":"action_type","rules":"nullable|in:approval,cancellation","required":false},{"name":"employee","rules":"nullable|integer","required":false},{"name":"sort","rules":"nullable|in:employee,serial,requested,received,my_action","required":false},{"name":"dir","rules":"nullable|in:asc,desc","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/approvals\/override","name":"api.v1.app.approvals.override","audience":"app","section":"approvals","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Override approvals: decide a request waiting on someone else. item is \"leave:ID\" or \"request:ID\".","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"item","rules":"required|string|regex:\/^(leave|request):\\d+$\/","required":true},{"name":"decision","rules":"required|in:approved,rejected","required":true},{"name":"decision_note","rules":"nullable|string|max:500","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/approvals\/bulk","name":"api.v1.app.approvals.bulk","audience":"app","section":"approvals","permissions":["self.approvals.decide","requests.view","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"Approve or reject several items; the ones that can't be decided are skipped.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"items","rules":"required|array|min:1|max:200","required":true},{"name":"items.*","rules":"string|regex:\/^(leave|request):\\d+$\/","required":false},{"name":"decision","rules":"required|in:approved,rejected","required":true},{"name":"decision_note","rules":"nullable|string|max:500","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/approvals\/delegations","name":"api.v1.app.approvals.delegations","audience":"app","section":"approvals","permissions":["self.approvals.delegate","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Approval delegations I gave or received (ZenHR's \"Delegated\").","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/approvals\/delegations","name":"api.v1.app.approvals.delegate","audience":"app","section":"approvals","permissions":["self.approvals.delegate","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"Delegate my approvals: delegate_id (a user of the company), starts_on, ends_on (empty = until ended), note.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"delegate_id","rules":"required|integer|Rule::notIn([$user->id])|exists:company_user,user_id","required":true},{"name":"starts_on","rules":"required|date","required":true},{"name":"ends_on","rules":"nullable|date|after_or_equal:starts_on","required":false},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(300)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/approvals\/delegations\/{delegation}","name":"api.v1.app.approvals.undelegate","audience":"app","section":"approvals","permissions":["self.approvals.delegate","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"delegation","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/summary","name":"api.v1.app.assessments.summary","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/grading","name":"api.v1.app.assessments.grading","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Attempts waiting for a person, with the answers to grade.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/attempts\/{attempt}","name":"api.v1.app.assessments.attempts.show","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An attempt with every answer, the right ones and the anti-cheating log.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"attempt","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/answers\/{answer}\/grade","name":"api.v1.app.assessments.answers.grade","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"points (0 to the question's points), note; reason when changing a grade already given (an automatic one too).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"answer","type":"integer","pattern":null}],"fields":[{"name":"points","rules":"required|numeric|min:0|'max:' . $max","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"reason","rules":"Rule::requiredIf($changing)|nullable|string|min:3|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/answers\/{answer}\/media","name":"api.v1.app.assessments.answers.media","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"answer","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests\/{test}\/results","name":"api.v1.app.assessments.tests.results","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Every attempt with its score and checks, and how each question did.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"test","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests\/{test}\/export","name":"api.v1.app.assessments.tests.export","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"test","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/invitations","name":"api.v1.app.assessments.invitations.index","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.grade"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: test, status, candidate, employee.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/templates","name":"api.v1.app.assessments.templates","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/templates\/{key}","name":"api.v1.app.assessments.templates.install","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"key","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/categories","name":"api.v1.app.assessments.categories.index","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/categories","name":"api.v1.app.assessments.categories.store","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, description {en, ar}, competency_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(120)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"description.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"competency_id","rules":"nullable|integer|exists:competencies,id","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/categories\/{category}","name":"api.v1.app.assessments.categories.update","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"category","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/categories\/{category}","name":"api.v1.app.assessments.categories.destroy","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"category","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/questions","name":"api.v1.app.assessments.questions.index","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: category, type, difficulty, active, q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/questions\/{question}","name":"api.v1.app.assessments.questions.show","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"question","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/questions\/{question}\/media","name":"api.v1.app.assessments.questions.media","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"question","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/questions","name":"api.v1.app.assessments.questions.store","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"type, assessment_category_id, difficulty, prompt {en, ar}, options [{key?, text {en, ar}}], targets, answer, points, time_limit_seconds, explanation, is_active.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"type","rules":"required|in:single,multiple,true_false,short_text,long_text,ordering,matching,numeric,file_upload","required":true},{"name":"assessment_category_id","rules":"nullable|integer|exists:assessment_categories,id","required":false},{"name":"difficulty","rules":"required|in:easy,medium,hard","required":true},{"name":"prompt","rules":"required|array","required":true},{"name":"prompt.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(5000)","required":true},{"name":"prompt.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(5000)","required":false},{"name":"explanation","rules":"nullable|array","required":false},{"name":"explanation.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"explanation.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"points","rules":"required|numeric|min:0.25|max:100","required":true},{"name":"time_limit_seconds","rules":"nullable|integer|between:10,3600","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"options","rules":"Rule::requiredIf(in_array($type, ['single', 'multiple', 'ordering', 'matching'],...|nullable|array|max:12","required":false},{"name":"options.*.key","rules":"nullable|string|max:20","required":false},{"name":"options.*.text","rules":"required|array","required":true},{"name":"options.*.text.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(500)","required":true},{"name":"options.*.text.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"targets","rules":"Rule::requiredIf($type === 'matching')|nullable|array|max:12","required":false},{"name":"targets.*.key","rules":"nullable|string|max:20","required":false},{"name":"targets.*.text","rules":"required|array","required":true},{"name":"targets.*.text.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(500)","required":true},{"name":"targets.*.text.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"answer","rules":"nullable","required":false},{"name":"correct","rules":"nullable","required":false},{"name":"remove_media","rules":"nullable|boolean","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/questions\/{question}","name":"api.v1.app.assessments.questions.update","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"question","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/questions\/{question}","name":"api.v1.app.assessments.questions.destroy","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.questions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"question","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests","name":"api.v1.app.assessments.tests.index","audience":"app","section":"assessments","permissions":["assessments.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: status, purpose, q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests\/{test}","name":"api.v1.app.assessments.tests.show","audience":"app","section":"assessments","permissions":["assessments.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A test with its items.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"test","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests","name":"api.v1.app.assessments.tests.store","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.tests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"description.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"instructions","rules":"nullable|array","required":false},{"name":"instructions.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(3000)","required":false},{"name":"instructions.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(3000)","required":false},{"name":"purpose","rules":"required|in:pre_employment,post_employment","required":true},{"name":"time_limit_minutes","rules":"nullable|integer|between:1,480","required":false},{"name":"shuffle_questions","rules":"boolean","required":false},{"name":"shuffle_options","rules":"boolean","required":false},{"name":"negative_marking","rules":"boolean","required":false},{"name":"show_score","rules":"boolean","required":false},{"name":"attempts_allowed","rules":"required|integer|between:1,10","required":true},{"name":"pass_mark","rules":"required|numeric|between:0,100","required":true},{"name":"negative_ratio","rules":"nullable|numeric|between:0,1","required":false},{"name":"competency_id","rules":"nullable|integer|exists:competencies,id","required":false},{"name":"pass_stage","rules":"nullable|Rule::in($stages)","required":false},{"name":"fail_stage","rules":"nullable|Rule::in($stages)","required":false},{"name":"status","rules":"required|in:draft,active,archived","required":true},{"name":"items","rules":"nullable|array|max:200","required":false},{"name":"items.*.kind","rules":"required|in:question,random","required":true},{"name":"items.*.assessment_question_id","rules":"required_if:items.*.kind,question|nullable|integer|exists:assessment_questions,id","required":false},{"name":"items.*.assessment_category_id","rules":"required_if:items.*.kind,random|nullable|integer|exists:assessment_categories,id","required":false},{"name":"items.*.difficulty","rules":"nullable|in:easy,medium,hard","required":false},{"name":"items.*.draw_count","rules":"required_if:items.*.kind,random|nullable|integer|between:1,100","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests\/{test}","name":"api.v1.app.assessments.tests.update","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.tests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"test","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests\/{test}","name":"api.v1.app.assessments.tests.destroy","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.tests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"test","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/tests\/{test}\/invitations","name":"api.v1.app.assessments.invitations.store","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.invite"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"candidate_ids, employee_ids, expires_at, locale. The candidates' links are in the answer.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"test","type":"integer","pattern":null}],"fields":[{"name":"candidate_ids","rules":"nullable|array|max:200","required":false},{"name":"candidate_ids.*","rules":"integer|exists:candidates,id","required":false},{"name":"employee_ids","rules":"nullable|array|max:500","required":false},{"name":"employee_ids.*","rules":"integer|exists:employees,id","required":false},{"name":"expires_at","rules":"nullable|date|after:now","required":false},{"name":"locale","rules":"nullable|in:en,ar","required":false},{"name":"pass_stage","rules":"nullable|Rule::in(array_diff(\\App\\Models\\Candidate::STAGES, ['hired']))","required":false},{"name":"fail_stage","rules":"nullable|Rule::in(array_diff(\\App\\Models\\Candidate::STAGES, ['hired']))","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/invitations\/{invitation}\/cancel","name":"api.v1.app.assessments.invitations.cancel","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.invite"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"invitation","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assessments\/invitations\/{invitation}\/resend","name":"api.v1.app.assessments.invitations.resend","audience":"app","section":"assessments","permissions":["assessments.manage.*","assessments.invite"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"expires_at (optional; required when the link has expired). sent and reason (sandbox, mail_off, employees_held, no_email, failed) say what happened.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"invitation","type":"integer","pattern":null}],"fields":[{"name":"expires_at","rules":"nullable|date|after:now","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/asset-types","name":"api.v1.app.asset-types.index","audience":"app","section":"asset-types","permissions":["assets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/asset-types","name":"api.v1.app.asset-types.store","audience":"app","section":"asset-types","permissions":["assets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, branch_ids (ids, or [\"all\"]), active.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"branch_ids","rules":"required|array|min:1","required":true},{"name":"branch_ids.*","rules":"string","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/asset-types\/{assetType}","name":"api.v1.app.asset-types.update","audience":"app","section":"asset-types","permissions":["assets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assetType","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"branch_ids","rules":"required|array|min:1","required":true},{"name":"branch_ids.*","rules":"string","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/asset-types\/{assetType}","name":"api.v1.app.asset-types.destroy","audience":"app","section":"asset-types","permissions":["assets.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assetType","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assets","name":"api.v1.app.assets.index","audience":"app","section":"assets","permissions":["assets.manage","assets.create","assets.edit","assets.delete","assets.assign","assets.status"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The list: status, type, owner (branch id or none), holder, expiry_from, expiry_to, q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assets","name":"api.v1.app.assets.store","audience":"app","section":"assets","permissions":["assets.create"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"asset_type_id","rules":"required|integer|exists:asset_types,id","required":true},{"name":"name","rules":"required|string|max:150","required":true},{"name":"serial_number","rules":"required|string|max:100|unique:assets,serial_number","required":true},{"name":"owner_branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"purchase_date","rules":"nullable|date|before_or_equal:today","required":false},{"name":"value","rules":"nullable|numeric|min:0","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"owner","rules":"nullable|string|max:150","required":false},{"name":"production_date","rules":"nullable|date","required":false},{"name":"expiry_date","rules":"nullable|date|after_or_equal:production_date","required":false},{"name":"attachments","rules":"nullable|array|max:10","required":false},{"name":"attachments.*","rules":"file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|max:10240","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/assets\/{asset}","name":"api.v1.app.assets.show","audience":"app","section":"assets","permissions":["assets.manage","assets.create","assets.edit","assets.delete","assets.assign","assets.status"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An asset and its history.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"asset","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/assets\/{asset}","name":"api.v1.app.assets.update","audience":"app","section":"assets","permissions":["assets.edit"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"asset","type":"integer","pattern":null}],"fields":[{"name":"asset_type_id","rules":"required|integer|exists:asset_types,id","required":true},{"name":"name","rules":"required|string|max:150","required":true},{"name":"serial_number","rules":"required|string|max:100|unique:assets,serial_number","required":true},{"name":"owner_branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"purchase_date","rules":"nullable|date|before_or_equal:today","required":false},{"name":"value","rules":"nullable|numeric|min:0","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"owner","rules":"nullable|string|max:150","required":false},{"name":"production_date","rules":"nullable|date","required":false},{"name":"expiry_date","rules":"nullable|date|after_or_equal:production_date","required":false},{"name":"attachments","rules":"nullable|array|max:10","required":false},{"name":"attachments.*","rules":"file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|max:10240","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/assets\/{asset}","name":"api.v1.app.assets.destroy","audience":"app","section":"assets","permissions":["assets.delete"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"asset","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assets\/{asset}\/assign","name":"api.v1.app.assets.assign","audience":"app","section":"assets","permissions":["assets.assign"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Hand it to an employee in scope: assigned_to, assigned_at, return_date, notes, attachments[].","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"asset","type":"integer","pattern":null}],"fields":[{"name":"assigned_to","rules":"required|integer","required":true},{"name":"assigned_at","rules":"nullable|date","required":false},{"name":"return_date","rules":"nullable|date|after_or_equal:assigned_at","required":false},{"name":"notes","rules":"nullable|string|max:10240","required":false},{"name":"attachments","rules":"nullable|array|max:10","required":false},{"name":"attachments.*","rules":"file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|max:10240","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assets\/{asset}\/release","name":"api.v1.app.assets.release","audience":"app","section":"assets","permissions":["assets.assign"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Take it back: it becomes available.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"asset","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/assets\/{asset}\/status","name":"api.v1.app.assets.status","audience":"app","section":"assets","permissions":["assets.status"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"status: damaged, under_repair, archived or available.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"asset","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/clock-in","name":"api.v1.app.attendance.clock-in","audience":"app","section":"attendance","permissions":["self.clock"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"attendance_function_id","rules":"nullable|integer|exists:attendance_functions,id","required":false},{"name":"photo","rules":"required|image|max:10240","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/clock-out","name":"api.v1.app.attendance.clock-out","audience":"app","section":"attendance","permissions":["self.clock"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"photo","rules":"required|image|max:10240","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/scan","name":"api.v1.app.attendance.scan","audience":"app","section":"attendance","permissions":["self.clock"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"token","rules":"required|string|max:100","required":true},{"name":"t","rules":"nullable|integer","required":false},{"name":"s","rules":"nullable|string|max:64","required":false},{"name":"attendance_function_id","rules":"nullable|integer|exists:attendance_functions,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/punch-log","name":"api.v1.app.attendance.punch-log","audience":"app","section":"attendance","permissions":["attendance.security.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The punch log: employee, branch, from, to, channel, device, ip, flagged, status, review; format=csv|xlsx for the branded export.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"from","rules":"nullable|date_format:Y-m-d","required":false},{"name":"to","rules":"nullable|date_format:Y-m-d","required":false},{"name":"employee","rules":"nullable|integer","required":false},{"name":"branch","rules":"nullable|integer","required":false},{"name":"format","rules":"nullable|in:json,csv,xlsx","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/punch-log\/{context}","name":"api.v1.app.attendance.punch-log.show","audience":"app","section":"attendance","permissions":["attendance.security.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"context","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/punch-log\/{context}\/decide","name":"api.v1.app.attendance.punch-log.decide","audience":"app","section":"attendance","permissions":["attendance.security.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"decision: approve or reject; note; approve_device to approve its pending device too.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"context","type":"integer","pattern":null}],"fields":[{"name":"decision","rules":"required|in:approve,reject","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"approve_device","rules":"nullable|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/team","name":"api.v1.app.attendance.team","audience":"app","section":"attendance","permissions":["attendance.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The team's month: totals per employee in reach (attendance.view).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/today","name":"api.v1.app.attendance.today","audience":"app","section":"attendance","permissions":["attendance.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One day of the team (docs\/mobile-hrm.md): date (today by default).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"date","rules":"nullable|date_format:Y-m-d","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/records","name":"api.v1.app.attendance.records","audience":"app","section":"attendance","permissions":["attendance.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Attendance records: from, to, employee, shift (work shift id), state (incomplete, complete, trusted).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"from","rules":"nullable|date","required":false},{"name":"to","rules":"nullable|date","required":false},{"name":"employee","rules":"nullable|integer","required":false},{"name":"shift","rules":"nullable|integer","required":false},{"name":"state","rules":"nullable|in:incomplete,complete,trusted","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/records","name":"api.v1.app.attendance.records.store","audience":"app","section":"attendance","permissions":["attendance.records.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Add a record, or with \"replace\": true correct the day (its records are replaced).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"work_date","rules":"required|date|before_or_equal:today","required":true},{"name":"clock_in","rules":"required|date_format:H:i","required":true},{"name":"clock_out","rules":"nullable|date_format:H:i|after:clock_in","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/records\/{record}\/trust","name":"api.v1.app.attendance.records.trust","audience":"app","section":"attendance","permissions":["attendance.records.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"record","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/sheets","name":"api.v1.app.attendance.sheets","audience":"app","section":"attendance","permissions":["attendance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ZenHR's Attendance Sheets: sheets imported from machines. Filters: machine (device id), status, from, to (import date).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"machine","rules":"nullable|integer","required":false},{"name":"status","rules":"nullable|in:completed,with_errors,failed","required":false},{"name":"from","rules":"nullable|date_format:Y-m-d","required":false},{"name":"to","rules":"nullable|date_format:Y-m-d","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/sheets\/template\/{device}","name":"api.v1.app.attendance.sheets.template","audience":"app","section":"attendance","permissions":["attendance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A machine's blank attendance sheet in its template (rows of cells; the first is the headings).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/day-analysis","name":"api.v1.app.attendance.day-analysis","audience":"app","section":"attendance","permissions":["attendance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee","rules":"nullable|integer","required":false},{"name":"from","rules":"nullable|date_format:Y-m-d","required":false},{"name":"to","rules":"nullable|date_format:Y-m-d","required":false},{"name":"status","rules":"nullable|in:present,absent,partial","required":false},{"name":"type","rules":"nullable|integer","required":false},{"name":"year","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/punches","name":"api.v1.app.attendance.punches","audience":"app","section":"attendance","permissions":["attendance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee","rules":"nullable|integer","required":false},{"name":"from","rules":"nullable|date_format:Y-m-d","required":false},{"name":"to","rules":"nullable|date_format:Y-m-d","required":false},{"name":"status","rules":"nullable|in:present,absent,partial","required":false},{"name":"type","rules":"nullable|integer","required":false},{"name":"year","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/recommendations","name":"api.v1.app.attendance.recommendations","audience":"app","section":"attendance","permissions":["attendance.recommendations.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Recommendations of the employees in reach: status (pending, applied, ignored), kind, from, to.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"nullable|in:pending,applied,ignored","required":false},{"name":"kind","rules":"nullable|in:absence,lateness,early_out,incomplete,overtime,leave","required":false},{"name":"from","rules":"nullable|date","required":false},{"name":"to","rules":"nullable|date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/recommendations\/refresh","name":"api.v1.app.attendance.recommendations.refresh","audience":"app","section":"attendance","permissions":["attendance.recommendations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/recommendations\/act","name":"api.v1.app.attendance.recommendations.act","audience":"app","section":"attendance","permissions":["attendance.recommendations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Apply, ignore or tell the manager: ids and action.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/attendance\/missing-punches","name":"api.v1.app.attendance.missing-punches","audience":"app","section":"attendance","permissions":["attendance.missing_punches.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ZenHR Manage missing punches: status, punch dates from \/ to, employee; 50 a page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"nullable|in:pending,approved,rejected,cancelled,withdrawn","required":false},{"name":"from","rules":"nullable|date_format:Y-m-d","required":false},{"name":"to","rules":"nullable|date_format:Y-m-d","required":false},{"name":"employee","rules":"nullable|integer","required":false},{"name":"employee_status","rules":"nullable|in:active,suspended,terminated","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/attest\/challenge","name":"api.v1.app.attest.challenge","audience":"app","section":"attest","permissions":[],"modules":[],"rate_limit_per_minute":20,"summary":"App Attest: a one-time challenge for the next attestation (five minutes).","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/attest\/register","name":"api.v1.app.attest.register","audience":"app","section":"attest","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"App Attest: key_id, attestation (base64), challenge, device_id (the device.id sent with punches).","parameters":[],"fields":[{"name":"key_id","rules":"required|string|max:100","required":true},{"name":"attestation","rules":"required|string|max:20000","required":true},{"name":"challenge","rules":"required|string|max:100","required":true},{"name":"device_id","rules":"required|string|max:100","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices","name":"api.v1.app.biometric.index","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/detected","name":"api.v1.app.biometric.detected","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Clocks calling in from the caller's own public IP that no company has added yet (docs\/devices.md).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices","name":"api.v1.app.biometric.store","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/{device}","name":"api.v1.app.biometric.update","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Send only what changes.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/{device}","name":"api.v1.app.biometric.destroy","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/{device}\/token","name":"api.v1.app.biometric.rotate","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A new secret for the punches endpoint, shown this once.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/{device}\/users","name":"api.v1.app.biometric.users","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET biometric-devices\/{id}\/users: the machine's users and the numbers it sent, each with the employee it links to.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/{device}\/sheet","name":"api.v1.app.biometric.sheet","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"POST biometric-devices\/{id}\/sheet (multipart sheet): reads an attendance sheet exported from the machine.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[{"name":"sheet","rules":"required|file|mimes:csv,txt,xlsx|max:10240","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-devices\/reprocess","name":"api.v1.app.biometric.reprocess","audience":"app","section":"biometric-devices","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Matches punches whose number now belongs to an employee.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-templates\/{template}\/resolve","name":"api.v1.app.devices.resolve","audience":"app","section":"biometric-templates","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"version_id: keep that version everywhere; or re_enroll_device_id: ask that device to enrol the slot again.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"version_id","rules":"nullable|integer|required_without:re_enroll_device_id","required":false},{"name":"re_enroll_device_id","rules":"nullable|integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-templates\/{template}\/publish","name":"api.v1.app.devices.publish-slot","audience":"app","section":"biometric-templates","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/biometric-templates\/{template}\/remove","name":"api.v1.app.devices.remove-slot","audience":"app","section":"biometric-templates","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Remove a slot from one device (device_id) or from the master set; needs confirm: true.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"confirm","rules":"accepted","required":false},{"name":"device_id","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/boarding-templates","name":"api.v1.app.boarding-templates.index","audience":"app","section":"boarding-templates","permissions":["employee_settings.boarding_templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/boarding-templates","name":"api.v1.app.boarding-templates.store","audience":"app","section":"boarding-templates","permissions":["employee_settings.boarding_templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"category","rules":"required|in:onboarding,offboarding,clearance,resumption","required":true},{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"when_to_send","rules":"nullable|in:on_date,before","required":false},{"name":"days_to_send","rules":"match ($category) {\n    'onboarding' => 'required_if:when_to_send,before',\n    '...|nullable|integer|min:0|max:365","required":false},{"name":"arrive_by","rules":"nullable|date_format:H:i","required":false},{"name":"location_name","rules":"nullable|string|max:150","required":false},{"name":"contact_employee_id","rules":"nullable|integer|$employees","required":false},{"name":"sequential","rules":"nullable|boolean","required":false},{"name":"min_vacation_days","rules":"in_array($category, ['clearance', 'resumption'], true) ? 'required' : 'nullable'|nullable|integer|min:1|max:365","required":false},{"name":"leave_type_id","rules":"nullable|integer|exists:leave_types,id","required":false},{"name":"resumption_trigger","rules":"$category === 'resumption' ? 'required' : 'nullable'|nullable|in:first_punch,employee_request,auto_send","required":false},{"name":"auto_adjust","rules":"nullable|boolean","required":false},{"name":"notify_after_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"notify_user_ids","rules":"nullable|array|max:50","required":false},{"name":"notify_user_ids.*","rules":"integer|$employees","required":false},{"name":"filters","rules":"nullable|array","required":false},{"name":"filters.*","rules":"nullable|array","required":false},{"name":"filters.*.*","rules":"nullable|string|max:80","required":false},{"name":"tasks","rules":"required|array|min:1|max:50","required":true},{"name":"tasks.*.kind","rules":"required|Rule::in($kinds)","required":true},{"name":"tasks.*.title","rules":"nullable|required_if:tasks.*.kind,custom|string|max:200","required":false},{"name":"tasks.*.document_type_id","rules":"nullable|required_if:tasks.*.kind,document_upload|integer|exists:document_types,id","required":false},{"name":"tasks.*.document_id","rules":"nullable|required_if:tasks.*.kind,document_download|integer|exists:employee_documents,id","required":false},{"name":"tasks.*.asset_type_id","rules":"nullable|required_if:tasks.*.kind,give_asset,take_asset|integer|exists:asset_types,id","required":false},{"name":"tasks.*.assignee","rules":"nullable|in:employee,person","required":false},{"name":"tasks.*.assignee_employee_id","rules":"nullable|required_if:tasks.*.kind,give_asset,take_asset|required_if:tasks.*.assignee,person|integer|$employees","required":false},{"name":"tasks.*.due_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"tasks.*.notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"tasks.*.notes_required","rules":"nullable|boolean","required":false},{"name":"tasks.*.attachments_required","rules":"nullable|boolean","required":false},{"name":"tasks.*.profile_fields","rules":"nullable|required_if:tasks.*.kind,complete_profile|array|min:1","required":false},{"name":"tasks.*.profile_fields.*","rules":"in:email,gender,mobile,religion,birth_date,national_id,nationality,marital_status,emergency_contacts","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/boarding-templates\/{template}","name":"api.v1.app.boarding-templates.show","audience":"app","section":"boarding-templates","permissions":["employee_settings.boarding_templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/boarding-templates\/{template}","name":"api.v1.app.boarding-templates.update","audience":"app","section":"boarding-templates","permissions":["employee_settings.boarding_templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"category","rules":"required|in:onboarding,offboarding,clearance,resumption","required":true},{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"when_to_send","rules":"nullable|in:on_date,before","required":false},{"name":"days_to_send","rules":"match ($category) {\n    'onboarding' => 'required_if:when_to_send,before',\n    '...|nullable|integer|min:0|max:365","required":false},{"name":"arrive_by","rules":"nullable|date_format:H:i","required":false},{"name":"location_name","rules":"nullable|string|max:150","required":false},{"name":"contact_employee_id","rules":"nullable|integer|$employees","required":false},{"name":"sequential","rules":"nullable|boolean","required":false},{"name":"min_vacation_days","rules":"in_array($category, ['clearance', 'resumption'], true) ? 'required' : 'nullable'|nullable|integer|min:1|max:365","required":false},{"name":"leave_type_id","rules":"nullable|integer|exists:leave_types,id","required":false},{"name":"resumption_trigger","rules":"$category === 'resumption' ? 'required' : 'nullable'|nullable|in:first_punch,employee_request,auto_send","required":false},{"name":"auto_adjust","rules":"nullable|boolean","required":false},{"name":"notify_after_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"notify_user_ids","rules":"nullable|array|max:50","required":false},{"name":"notify_user_ids.*","rules":"integer|$employees","required":false},{"name":"filters","rules":"nullable|array","required":false},{"name":"filters.*","rules":"nullable|array","required":false},{"name":"filters.*.*","rules":"nullable|string|max:80","required":false},{"name":"tasks","rules":"required|array|min:1|max:50","required":true},{"name":"tasks.*.kind","rules":"required|Rule::in($kinds)","required":true},{"name":"tasks.*.title","rules":"nullable|required_if:tasks.*.kind,custom|string|max:200","required":false},{"name":"tasks.*.document_type_id","rules":"nullable|required_if:tasks.*.kind,document_upload|integer|exists:document_types,id","required":false},{"name":"tasks.*.document_id","rules":"nullable|required_if:tasks.*.kind,document_download|integer|exists:employee_documents,id","required":false},{"name":"tasks.*.asset_type_id","rules":"nullable|required_if:tasks.*.kind,give_asset,take_asset|integer|exists:asset_types,id","required":false},{"name":"tasks.*.assignee","rules":"nullable|in:employee,person","required":false},{"name":"tasks.*.assignee_employee_id","rules":"nullable|required_if:tasks.*.kind,give_asset,take_asset|required_if:tasks.*.assignee,person|integer|$employees","required":false},{"name":"tasks.*.due_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"tasks.*.notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"tasks.*.notes_required","rules":"nullable|boolean","required":false},{"name":"tasks.*.attachments_required","rules":"nullable|boolean","required":false},{"name":"tasks.*.profile_fields","rules":"nullable|required_if:tasks.*.kind,complete_profile|array|min:1","required":false},{"name":"tasks.*.profile_fields.*","rules":"in:email,gender,mobile,religion,birth_date,national_id,nationality,marital_status,emergency_contacts","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/boarding-templates\/{template}\/copy","name":"api.v1.app.boarding-templates.copy","audience":"app","section":"boarding-templates","permissions":["employee_settings.boarding_templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/boarding-templates\/{template}","name":"api.v1.app.boarding-templates.destroy","audience":"app","section":"boarding-templates","permissions":["employee_settings.boarding_templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/boardings\/{workflow}\/pdf","name":"api.v1.app.boardings.pdf","audience":"app","section":"boardings","permissions":["self.workflows","employees.view"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"The workflow as a PDF file (application\/pdf); lang en|ar, else the reader's language.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"workflow","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/boardings","name":"api.v1.app.boardings.index","audience":"app","section":"boardings","permissions":["employees.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/boardings\/{workflow}","name":"api.v1.app.boardings.show","audience":"app","section":"boardings","permissions":["employees.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"workflow","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/boardings\/mass-onboard","name":"api.v1.app.boardings.mass","audience":"app","section":"boardings","permissions":["employees.boardings.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"boarding_template_id","rules":"required|integer|exists:boarding_templates,id","required":true},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"employee_ids","rules":"required|array|min:1|max:500","required":true},{"name":"employee_ids.*","rules":"integer","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/boardings\/{workflow}","name":"api.v1.app.boardings.destroy","audience":"app","section":"boardings","permissions":["employees.boardings.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"workflow","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/branch","name":"api.v1.app.branch.show","audience":"app","section":"branch","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/branch","name":"api.v1.app.branch.update","audience":"app","section":"branch","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch","rules":"required|regex:\/^(\\d+|all)$\/","required":true}]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/branches\/{branch}\/regional-settings","name":"api.v1.app.regional-settings.branch","audience":"app","section":"branches","permissions":["branches.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/branches","name":"api.v1.app.branches.index","audience":"app","section":"branches","permissions":["branches.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/branches","name":"api.v1.app.branches.store","audience":"app","section":"branches","permissions":["branches.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/branches\/{branch}","name":"api.v1.app.branches.update","audience":"app","section":"branches","permissions":["branches.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/branches\/{branch}\/main","name":"api.v1.app.branches.main","audience":"app","section":"branches","permissions":["branches.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/people","name":"api.v1.app.buddy.people","audience":"app","section":"buddy-punching","permissions":["attendance.buddy.view","attendance.buddy.export"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The people with a score, highest first; format=csv|xlsx with attendance.buddy.export.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/signals","name":"api.v1.app.buddy.signals","audience":"app","section":"buddy-punching","permissions":["attendance.buddy.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/signals\/{signal}","name":"api.v1.app.buddy.signal","audience":"app","section":"buddy-punching","permissions":["attendance.buddy.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"signal","type":"integer","pattern":null}],"fields":[{"name":"decision","rules":"required|in:confirm,dismiss","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/presence","name":"api.v1.app.buddy.presence","audience":"app","section":"buddy-punching","permissions":["attendance.buddy.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/presence\/{check}","name":"api.v1.app.buddy.presence.review","audience":"app","section":"buddy-punching","permissions":["attendance.buddy.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"check","type":"integer","pattern":null}],"fields":[{"name":"decision","rules":"required|in:excuse,confirm","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/faces","name":"api.v1.app.buddy.faces","audience":"app","section":"buddy-punching","permissions":["attendance.face.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/faces\/missing","name":"api.v1.app.buddy.faces.missing","audience":"app","section":"buddy-punching","permissions":["attendance.face.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Who hasn't taken the biometric photo yet.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/faces\/{template}\/photo","name":"api.v1.app.buddy.faces.photo","audience":"app","section":"buddy-punching","permissions":["attendance.face.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The photo waiting for HR's approval, as a JPEG. Each look goes in the audit trail.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/consents","name":"api.v1.app.buddy.consents","audience":"app","section":"buddy-punching","permissions":["attendance.face.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/faces\/{template}\/approve","name":"api.v1.app.buddy.face-approve","audience":"app","section":"buddy-punching","permissions":["attendance.face.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/faces\/reset\/{employee}","name":"api.v1.app.buddy.face-reset","audience":"app","section":"buddy-punching","permissions":["attendance.face.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/keys","name":"api.v1.app.buddy.keys","audience":"app","section":"buddy-punching","permissions":["attendance.buddy.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/buddy-punching\/keys\/{key}","name":"api.v1.app.buddy.key","audience":"app","section":"buddy-punching","permissions":["attendance.device_key.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"key","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|in:approve,reset","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/setup","name":"api.v1.app.payroll.business-travel.setup","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/setup","name":"api.v1.app.payroll.business-travel.setup.update","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"trip_per_diem_type_id","rules":"required|$type","required":true},{"name":"trip_payment","rules":"required|in:in_payroll,off_cycle","required":true},{"name":"trip_air_ticket_type_id","rules":"required|$type","required":true},{"name":"trip_accommodation_type_id","rules":"required|$type","required":true},{"name":"trip_remind_days","rules":"required|integer|min:0|max:60","required":true},{"name":"trip_expense_type_ids","rules":"nullable|array","required":false},{"name":"trip_expense_type_ids.*","rules":"integer|$type","required":false},{"name":"components","rules":"nullable|array","required":false},{"name":"components.*.id","rules":"nullable|integer","required":false},{"name":"components.*.name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"components.*.name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/policies","name":"api.v1.app.payroll.business-travel.policies","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/policies","name":"api.v1.app.payroll.business-travel.policies.store","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"position_ids","rules":"required|array|min:1","required":true},{"name":"position_ids.*","rules":"integer|exists:positions,id","required":false},{"name":"destinations","rules":"required|array|min:1|max:30","required":true},{"name":"destinations.*.category","rules":"required|in:domestic,international","required":true},{"name":"destinations.*.country","rules":"nullable|string|max:80","required":false},{"name":"destinations.*.departure_cities","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"destinations.*.arrival_cities","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"destinations.*.departure_countries","rules":"nullable","required":false},{"name":"destinations.*.arrival_countries","rules":"nullable","required":false},{"name":"destinations.*.departure_countries.*","rules":"string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"destinations.*.arrival_countries.*","rules":"string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"destinations.*.travel_types","rules":"nullable|array","required":false},{"name":"destinations.*.travel_types.*","rules":"in:airplane,bus,car,train","required":false},{"name":"destinations.*.air_classes","rules":"nullable|array","required":false},{"name":"destinations.*.air_classes.*","rules":"in:economy,business,first","required":false},{"name":"destinations.*.max_air_ticket","rules":"nullable|numeric|min:0","required":false},{"name":"destinations.*.max_travel_cost","rules":"nullable|numeric|min:0","required":false},{"name":"destinations.*.hotel_tiers","rules":"nullable|array","required":false},{"name":"destinations.*.hotel_tiers.*","rules":"integer|between:1,5","required":false},{"name":"destinations.*.max_accommodation","rules":"nullable|numeric|min:0","required":false},{"name":"destinations.*.components","rules":"nullable|array","required":false},{"name":"destinations.*.components.*.type_id","rules":"nullable|integer|exists:per_diem_types,id","required":false},{"name":"destinations.*.components.*.amount","rules":"nullable|numeric|min:0","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/policies\/{policy}","name":"api.v1.app.payroll.business-travel.policies.show","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/policies\/{policy}","name":"api.v1.app.payroll.business-travel.policies.update","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"position_ids","rules":"required|array|min:1","required":true},{"name":"position_ids.*","rules":"integer|exists:positions,id","required":false},{"name":"destinations","rules":"required|array|min:1|max:30","required":true},{"name":"destinations.*.category","rules":"required|in:domestic,international","required":true},{"name":"destinations.*.country","rules":"nullable|string|max:80","required":false},{"name":"destinations.*.departure_cities","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"destinations.*.arrival_cities","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"destinations.*.departure_countries","rules":"nullable","required":false},{"name":"destinations.*.arrival_countries","rules":"nullable","required":false},{"name":"destinations.*.departure_countries.*","rules":"string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"destinations.*.arrival_countries.*","rules":"string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"destinations.*.travel_types","rules":"nullable|array","required":false},{"name":"destinations.*.travel_types.*","rules":"in:airplane,bus,car,train","required":false},{"name":"destinations.*.air_classes","rules":"nullable|array","required":false},{"name":"destinations.*.air_classes.*","rules":"in:economy,business,first","required":false},{"name":"destinations.*.max_air_ticket","rules":"nullable|numeric|min:0","required":false},{"name":"destinations.*.max_travel_cost","rules":"nullable|numeric|min:0","required":false},{"name":"destinations.*.hotel_tiers","rules":"nullable|array","required":false},{"name":"destinations.*.hotel_tiers.*","rules":"integer|between:1,5","required":false},{"name":"destinations.*.max_accommodation","rules":"nullable|numeric|min:0","required":false},{"name":"destinations.*.components","rules":"nullable|array","required":false},{"name":"destinations.*.components.*.type_id","rules":"nullable|integer|exists:per_diem_types,id","required":false},{"name":"destinations.*.components.*.amount","rules":"nullable|numeric|min:0","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/business-travel\/policies\/{policy}","name":"api.v1.app.payroll.business-travel.policies.destroy","audience":"app","section":"business-travel","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/cancellations","name":"api.v1.app.cancellations.index","audience":"app","section":"cancellations","permissions":["self.requests.cancel","self.leaves.cancel","requests.manage","leaves.manage","self.approvals.decide"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/cancellations\/{kind}\/{id}","name":"api.v1.app.cancellations.store","audience":"app","section":"cancellations","permissions":["self.requests.cancel","self.leaves.cancel","requests.manage","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"requests|leaves"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/cancellations\/{kind}\/{id}\/decide","name":"api.v1.app.cancellations.decide","audience":"app","section":"cancellations","permissions":["self.approvals.decide","requests.manage","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"requests|leaves"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/checklist-items\/{item}\/toggle","name":"api.v1.app.checklists.toggle","audience":"app","section":"checklist-items","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"item","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/checklist-items\/{item}","name":"api.v1.app.checklists.destroy","audience":"app","section":"checklist-items","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"item","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/checklists","name":"api.v1.app.checklists.index","audience":"app","section":"checklists","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/clocking-devices","name":"api.v1.app.clocking-devices.index","audience":"app","section":"clocking-devices","permissions":["attendance.security.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Devices: employee, kind (phone, browser), status, device.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/clocking-devices\/{device}","name":"api.v1.app.clocking-devices.action","audience":"app","section":"clocking-devices","permissions":["attendance.security.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"action: approve, block, reset, rename (label) or share (shared, browsers only).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/clocking-wifi-networks","name":"api.v1.app.clocking-wifi.index","audience":"app","section":"clocking-wifi-networks","permissions":["attendance.security.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/clocking-wifi-networks","name":"api.v1.app.clocking-wifi.store","audience":"app","section":"clocking-wifi-networks","permissions":["attendance.security.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/clocking-wifi-networks\/{network}","name":"api.v1.app.clocking-wifi.destroy","audience":"app","section":"clocking-wifi-networks","permissions":["attendance.security.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"network","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}","name":"api.v1.app.companies.show","audience":"app","section":"companies","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"What the company gives this user: license, modules, branches.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/competency-ratings","name":"api.v1.app.performance.ratings.index","audience":"app","section":"competency-ratings","permissions":["performance.view","performance.manage.*","performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Ratings of the employees in scope (employee filter).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/competency-ratings","name":"api.v1.app.performance.ratings.store","audience":"app","section":"competency-ratings","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_id, competency_id, level.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer|exists:employees,id","required":true},{"name":"competency_id","rules":"required|integer|exists:competencies,id","required":true},{"name":"level","rules":"required|integer|'between:1,' . \\App\\Models\\CompetencyLevel::scale()","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/competency-setup\/{kind}","name":"api.v1.app.performance.competency-setup.store","audience":"app","section":"competency-setup","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"kind categories | levels | competencies: as on the competencies screen.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"categories|levels|competencies"}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/competency-setup\/{kind}\/{id}","name":"api.v1.app.performance.competency-setup.update","audience":"app","section":"competency-setup","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"kind categories | levels | competencies: as on the competencies screen.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"categories|levels|competencies"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/competency-setup\/{kind}\/{id}","name":"api.v1.app.performance.competency-setup.destroy","audience":"app","section":"competency-setup","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"categories|levels|competencies"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/connected-apps","name":"api.v1.app.connected-apps.index","audience":"app","section":"connected-apps","permissions":["integrations.ai_apps.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/connected-apps\/{grant}","name":"api.v1.app.connected-apps.destroy","audience":"app","section":"connected-apps","permissions":["integrations.ai_apps.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"grant","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-allocations","name":"api.v1.app.cost-allocations.index","audience":"app","section":"cost-allocations","permissions":["payroll.cost_allocations.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Allocations in scope: employee_id, status (active | inactive | upcoming), group (cost center group id), and the org filters.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-allocations","name":"api.v1.app.cost-allocations.store","audience":"app","section":"cost-allocations","permissions":["payroll.cost_allocations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"rows","rules":"required|array","required":true},{"name":"rows.*.cost_center_id","rules":"required|distinct|exists:cost_centers,id","required":true},{"name":"rows.*.percent","rules":"required|numeric|between:0.01,100","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-allocations\/{allocation}","name":"api.v1.app.cost-allocations.destroy","audience":"app","section":"cost-allocations","permissions":["payroll.cost_allocations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"allocation","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-center-groups","name":"api.v1.app.cost-center-groups.index","audience":"app","section":"cost-center-groups","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Groups with the cost centers they include: code, center (a cost center id).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-center-groups","name":"api.v1.app.cost-center-groups.store","audience":"app","section":"cost-center-groups","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"code","rules":"nullable|string|max:30","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-center-groups\/{group}","name":"api.v1.app.cost-center-groups.show","audience":"app","section":"cost-center-groups","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-center-groups\/{group}","name":"api.v1.app.cost-center-groups.update","audience":"app","section":"cost-center-groups","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"code","rules":"nullable|string|max:30","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/cost-center-groups\/{group}","name":"api.v1.app.cost-center-groups.destroy","audience":"app","section":"cost-center-groups","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/custom-reports","name":"api.v1.app.custom-reports.index","audience":"app","section":"custom-reports","permissions":["reports.custom"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/custom-reports","name":"api.v1.app.custom-reports.store","audience":"app","section":"custom-reports","permissions":["reports.custom"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"POST custom-reports: name {en, ar}, locale, employee_status, schedule, notify_user_ids, columns [\"source.field\", \u2026] in order, shared_branch_ids (branches you work in).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"locale","rules":"required|in:en,ar","required":true},{"name":"employee_status","rules":"required|in:active,inactive,both","required":true},{"name":"schedule","rules":"required|in:none,daily,weekly,monthly,annually","required":true},{"name":"notify_user_ids","rules":"nullable|array","required":false},{"name":"notify_user_ids.*","rules":"integer","required":false},{"name":"shared_branch_ids","rules":"nullable|array","required":false},{"name":"shared_branch_ids.*","rules":"integer","required":false},{"name":"columns","rules":"required|array|min:1|max:120","required":true},{"name":"columns.*","rules":"string|max:60","required":false},{"name":"order","rules":"nullable|array","required":false},{"name":"order.*","rules":"nullable|integer|min:1|max:999","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/custom-reports\/{report}","name":"api.v1.app.custom-reports.show","audience":"app","section":"custom-reports","permissions":["reports.custom"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/custom-reports\/{report}","name":"api.v1.app.custom-reports.update","audience":"app","section":"custom-reports","permissions":["reports.custom"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"locale","rules":"required|in:en,ar","required":true},{"name":"employee_status","rules":"required|in:active,inactive,both","required":true},{"name":"schedule","rules":"required|in:none,daily,weekly,monthly,annually","required":true},{"name":"notify_user_ids","rules":"nullable|array","required":false},{"name":"notify_user_ids.*","rules":"integer","required":false},{"name":"shared_branch_ids","rules":"nullable|array","required":false},{"name":"shared_branch_ids.*","rules":"integer","required":false},{"name":"columns","rules":"required|array|min:1|max:120","required":true},{"name":"columns.*","rules":"string|max:60","required":false},{"name":"order","rules":"nullable|array","required":false},{"name":"order.*","rules":"nullable|integer|min:1|max:999","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/custom-reports\/{report}","name":"api.v1.app.custom-reports.destroy","audience":"app","section":"custom-reports","permissions":["reports.custom"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/custom-reports\/{report}\/run","name":"api.v1.app.custom-reports.run","audience":"app","section":"custom-reports","permissions":["reports.custom"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET custom-reports\/{id}\/run: the rows (limit, 500 by default), or format=csv.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/dashboard-metrics","name":"api.v1.app.my-dashboards.metrics","audience":"app","section":"dashboard-metrics","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/dashboards\/{section}","name":"api.v1.app.dashboards.show","audience":"app","section":"dashboards","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"hr|attendance|payroll|assets|performance"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/device-audit-log","name":"api.v1.app.devices.audit","audience":"app","section":"device-audit-log","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/device-batches\/{batch}","name":"api.v1.app.devices.batch","audience":"app","section":"device-batches","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"batch","type":"string","pattern":"[\\da-fA-F]{8}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{12}"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/device-commands\/{command}\/{do}","name":"api.v1.app.devices.command","audience":"app","section":"device-commands","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"command","type":"integer","pattern":null},{"name":"do","type":"string","pattern":"retry|cancel"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/device-compatibility","name":"api.v1.app.devices.compatibility","audience":"app","section":"device-compatibility","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/device-enrollments","name":"api.v1.app.devices.enroll","audience":"app","section":"device-enrollments","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"by","rules":"required|Rule::in(['employees', ...\\App\\Models\\DeviceEnrollmentRule::TARGETS])","required":true},{"name":"ids","rules":"array","required":false},{"name":"ids.*","rules":"integer","required":false},{"name":"device_ids","rules":"required|array|min:1","required":true},{"name":"device_ids.*","rules":"integer","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/device-enrollments","name":"api.v1.app.devices.unenroll","audience":"app","section":"device-enrollments","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required_without:group_id|nullable|integer","required":false},{"name":"group_id","rules":"nullable|integer","required":false},{"name":"device_ids","rules":"required|array|min:1","required":true},{"name":"device_ids.*","rules":"integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/device-people","name":"api.v1.app.devices.people","audience":"app","section":"device-people","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"People on devices: q (number, biometric ID or name), department; paged.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/device-settings\/auto-publish","name":"api.v1.app.devices.auto-publish","audience":"app","section":"device-settings","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/device-settings\/auto-publish","name":"api.v1.app.devices.auto-publish.update","audience":"app","section":"device-settings","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"auto_publish","rules":"required|boolean","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/device-sync-report","name":"api.v1.app.devices.sync-report","audience":"app","section":"device-sync-report","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"People whose devices are not all in sync; format=csv to export.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/devices","name":"api.v1.app.devices.index","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}","name":"api.v1.app.devices.show","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}","name":"api.v1.app.devices.update","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Settings and punch rules; recompute_from pairs the device's punches since that date again under the rule.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[{"name":"access_mode","rules":"sometimes|in:attendance,access,both","required":false},{"name":"family","rules":"sometimes|nullable|in:terminal,panel","required":false},{"name":"sync_enabled","rules":"sometimes|boolean","required":false},{"name":"strict_users","rules":"sometimes|boolean","required":false},{"name":"lock_count","rules":"sometimes|nullable|integer|between:0,8","required":false},{"name":"all_branches","rules":"sometimes|boolean","required":false},{"name":"branch_ids","rules":"sometimes|array|min:1","required":false},{"name":"branch_ids.*","rules":"integer|distinct|exists:branches,id","required":false},{"name":"punch_mode","rules":"sometimes|nullable|in:first_last,all,function","required":false},{"name":"pair_breaks","rules":"sometimes|boolean","required":false},{"name":"break_function_id","rules":"sometimes|nullable|integer|exists:attendance_functions,id","required":false},{"name":"debounce_minutes","rules":"sometimes|nullable|integer|between:0,60","required":false},{"name":"punch_in_window_minutes","rules":"sometimes|nullable|integer|between:0,720","required":false},{"name":"punch_out_grace_minutes","rules":"sometimes|nullable|integer|between:0,720","required":false},{"name":"allowed_ips","rules":"sometimes|nullable|string|max:1000|function ($attribute, $value, $fail) {\n    foreach (array_filter(array_map('trim...","required":false},{"name":"confirm_ip","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/recompute","name":"api.v1.app.devices.recompute","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/remove-users","name":"api.v1.app.devices.remove-users","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"Remove numbers from one device: people who left or numbers no employee owns (not current employees).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[{"name":"pins","rules":"required|array|max:5000","required":true},{"name":"pins.*","rules":"string|max:32","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/actions\/{action}","name":"api.v1.app.devices.action","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"sync|pull|pull_logs|info|check|reboot|clear_log|open_door|close_door|set_time|duplicate_check"}],"fields":[{"name":"door","rules":"nullable|integer|between:1,8","required":false},{"name":"seconds","rules":"nullable|integer|between:1,254","required":false},{"name":"from","rules":"nullable|date","required":false},{"name":"to","rules":"nullable|date","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/commands","name":"api.v1.app.devices.commands","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"nullable|in:queued,sent,done,failed,cancelled","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/users","name":"api.v1.app.devices.users","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/plan","name":"api.v1.app.devices.plan","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/enrollment-rules","name":"api.v1.app.devices.rules","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A device's enrolment rules and the people enrolled one by one.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/{device}\/enrollment-rules","name":"api.v1.app.devices.rules.store","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"target_type department|branch|position|group|all with ids (include), or employee with ids and effect exclude.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[{"name":"target_type","rules":"required|Rule::in([...\\App\\Models\\DeviceEnrollmentRule::TARGETS, 'employee'])","required":true},{"name":"ids","rules":"array","required":false},{"name":"ids.*","rules":"integer","required":false},{"name":"effect","rules":"nullable|in:include,exclude","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/devices\/update-all","name":"api.v1.app.devices.update-all","audience":"app","section":"devices","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"\"Update all devices\" for one employee or everyone in reach: returns the batch whose progress device-batches\/{batch} shows.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/directory","name":"api.v1.app.directory.index","audience":"app","section":"directory","permissions":["self.directory.view","employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-action-types","name":"api.v1.app.discipline.action-types.store","audience":"app","section":"disciplinary-action-types","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"letter_template_id","rules":"nullable|integer|exists:letter_templates,id","required":false},{"name":"deduction_type","rules":"required|in:none,balanced_vacation,fixed,salary_day,percent","required":true},{"name":"leave_type_id","rules":"nullable|required_if:deduction_type,balanced_vacation|integer|exists:leave_types,id","required":false},{"name":"transaction_type_id","rules":"nullable|required_if:deduction_type,fixed|integer|exists:transaction_types,id","required":false},{"name":"deduction_value","rules":"nullable|required_unless:deduction_type,none|numeric|min:0|($input['deduction_type'] ?? null) === 'percent' ? 'max:100' : 'max:100000000'","required":false},{"name":"allowance_type_ids","rules":"nullable|array","required":false},{"name":"allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false}]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-action-types\/{type}","name":"api.v1.app.discipline.action-types.update","audience":"app","section":"disciplinary-action-types","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"letter_template_id","rules":"nullable|integer|exists:letter_templates,id","required":false},{"name":"deduction_type","rules":"required|in:none,balanced_vacation,fixed,salary_day,percent","required":true},{"name":"leave_type_id","rules":"nullable|required_if:deduction_type,balanced_vacation|integer|exists:leave_types,id","required":false},{"name":"transaction_type_id","rules":"nullable|required_if:deduction_type,fixed|integer|exists:transaction_types,id","required":false},{"name":"deduction_value","rules":"nullable|required_unless:deduction_type,none|numeric|min:0|($input['deduction_type'] ?? null) === 'percent' ? 'max:100' : 'max:100000000'","required":false},{"name":"allowance_type_ids","rules":"nullable|array","required":false},{"name":"allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-action-types\/{type}","name":"api.v1.app.discipline.action-types.destroy","audience":"app","section":"disciplinary-action-types","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-actions","name":"api.v1.app.discipline.index","audience":"app","section":"disciplinary-actions","permissions":["discipline.view","discipline.manage","discipline.record","discipline.approve","discipline.delete"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-actions\/suggest","name":"api.v1.app.discipline.suggest","audience":"app","section":"disciplinary-actions","permissions":["discipline.record"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"disciplinary_type_id","rules":"required|integer","required":true},{"name":"incident_date","rules":"nullable|date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-actions","name":"api.v1.app.discipline.store","audience":"app","section":"disciplinary-actions","permissions":["discipline.record"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"disciplinary_type_id","rules":"required|integer|exists:disciplinary_types,id","required":true},{"name":"incident_date","rules":"required|date|before_or_equal:today","required":true},{"name":"description","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":true},{"name":"disciplinary_action_type_id","rules":"nullable|integer|exists:disciplinary_action_types,id","required":false},{"name":"action","rules":"nullable|in:verbal_warning,written_warning,final_warning,deduction","required":false},{"name":"deduction_amount","rules":"nullable|numeric|min:0|max:100000000","required":false},{"name":"draft","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-actions\/generate","name":"api.v1.app.discipline.generate","audience":"app","section":"disciplinary-actions","permissions":["discipline.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"leave_type_id","rules":"required|integer|exists:leave_types,id","required":true},{"name":"kind","rules":"required|in:redundant,grace","required":true},{"name":"effective_date","rules":"required|date","required":true},{"name":"from","rules":"required|date","required":true},{"name":"to","rules":"required|date|after_or_equal:from","required":true},{"name":"employee_id","rules":"nullable|integer","required":false},{"name":"branch_id","rules":"nullable|integer","required":false},{"name":"department_id","rules":"nullable|integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-actions\/{action}\/approve","name":"api.v1.app.discipline.approve","audience":"app","section":"disciplinary-actions","permissions":["discipline.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"action","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-actions\/{action}","name":"api.v1.app.discipline.destroy","audience":"app","section":"disciplinary-actions","permissions":["discipline.delete"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"action","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-rules","name":"api.v1.app.discipline.rules.store","audience":"app","section":"disciplinary-rules","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"disciplinary_type_id","rules":"$rule ? 'sometimes' : 'required'|integer|exists:disciplinary_types,id|unique:disciplinary_rules,disciplinary_type_id","required":false},{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"rule_type","rules":"nullable|in:sequential,separate","required":false},{"name":"drop_after","rules":"nullable|integer|min:1|max:1000","required":false},{"name":"drop_unit","rules":"nullable|in:day,month,year","required":false},{"name":"prevent_repetition","rules":"nullable|integer|min:0|max:1000","required":false},{"name":"prevent_unit","rules":"nullable|in:day,month,year","required":false},{"name":"action_type_ids","rules":"required|array|min:1|max:20","required":true},{"name":"action_type_ids.*","rules":"integer|exists:disciplinary_action_types,id","required":false}]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-rules\/{rule}","name":"api.v1.app.discipline.rules.update","audience":"app","section":"disciplinary-rules","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"rule","type":"integer","pattern":null}],"fields":[{"name":"disciplinary_type_id","rules":"$rule ? 'sometimes' : 'required'|integer|exists:disciplinary_types,id|unique:disciplinary_rules,disciplinary_type_id","required":false},{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"rule_type","rules":"nullable|in:sequential,separate","required":false},{"name":"drop_after","rules":"nullable|integer|min:1|max:1000","required":false},{"name":"drop_unit","rules":"nullable|in:day,month,year","required":false},{"name":"prevent_repetition","rules":"nullable|integer|min:0|max:1000","required":false},{"name":"prevent_unit","rules":"nullable|in:day,month,year","required":false},{"name":"action_type_ids","rules":"required|array|min:1|max:20","required":true},{"name":"action_type_ids.*","rules":"integer|exists:disciplinary_action_types,id","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/disciplinary-rules\/{rule}","name":"api.v1.app.discipline.rules.destroy","audience":"app","section":"disciplinary-rules","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"rule","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/discipline-setup","name":"api.v1.app.discipline.setup","audience":"app","section":"discipline-setup","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/documents","name":"api.v1.app.documents.index","audience":"app","section":"documents","permissions":["self.documents.view","employees.view_sensitive"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/documents","name":"api.v1.app.documents.store","audience":"app","section":"documents","permissions":["self.documents.upload","employees.view_sensitive"],"modules":[],"rate_limit_per_minute":30,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/documents\/{document}\/download","name":"api.v1.app.documents.download","audience":"app","section":"documents","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"document","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/documents\/{document}","name":"api.v1.app.documents.destroy","audience":"app","section":"documents","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"document","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/door-events","name":"api.v1.app.door-events.index","audience":"app","section":"door-events","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"result","rules":"nullable|in:granted,denied,alarm,state,info","required":false},{"name":"from","rules":"nullable|date","required":false},{"name":"to","rules":"nullable|date","required":false},{"name":"format","rules":"nullable|in:json,csv","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/door-events\/{event}\/acknowledge","name":"api.v1.app.door-events.acknowledge","audience":"app","section":"door-events","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"event","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-geolocations","name":"api.v1.app.employee-geolocations.assign","audience":"app","section":"employee-geolocations","permissions":["attendance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Employees' locations: action assign|unassign|replace, employees, locations.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|in:assign,unassign,replace","required":true},{"name":"employees","rules":"required|array|min:1","required":true},{"name":"employees.*","rules":"integer","required":false},{"name":"locations","rules":"required_unless:action,unassign|array","required":false},{"name":"locations.*","rules":"integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-geolocations\/replace-all","name":"api.v1.app.employee-geolocations.replace-all","audience":"app","section":"employee-geolocations","permissions":["attendance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"from_location \u2192 to_location for everyone in reach at from_location.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"from_location","rules":"required|integer","required":true},{"name":"to_location","rules":"required|integer|different:from_location","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-groups","name":"api.v1.app.employee-groups.index","audience":"app","section":"employee-groups","permissions":["employee_groups.manage","devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-groups","name":"api.v1.app.employee-groups.store","audience":"app","section":"employee-groups","permissions":["employee_groups.manage","devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"description.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"color","rules":"nullable|regex:\/^#[0-9a-fA-F]{6}$\/","required":false},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"rules","rules":"nullable|array","required":false},{"name":"rules.departments","rules":"nullable|array","required":false},{"name":"rules.departments.*","rules":"integer|exists:org_units,id","required":false},{"name":"rules.positions","rules":"nullable|array","required":false},{"name":"rules.positions.*","rules":"integer|exists:positions,id","required":false},{"name":"rules.branches","rules":"nullable|array","required":false},{"name":"rules.branches.*","rules":"integer|exists:branches,id","required":false},{"name":"member_ids","rules":"nullable|array","required":false},{"name":"member_ids.*","rules":"integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-groups\/{group}","name":"api.v1.app.employee-groups.show","audience":"app","section":"employee-groups","permissions":["employee_groups.manage","devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-groups\/{group}","name":"api.v1.app.employee-groups.update","audience":"app","section":"employee-groups","permissions":["employee_groups.manage","devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-groups\/{group}","name":"api.v1.app.employee-groups.destroy","audience":"app","section":"employee-groups","permissions":["employee_groups.manage","devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[]},{"methods":["POST","DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-groups\/{group}\/members","name":"api.v1.app.employee-groups.members","audience":"app","section":"employee-groups","permissions":["employee_groups.manage","devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_ids: added (POST) or removed (DELETE).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[{"name":"employee_ids","rules":"required|array|min:1","required":true},{"name":"employee_ids.*","rules":"integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-invitations","name":"api.v1.app.employee-invitations.index","audience":"app","section":"employee-invitations","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-invitations\/preview","name":"api.v1.app.employee-invitations.preview","audience":"app","section":"employee-invitations","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"channel","rules":"required|Rule::in(self::CHANNELS)","required":true},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"department_id","rules":"nullable|integer|exists:org_units,id","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-invitations","name":"api.v1.app.employee-invitations.store","audience":"app","section":"employee-invitations","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":5,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"expected","rules":"required|integer|min:1","required":true},{"name":"channel","rules":"required|Rule::in(self::CHANNELS)","required":true},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"department_id","rules":"nullable|integer|exists:org_units,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-numbering","name":"api.v1.app.employee-numbering.show","audience":"app","section":"employee-numbering","permissions":["employee_settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Employee numbering: the company's settings and each branch's (docs\/employee-numbering.md).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-numbering","name":"api.v1.app.employee-numbering.update","audience":"app","section":"employee-numbering","permissions":["employee_settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-numbering\/branches\/{branch}","name":"api.v1.app.employee-numbering.branch","audience":"app","section":"employee-numbering","permissions":["employee_settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-settings\/{kind}","name":"api.v1.app.employee-settings.index","audience":"app","section":"employee-settings","permissions":["employee_settings.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contract_types|job_grades|document_types|custom_fields|org_levels|field_rules|e_signatures|banks"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-settings\/{kind}","name":"api.v1.app.employee-settings.store","audience":"app","section":"employee-settings","permissions":["employee_settings.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contract_types|job_grades|document_types|custom_fields|org_levels|field_rules|e_signatures|banks"}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-settings\/{kind}\/{id}","name":"api.v1.app.employee-settings.update","audience":"app","section":"employee-settings","permissions":["employee_settings.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contract_types|job_grades|document_types|custom_fields|org_levels|field_rules|e_signatures|banks"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-settings\/e_signatures\/{id}\/image","name":"api.v1.app.employee-settings.signature","audience":"app","section":"employee-settings","permissions":["employee_settings.e_signatures.manage","letters.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"ZenHR E-Signatures: the signature image itself.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-shifts","name":"api.v1.app.employee-shifts.index","audience":"app","section":"employee-shifts","permissions":["attendance.shift_planner.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The schedule between from and to (a week by default) for the employees in reach.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"from","rules":"nullable|date","required":false},{"name":"to","rules":"nullable|date|after_or_equal:from","required":false},{"name":"employee","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-shifts\/export","name":"api.v1.app.employee-shifts.export","audience":"app","section":"employee-shifts","permissions":["attendance.shift_planner.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The week (week=any date in it) as the Employee Shifts screen shows it, with its filters; format csv (default) or json.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"week","rules":"nullable|date","required":false},{"name":"format","rules":"nullable|in:csv,json","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-shifts\/regular","name":"api.v1.app.employee-shifts.regular","audience":"app","section":"employee-shifts","permissions":["attendance.shift_planner.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Regular (non-roster) shift assignments and each person's own default shift, with the Employee Shifts filters.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-shifts","name":"api.v1.app.employee-shifts.assign","audience":"app","section":"employee-shifts","permissions":["attendance.shift_planner.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Assign Shift: employees, shift_id (or \"off\"), start_date, end_date (none = open-ended), conflict replace|keep, draft.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employees","rules":"required|array|min:1","required":true},{"name":"employees.*","rules":"integer","required":false},{"name":"shift_id","rules":"required|$request->input('shift_id') === 'off' ? 'in:off' : Rule::exists('shifts', 'id')-...","required":true},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"conflict","rules":"nullable|in:replace,keep","required":false},{"name":"draft","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-shifts\/plan","name":"api.v1.app.employee-shifts.plan","audience":"app","section":"employee-shifts","permissions":["attendance.shift_planner.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"shift_ids","rules":"required|array|min:1","required":true},{"name":"shift_ids.*","rules":"exists:shifts,id","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"required|date|after_or_equal:start_date","required":true},{"name":"employees","rules":"nullable|array","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"max_in_a_row","rules":"nullable|integer|between:1,14","required":false},{"name":"days_off_a_week","rules":"nullable|integer|between:0,6","required":false},{"name":"max_weekly_hours","rules":"nullable|numeric|between:1,168","required":false},{"name":"fair_nights","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employee-shifts\/publish","name":"api.v1.app.employee-shifts.publish","audience":"app","section":"employee-shifts","permissions":["attendance.shift_planner.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Publishes the drafts between start_date and end_date (a week or a month), and tells those people when notify is true.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"required|date|after_or_equal:start_date","required":true},{"name":"employees","rules":"nullable|array","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"notify","rules":"sometimes|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/professional-data","name":"api.v1.app.professional-data.index","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/professional-data","name":"api.v1.app.professional-data.store","audience":"app","section":"employees","permissions":["employees.edit"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/rehire","name":"api.v1.app.employees.rehire","audience":"app","section":"employees","permissions":["employees.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"hire_date","rules":"required|date|$old->terminated_on ? ['after:' . $old->terminated_on->toDateString()] : []","required":true},{"name":"copy_bank_accounts","rules":"sometimes|boolean","required":false},{"name":"copy_family","rules":"sometimes|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/existing-users","name":"api.v1.app.employees.existing-users","audience":"app","section":"employees","permissions":["employees.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"\"Add Employee for an Existing User\": ended records (latest per person) to rehire, and accounts with no employee record; q searches.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/temporary-password","name":"api.v1.app.employees.temporary-password","audience":"app","section":"employees","permissions":["employees.manage"],"modules":[],"rate_limit_per_minute":10,"summary":"temporary_password (the company's password policy); they change it after signing in. Not the owner's or one's own account.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"temporary_password","rules":"required|string|\\App\\Support\\PasswordPolicy::rule($record->user)","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/unlock","name":"api.v1.app.employees.unlock","audience":"app","section":"employees","permissions":["employees.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Unlocks an account locked by failed sign-in attempts.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/termination-check","name":"api.v1.app.terminations.check","audience":"app","section":"employees","permissions":["employees.terminate"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/termination-check\/{action}","name":"api.v1.app.terminations.resolve","audience":"app","section":"employees","permissions":["employees.terminate"],"modules":[],"rate_limit_per_minute":60,"summary":"substitute, withdraw-requests, take-asset, expire-insurance, pay-loans, deduct-loans","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"substitute|withdraw-requests|take-asset|expire-insurance|pay-loans|deduct-loans"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/cancel-termination","name":"api.v1.app.terminations.cancel","audience":"app","section":"employees","permissions":["employees.terminate"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/checklist","name":"api.v1.app.checklists.show","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/checklist","name":"api.v1.app.checklists.store","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"type","rules":"required|in:onboarding,offboarding","required":true},{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(200)","required":true},{"name":"title.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(200)","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/boardings","name":"api.v1.app.boardings.store","audience":"app","section":"employees","permissions":["employees.boardings.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"category","rules":"required|in:onboarding,offboarding","required":true},{"name":"boarding_template_id","rules":"required|integer|exists:boarding_templates,id","required":true},{"name":"boarding_date","rules":"nullable|date","required":false},{"name":"arrive_by","rules":"nullable|date_format:H:i","required":false},{"name":"location_name","rules":"nullable|string|max:150","required":false},{"name":"contact_employee_id","rules":"nullable|integer|$employees","required":false},{"name":"manager_employee_id","rules":"nullable|integer|$employees","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"sequential","rules":"nullable|boolean","required":false},{"name":"tasks","rules":"nullable|array","required":false},{"name":"tasks.*.include","rules":"nullable|boolean","required":false},{"name":"tasks.*.due_days","rules":"nullable|integer|min:0|max:365","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-packages","name":"api.v1.app.payroll.packages","audience":"app","section":"employees","permissions":["payroll.salary_packages.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An employee's salary packages, newest first, with the current one's id.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-packages","name":"api.v1.app.payroll.packages.store","audience":"app","section":"employees","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"effective_on","rules":"required|date|'after_or_equal:' . $employee->hire_date->toDateString()","required":true},{"name":"basic_salary","rules":"required|numeric|min:0","required":true},{"name":"currency","rules":"nullable|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,ZWL","required":false},{"name":"salary_count","rules":"required|integer|between:12,16","required":true},{"name":"other_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"ss_salary","rules":"nullable|numeric|min:0","required":false},{"name":"ss_currency","rules":"nullable|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,ZWL","required":false},{"name":"social_security_rule_id","rules":"nullable|exists:social_security_rules,id","required":false},{"name":"ss_participation_date","rules":"nullable|date","required":false},{"name":"company_bank_account_id","rules":"nullable|exists:company_bank_accounts,id","required":false},{"name":"tax_number","rules":"nullable|string|max:50","required":false},{"name":"ss_number","rules":"nullable|string|max:50","required":false},{"name":"gl_account","rules":"nullable|string|max:50","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"items","rules":"array","required":false},{"name":"items.*.kind","rules":"required_with:items.*.amount|in:allowance,deduction,company_expense","required":false},{"name":"items.*.transaction_type_id","rules":"nullable|exists:transaction_types,id","required":false},{"name":"items.*.name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"items.*.name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"items.*.amount","rules":"nullable|numeric|min:0","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-packages\/{package}","name":"api.v1.app.payroll.packages.destroy","audience":"app","section":"employees","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"package","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-stop","name":"api.v1.app.payroll.salary-stop","audience":"app","section":"employees","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Stop (reason) or resume an employee's salary: action = stop | resume.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|in:stop,resume","required":true},{"name":"reason","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(255)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/project-contributions","name":"api.v1.app.project-contributions.show","audience":"app","section":"employees","permissions":["payroll.cost_allocations.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET employees\/{employee}\/project-contributions?month=YYYY-MM: each project's contribution and the month's timesheet hours on it.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/project-contributions","name":"api.v1.app.project-contributions.update","audience":"app","section":"employees","permissions":["payroll.cost_allocations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"PUT employees\/{employee}\/project-contributions {projects: [{project_id, contribution_percent}]} adding up to 100.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"projects","rules":"required|array|min:1","required":true},{"name":"projects.*.project_id","rules":"required|integer|distinct","required":true},{"name":"projects.*.contribution_percent","rules":"required|numeric|between:0,100","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-packages\/{package}","name":"api.v1.app.payroll.packages.show","audience":"app","section":"employees","permissions":["payroll.salary_packages.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One salary package of an employee in scope, with its items and the package in force before it.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"package","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-scale","name":"api.v1.app.salary-scales.placement","audience":"app","section":"employees","permissions":["payroll.salary_packages.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An employee's placement (payroll.view or payroll.manage, in scope).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/salary-scale","name":"api.v1.app.salary-scales.place","audience":"app","section":"employees","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Places an employee in my payroll.manage scope; warning when the salary is outside the new enforced range.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"scale_level_id","rules":"nullable|$in('scale_levels')","required":false},{"name":"scale_band_id","rules":"nullable|$in('scale_bands')","required":false},{"name":"scale_grade_id","rules":"nullable|$in('scale_grades')","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/stb-encashment","name":"api.v1.app.stb-encashments.available","audience":"app","section":"employees","permissions":["payroll.stb_encashments.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"What an employee in my scope could take now: years, accrued, taken, allowed, eligible, reason.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/leave-balances","name":"api.v1.app.leaves.balances","audience":"app","section":"employees","permissions":["leaves.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An employee's balances (?year, ?as_of) and their time off setup rows.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/timeoff\/{leaveType}","name":"api.v1.app.leaves.policy","audience":"app","section":"employees","permissions":["leaves.balance_corrections.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One employee's setup for a leave type; with \"reset\": true back to the company setup.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"leaveType","type":"integer","pattern":null}],"fields":[{"name":"entitlement_days","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"open_balance","rules":"nullable|numeric|min:-365|max:365","required":false},{"name":"carry_balance","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"balance_year","rules":"nullable|integer|min:2000|max:2100","required":false},{"name":"active","rules":"nullable|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/timeoff\/{leaveType}\/balance","name":"api.v1.app.leaves.policy-balance","audience":"app","section":"employees","permissions":["leaves.balance_corrections.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ZenHR's \"Show balance\": each year since hiring (up to ten), split into opening, previous, adjustments, encashed, hourly, total, taken, pending, remaining.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"leaveType","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/timeoff\/{leaveType}\/{action}","name":"api.v1.app.leaves.policy-action","audience":"app","section":"employees","permissions":["leaves.balance_corrections.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Timeoff setup: cancel-future (ZenHR's Cancel all future transactions) or deactivate-move (to_leave_type_id).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"leaveType","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"cancel-future|deactivate-move"}],"fields":[{"name":"to_leave_type_id","rules":"required|integer|exists:leave_types,id","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/clocking-devices\/reset","name":"api.v1.app.clocking-devices.reset","audience":"app","section":"employees","permissions":["attendance.security.review"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Resets an employee's phone: the next phone they clock from needs approval.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/clocking-from","name":"api.v1.app.employees.clocking-from","audience":"app","section":"employees","permissions":["attendance.clocking_from.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Where one employee clocks from: their own choice, the branch's, and what applies.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/clocking-from","name":"api.v1.app.employees.clocking-from.update","audience":"app","section":"employees","permissions":["attendance.clocking_from.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"clocking_from: both, web, mobile or device; null or \"follow\" goes back to the branch's.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"clocking_from","rules":"present","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/devices","name":"api.v1.app.devices.employee","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A person's devices: profile, enrolments, why they are (not) on each device, templates (no data).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/device-profile","name":"api.v1.app.devices.profile","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"card","rules":"sometimes|nullable|string|max:32|regex:\/^[0-9A-Za-z]*$\/","required":false},{"name":"password","rules":"sometimes|nullable|string|max:8|regex:\/^[0-9]*$\/","required":false},{"name":"privilege","rules":"sometimes|integer|in:0,2,6,14","required":false},{"name":"verify_mode","rules":"sometimes|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,palm","required":false},{"name":"enabled","rules":"sometimes|boolean","required":false},{"name":"push_photo","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/remove-from-devices","name":"api.v1.app.devices.remove","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/pull-templates","name":"api.v1.app.devices.pull-templates","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/biometric-templates","name":"api.v1.app.devices.templates","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Templates; the data itself only with include_data=1 and the permission to see sensitive employee data.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/biometric-matrix","name":"api.v1.app.devices.matrix","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The person's slots \u00d7 devices (present, missing, outdated, conflict, pending, incompatible, capacity\u2026).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/publish-missing","name":"api.v1.app.devices.publish-missing","audience":"app","section":"employees","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/file\/{kind}","name":"api.v1.app.employees.file.index","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"The employee's file: contracts, bank_accounts, family or documents (wave 1 of moving Mawarid in).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contracts|bank_accounts|family|documents"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/file\/{kind}","name":"api.v1.app.employees.file.store","audience":"app","section":"employees","permissions":["employees.edit"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contracts|bank_accounts|family|documents"}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/file\/{kind}\/{id}","name":"api.v1.app.employees.file.update","audience":"app","section":"employees","permissions":["employees.edit"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contracts|bank_accounts|family|documents"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/file\/{kind}\/{id}","name":"api.v1.app.employees.file.destroy","audience":"app","section":"employees","permissions":["employees.edit"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"contracts|bank_accounts|family|documents"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/documents\/{document}\/download","name":"api.v1.app.employees.file.download","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null},{"name":"document","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/history","name":"api.v1.app.employees.history","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees","name":"api.v1.app.employees.index","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}","name":"api.v1.app.employees.show","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees","name":"api.v1.app.employees.store","audience":"app","section":"employees","permissions":["employees.create"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}","name":"api.v1.app.employees.update","audience":"app","section":"employees","permissions":["employees.edit"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/transfer","name":"api.v1.app.employees.transfer","audience":"app","section":"employees","permissions":["employees.transfer"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"branch_id","rules":"required|integer|exists:branches,id","required":true},{"name":"effective_date","rules":"required|date|'after_or_equal:' . $employee->started_on?->toDateString()","required":true},{"name":"position_id","rules":"nullable|integer|exists:positions,id","required":false},{"name":"work_location_id","rules":"$unitRule('work_location')","required":false},{"name":"department_id","rules":"$unitRule('department')","required":false},{"name":"section_id","rules":"$unitRule('section')","required":false},{"name":"project_id","rules":"$unitRule('project')","required":false},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/by-number\/{number}","name":"api.v1.app.employees.by-number","audience":"app","section":"employees","permissions":["employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"One employee by the number people use (the current record first; ?branch_id= when numbers repeat across branches).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"number","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/archive","name":"api.v1.app.employees.archive","audience":"app","section":"employees","permissions":["employees.archive"],"modules":[],"rate_limit_per_minute":60,"summary":"\"Delete\": archives the record and keeps everything tied to it (docs\/employee-numbering.md).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/restore","name":"api.v1.app.employees.restore","audience":"app","section":"employees","permissions":["employees.archive"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/employees\/{employee}\/terminate","name":"api.v1.app.employees.terminate","audience":"app","section":"employees","permissions":["employees.terminate"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"terminated_on","rules":"required|date|'after_or_equal:' . ($employee->started_on ?? $employee->hire_date)?->toDateStri...","required":true},{"name":"termination_type","rules":"required|in:resignation,dismissal,end_of_contract,other,retirement,transfer","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"termination_reason_id","rules":"nullable|integer|exists:termination_reasons,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/nav","name":"api.v1.app.engine.nav","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/dashboard","name":"api.v1.app.engine.dashboard","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"The dashboard in the app (docs\/mobile-dashboards.md): the widgets open to the person here, as blocks.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/dashboard\/layout","name":"api.v1.app.engine.dashboard.layout","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"PUT dashboard\/layout: order [keys], show [keys], or reset; on the phone only.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/links","name":"api.v1.app.engine.links","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"GET links?url=: what a notice's or a result's link opens for this person, or why it can't.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"url","rules":"nullable|string|max:500","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}","name":"api.v1.app.engine.describe","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/records","name":"api.v1.app.engine.records.index","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/records","name":"api.v1.app.engine.records.store","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/records\/{record}","name":"api.v1.app.engine.records.show","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"},{"name":"record","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/records\/{record}","name":"api.v1.app.engine.records.update","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"},{"name":"record","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/records\/{record}\/actions\/{action}","name":"api.v1.app.engine.records.action","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"},{"name":"record","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/records\/{record}\/files\/{field}","name":"api.v1.app.engine.records.file","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"},{"name":"record","type":"integer","pattern":null},{"name":"field","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/bulk\/{action}","name":"api.v1.app.engine.bulk","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"},{"name":"action","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/form","name":"api.v1.app.engine.form","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/options\/{field}","name":"api.v1.app.engine.options","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"},{"name":"field","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/blocks","name":"api.v1.app.engine.blocks","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/engine\/sections\/{section}\/export","name":"api.v1.app.engine.export","audience":"app","section":"engine","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/enrollment-rules\/{rule}","name":"api.v1.app.devices.rules.destroy","audience":"app","section":"enrollment-rules","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"rule","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/eos-policies","name":"api.v1.app.eos-policies.index","audience":"app","section":"eos-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: name, category, contract_type (limited | unlimited), defaults_only.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/eos-policies","name":"api.v1.app.eos-policies.store","audience":"app","section":"eos-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(120)","required":true},{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(120)","required":true},{"name":"termination_category","rules":"required|in:any,resignation,termination,end_of_contract,retirement,transfer,other","required":true},{"name":"min_years","rules":"required|integer|min:0|max:50","required":true},{"name":"tiers","rules":"required|string|max:1000","required":true},{"name":"worth_tiers","rules":"nullable|string|max:1000","required":false},{"name":"contract_type","rules":"nullable|in:both,limited,unlimited","required":false},{"name":"exclude_unpaid","rules":"nullable|array","required":false},{"name":"exclude_unpaid.*","rules":"string","required":false},{"name":"nationalities","rules":"nullable|array","required":false},{"name":"nationalities.*","rules":"string|max:60","required":false},{"name":"end_date","rules":"nullable|date","required":false},{"name":"allowance_type_ids","rules":"nullable|array","required":false},{"name":"allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"calc_base","rules":"nullable|in:calendar,365,360","required":false},{"name":"year_definition","rules":"nullable|in:calendar,fixed","required":false},{"name":"fixed_year_days","rules":"nullable|required_if:year_definition,fixed|integer|between:300,400","required":false},{"name":"calc_type","rules":"nullable|in:service,remaining,both","required":false},{"name":"remaining_direction","rules":"nullable|in:add,deduct","required":false},{"name":"service_min_salaries","rules":"nullable|numeric|min:0","required":false},{"name":"service_max_salaries","rules":"nullable|numeric|min:0","required":false},{"name":"remaining_min_salaries","rules":"nullable|numeric|min:0","required":false},{"name":"remaining_max_salaries","rules":"nullable|numeric|min:0","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/eos-policies\/{policy}","name":"api.v1.app.eos-policies.show","audience":"app","section":"eos-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/eos-policies\/{policy}","name":"api.v1.app.eos-policies.update","audience":"app","section":"eos-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(120)","required":true},{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(120)","required":true},{"name":"termination_category","rules":"required|in:any,resignation,termination,end_of_contract,retirement,transfer,other","required":true},{"name":"min_years","rules":"required|integer|min:0|max:50","required":true},{"name":"tiers","rules":"required|string|max:1000","required":true},{"name":"worth_tiers","rules":"nullable|string|max:1000","required":false},{"name":"contract_type","rules":"nullable|in:both,limited,unlimited","required":false},{"name":"exclude_unpaid","rules":"nullable|array","required":false},{"name":"exclude_unpaid.*","rules":"string","required":false},{"name":"nationalities","rules":"nullable|array","required":false},{"name":"nationalities.*","rules":"string|max:60","required":false},{"name":"end_date","rules":"nullable|date","required":false},{"name":"allowance_type_ids","rules":"nullable|array","required":false},{"name":"allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"calc_base","rules":"nullable|in:calendar,365,360","required":false},{"name":"year_definition","rules":"nullable|in:calendar,fixed","required":false},{"name":"fixed_year_days","rules":"nullable|required_if:year_definition,fixed|integer|between:300,400","required":false},{"name":"calc_type","rules":"nullable|in:service,remaining,both","required":false},{"name":"remaining_direction","rules":"nullable|in:add,deduct","required":false},{"name":"service_min_salaries","rules":"nullable|numeric|min:0","required":false},{"name":"service_max_salaries","rules":"nullable|numeric|min:0","required":false},{"name":"remaining_min_salaries","rules":"nullable|numeric|min:0","required":false},{"name":"remaining_max_salaries","rules":"nullable|numeric|min:0","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/eos-policies\/{policy}","name":"api.v1.app.eos-policies.destroy","audience":"app","section":"eos-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-criteria\/{criterion}","name":"api.v1.app.performance.criteria.destroy","audience":"app","section":"evaluation-criteria","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"criterion","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles","name":"api.v1.app.performance.cycles.index","audience":"app","section":"evaluation-cycles","permissions":["performance.view","performance.manage.*","performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The cycles, with the list's filters: q (name), status (draft, open, closed) and stage (current stage).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}","name":"api.v1.app.performance.cycles.show","audience":"app","section":"evaluation-cycles","permissions":["performance.view","performance.manage.*","performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}\/calibration","name":"api.v1.app.performance.calibration.show","audience":"app","section":"evaluation-cycles","permissions":["performance.calibrate"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Who sits in which result band of a cycle, in what the person reaches, and whose result they may move.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles","name":"api.v1.app.performance.cycles.store","audience":"app","section":"evaluation-cycles","permissions":["performance.manage.*","performance.cycles.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"evaluation_template_id, name, branch_ids, year, evaluation_part, stages {stage: {start, end}}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"nullable|string|max:150","required":false},{"name":"branch_ids","rules":"nullable|array","required":false},{"name":"branch_ids.*","rules":"integer|exists:branches,id","required":false},{"name":"year","rules":"required|integer|between:2000,2100","required":true},{"name":"evaluation_part","rules":"required|Rule::in(array_keys(\\App\\Models\\EvaluationCycle::parts($template->period)))","required":true},{"name":"stages","rules":"required|array","required":true},{"name":"stages.*.start","rules":"nullable|date","required":false},{"name":"stages.*.end","rules":"nullable|date","required":false},{"name":"stages.*.on_start_end","rules":"nullable|boolean","required":false},{"name":"stages.*.before_end","rules":"nullable|boolean","required":false},{"name":"stages.*.on_submit","rules":"nullable|boolean","required":false},{"name":"stages.*.before_end_days","rules":"nullable|integer|min:0|max:60","required":false},{"name":"stages.*.notify_ids","rules":"nullable|array","required":false},{"name":"stages.*.notify_ids.*","rules":"integer|exists:employees,id","required":false},{"name":"send_before_start","rules":"nullable|boolean","required":false},{"name":"send_before_start_days","rules":"nullable|integer|min:1|max:60","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}\/launch","name":"api.v1.app.performance.cycles.launch","audience":"app","section":"evaluation-cycles","permissions":["performance.manage.*","performance.cycles.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}\/close","name":"api.v1.app.performance.cycles.close","audience":"app","section":"evaluation-cycles","permissions":["performance.manage.*","performance.cycles.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}\/dates","name":"api.v1.app.performance.cycles.dates","audience":"app","section":"evaluation-cycles","permissions":["performance.manage.*","performance.cycles.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}\/employees","name":"api.v1.app.performance.cycles.employees","audience":"app","section":"evaluation-cycles","permissions":["performance.manage.*","performance.cycles.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employees (ids).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-cycles\/{cycle}","name":"api.v1.app.performance.cycles.destroy","audience":"app","section":"evaluation-cycles","permissions":["performance.manage.*","performance.cycles.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-templates","name":"api.v1.app.performance.templates.store","audience":"app","section":"evaluation-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-templates\/{template}","name":"api.v1.app.performance.templates.update","audience":"app","section":"evaluation-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-templates\/{template}","name":"api.v1.app.performance.templates.destroy","audience":"app","section":"evaluation-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluation-templates\/{template}\/criteria","name":"api.v1.app.performance.criteria.store","audience":"app","section":"evaluation-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, weight, kind factor|okr, target, measurement_unit_id.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(200)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(200)","required":false},{"name":"weight","rules":"required|numeric|min:0.01|max:100","required":true},{"name":"kind","rules":"nullable|in:factor,okr","required":false},{"name":"target","rules":"nullable|required_if:kind,okr|numeric|gt:0","required":false},{"name":"measurement_unit_id","rules":"nullable|integer|exists:measurement_units,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}","name":"api.v1.app.performance.evaluations.show","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/self","name":"api.v1.app.performance.evaluations.self","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[{"name":"attachments","rules":"nullable|array|max:10","required":false},{"name":"attachments.*","rules":"file|max:10240","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/review","name":"api.v1.app.performance.evaluations.review","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/objectives","name":"api.v1.app.performance.objectives.store","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"objective: name {en, ar}, description {en, ar}, weight, key_results [{name {en, ar}, weight, measurement_unit_id, target}].","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/okrs\/publish","name":"api.v1.app.performance.okrs.publish","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/notes","name":"api.v1.app.performance.evaluations.notes","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"performance_summary, key_strengths, weaknesses, recommendations, attachments[].","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/final","name":"api.v1.app.performance.evaluations.final","audience":"app","section":"evaluations","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"final_rate_override (0\u2013100), final_notes, notify_people.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[{"name":"final_rate_override","rules":"required|numeric|min:0|max:100","required":true},{"name":"final_notes","rules":"nullable|string|max:3000","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/calibrate","name":"api.v1.app.performance.calibration.move","audience":"app","section":"evaluations","permissions":["performance.calibrate"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"score (0\u2013100), reason.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[{"name":"score","rules":"required|numeric|min:0|max:100","required":true},{"name":"reason","rules":"required|string|min:3|'max:' . \\App\\Support\\Limits::chars(1000)","required":true}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/task-holders","name":"api.v1.app.performance.evaluations.task-holders","audience":"app","section":"evaluations","permissions":["performance.manage.*","performance.evaluations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"okr_writer_id, okr_auditor_ids, result_writer_id, result_auditor_ids (employee ids).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[{"name":"okr_writer_id","rules":"nullable|integer|$person","required":false},{"name":"okr_auditor_ids","rules":"nullable|array","required":false},{"name":"okr_auditor_ids.*","rules":"integer|$person","required":false},{"name":"result_writer_id","rules":"nullable|integer|$person","required":false},{"name":"result_auditor_ids","rules":"nullable|array","required":false},{"name":"result_auditor_ids.*","rules":"integer|$person","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}\/dates","name":"api.v1.app.performance.evaluations.dates","audience":"app","section":"evaluations","permissions":["performance.manage.*","performance.evaluations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"stages {stage: {start, end}}.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/evaluations\/{evaluation}","name":"api.v1.app.performance.evaluations.destroy","audience":"app","section":"evaluations","permissions":["performance.manage.*","performance.evaluations.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evaluation","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/events","name":"api.v1.app.events.index","audience":"app","section":"events","permissions":["self.events","events.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"month (YYYY-MM): coming up, past, the month's events by day and its holidays.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/events","name":"api.v1.app.events.store","audience":"app","section":"events","permissions":["events.create"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, date, start_time (HH:MM), location, description.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"date","rules":"required|date","required":true},{"name":"start_time","rules":"nullable|date_format:H:i","required":false},{"name":"location","rules":"nullable|string|max:150","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/events\/{event}","name":"api.v1.app.events.update","audience":"app","section":"events","permissions":["events.edit"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"event","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"date","rules":"required|date","required":true},{"name":"start_time","rules":"nullable|date_format:H:i","required":false},{"name":"location","rules":"nullable|string|max:150","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/events\/{event}","name":"api.v1.app.events.destroy","audience":"app","section":"events","permissions":["events.delete"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"event","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/exchange-rates","name":"api.v1.app.exchange-rates.index","audience":"app","section":"exchange-rates","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Rates, by pair and newest date first: currency (either side), branch (an id, or \"company\" for company-wide).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/exchange-rates","name":"api.v1.app.exchange-rates.store","audience":"app","section":"exchange-rates","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"from_currency","rules":"$currency","required":false},{"name":"to_currency","rules":"$currency|different:from_currency","required":false},{"name":"rate","rules":"required|numeric|gt:0","required":true},{"name":"effective_date","rules":"required|date","required":true},{"name":"reverse_rate","rules":"nullable|numeric|gt:0","required":false},{"name":"branch_id","rules":"nullable|exists:branches,id","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/exchange-rates\/multi-currency","name":"api.v1.app.exchange-rates.toggle","audience":"app","section":"exchange-rates","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"multi_currency","rules":"required|boolean","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/exchange-rates\/copy","name":"api.v1.app.exchange-rates.copy","audience":"app","section":"exchange-rates","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch_ids","rules":"required|array","required":true},{"name":"branch_ids.*","rules":"exists:branches,id","required":false},{"name":"effective_date","rules":"required|date","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/exchange-rates\/{rate}","name":"api.v1.app.exchange-rates.destroy","audience":"app","section":"exchange-rates","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"rate","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles\/{cycle}\/results\/{employee}","name":"api.v1.app.performance.feedback.results","audience":"app","section":"feedback-cycles","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One employee's summary per reviewer group (HR any time, the employee once the cycle is closed).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles","name":"api.v1.app.performance.feedback-cycles.index","audience":"app","section":"feedback-cycles","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles","name":"api.v1.app.performance.feedback-cycles.store","audience":"app","section":"feedback-cycles","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name, evaluation_template_id, due_date, peers_per_employee; or a survey cycle (Feedback::createSurveyCycle).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|string|max:150","required":true},{"name":"evaluation_template_id","rules":"required|integer|exists:evaluation_templates,id","required":true},{"name":"due_date","rules":"required|date|after_or_equal:today","required":true},{"name":"peers_per_employee","rules":"required|integer|between:0,10","required":true},{"name":"description","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":true},{"name":"start_date","rules":"required|date","required":true},{"name":"groups","rules":"required|array","required":true},{"name":"groups.*","rules":"nullable|array","required":false},{"name":"groups.report.count","rules":"nullable|integer|between:1,10","required":false},{"name":"groups.peer.count","rules":"nullable|integer|between:1,10","required":false},{"name":"groups.*.weight","rules":"nullable|numeric|between:0,100","required":false},{"name":"assign_to","rules":"required|in:individual,group","required":true},{"name":"employees","rules":"exclude_unless:assign_to,individual|required|array|min:1","required":true},{"name":"employees.*","rules":"integer","required":false},{"name":"group","rules":"nullable|array","required":false},{"name":"group.*","rules":"nullable|alpha_dash|max:30","required":false},{"name":"questions","rules":"required|array|min:1|max:60","required":true},{"name":"questions.*.type","rules":"required|in:rating,open","required":true},{"name":"questions.*.text","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(300)","required":true},{"name":"questions.*.helper","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"questions.*.max","rules":"nullable|integer|between:2,10","required":false},{"name":"questions.*.low","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(40)","required":false},{"name":"questions.*.high","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(40)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles\/{cycle}","name":"api.v1.app.performance.feedback-cycles.show","audience":"app","section":"feedback-cycles","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The cycle and, per employee in scope, how many were asked and answered.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles\/{cycle}\/launch","name":"api.v1.app.performance.feedback-cycles.launch","audience":"app","section":"feedback-cycles","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles\/{cycle}\/close","name":"api.v1.app.performance.feedback-cycles.close","audience":"app","section":"feedback-cycles","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-cycles\/{cycle}","name":"api.v1.app.performance.feedback-cycles.destroy","audience":"app","section":"feedback-cycles","permissions":["performance.manage.*","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"cycle","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-form-assignments\/{assignment}","name":"api.v1.app.performance.forms.assignment","audience":"app","section":"feedback-form-assignments","permissions":["self.performance.forms"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A feedback form assigned to me: its questions and my answers (403 for anyone else).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-form-assignments\/{assignment}","name":"api.v1.app.performance.forms.answer","audience":"app","section":"feedback-form-assignments","permissions":["self.performance.forms"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-forms","name":"api.v1.app.performance.forms.index","audience":"app","section":"feedback-forms","permissions":["performance.feedback_forms.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-forms\/{form}","name":"api.v1.app.performance.forms.show","audience":"app","section":"feedback-forms","permissions":["performance.feedback_forms.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The form, its questions and each question's answers (names hidden when anonymous).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"form","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-forms","name":"api.v1.app.performance.forms.store","audience":"app","section":"feedback-forms","permissions":["performance.feedback_forms.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title, description, start_date, end_date, anonymous, questions [...], assign_to individual (employees) | group (group).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|string|max:200","required":true},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"questions","rules":"required|array|min:1|max:100","required":true},{"name":"questions.*.type","rules":"required|in:text,textarea,checkbox,radio,rating,yes_no","required":true},{"name":"questions.*.label","rules":"required|string|max:300","required":true},{"name":"questions.*.helper","rules":"nullable|string|max:300","required":false},{"name":"questions.*.weight","rules":"nullable|numeric|min:0|max:1000","required":false},{"name":"questions.*.options","rules":"nullable|array|max:50","required":false},{"name":"questions.*.options.*.label","rules":"required|string|max:150","required":true},{"name":"questions.*.options.*.value","rules":"required|string|max:150","required":true},{"name":"questions.*.min_rating","rules":"nullable|integer|between:0,100","required":false},{"name":"questions.*.max_rating","rules":"nullable|integer|between:1,100","required":false},{"name":"assign_to","rules":"required|in:individual,group","required":true},{"name":"employees","rules":"exclude_unless:assign_to,individual|required|array|min:1","required":true},{"name":"employees.*","rules":"integer","required":false},{"name":"group","rules":"nullable|array","required":false},{"name":"group.*","rules":"nullable|alpha_dash|max:30","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-forms\/{form}","name":"api.v1.app.performance.forms.destroy","audience":"app","section":"feedback-forms","permissions":["performance.feedback_forms.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"form","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/feedback-requests\/{feedbackRequest}","name":"api.v1.app.performance.feedback.submit","audience":"app","section":"feedback-requests","permissions":["self.performance.feedback"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"scores {criterion id: 1\u20135}, comment.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"feedbackRequest","type":"integer","pattern":null}],"fields":[{"name":"scores","rules":"required|array","required":true},{"name":"comment","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/my-jobs","name":"api.v1.app.field.my-jobs","audience":"app","section":"field","permissions":["self.field_jobs","field.jobs.view","field.jobs.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The signed-in employee's jobs: open first, then the last 30 days.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/my-jobs\/{job}","name":"api.v1.app.field.my-jobs.show","audience":"app","section":"field","permissions":["self.field_jobs","field.jobs.view","field.jobs.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"One of the employee's jobs with its photos.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/time-anchor","name":"api.v1.app.field.time-anchor","audience":"app","section":"field","permissions":["self.field_jobs"],"modules":["fsm"],"rate_limit_per_minute":30,"summary":"body: device_id, boot_id, elapsed_ms (the phone's since-boot clock as it asks).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"device_id","rules":"required|string|max:100","required":true},{"name":"boot_id","rules":"nullable|string|max:100","required":false},{"name":"elapsed_ms","rules":"nullable|integer|min:0","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/device-keys\/challenge","name":"api.v1.app.field.device-keys.challenge","audience":"app","section":"field","permissions":["self.field_jobs"],"modules":["fsm"],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/device-keys","name":"api.v1.app.field.device-keys.store","audience":"app","section":"field","permissions":["self.field_jobs"],"modules":["fsm"],"rate_limit_per_minute":10,"summary":"device_id, public_key (base64 SPKI P-256), platform, challenge, attestation {android_key_chain | ios_app_attest {key_id, attestation_object}}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/device-keys","name":"api.v1.app.field.device-keys.index","audience":"app","section":"field","permissions":["self.field_jobs"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The signed-in person's keys in this company.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/evidence","name":"api.v1.app.field.evidence.store","audience":"app","section":"field","permissions":["self.field_jobs"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"multipart: photo (JPEG, as signed), meta (canonical JSON), signature (base64 ECDSA P-256 over meta).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[{"name":"photo","rules":"required|file|mimetypes:image\/jpeg|max:15360","required":true},{"name":"meta","rules":"required|string|max:20000","required":true},{"name":"signature","rules":"required|string|max:500","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/evidence\/{evidence}\/photo","name":"api.v1.app.field.evidence.photo","audience":"app","section":"field","permissions":[],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The original JPEG (?size=thumb for the thumbnail): reviewers, and the employee who took it.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/my-overtime","name":"api.v1.app.field.overtime.mine","audience":"app","section":"field","permissions":["self.field_overtime"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/overtime\/{employeeRequest}\/submit","name":"api.v1.app.field.overtime.submit","audience":"app","section":"field","permissions":["self.field_overtime"],"modules":["fsm"],"rate_limit_per_minute":20,"summary":"body: reason (required), overtime_type_id (optional, a requestable type).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(500)","required":true},{"name":"overtime_type_id","rules":"nullable|integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/overtime\/{employeeRequest}\/discard","name":"api.v1.app.field.overtime.discard","audience":"app","section":"field","permissions":["self.field_overtime"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/flags","name":"api.v1.app.field.flags","audience":"app","section":"field","permissions":["self.field_jobs","field.evidence.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Every flag and reason code with its plain-language label and explanation in English and Arabic.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/geocode\/search","name":"api.v1.app.field.geocode.search","audience":"app","section":"field","permissions":["self.field_jobs","field.jobs.view","field.jobs.manage","field_setup.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"q (2\u2013200 characters), lang (en|ar, default the UI language), lat and lng (optional, to prefer results near them), limit (1\u201310).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"q","rules":"required|string|min:2|'max:' . \\App\\Support\\Limits::chars(200)","required":true},{"name":"lang","rules":"nullable|in:en,ar","required":false},{"name":"lat","rules":"nullable|numeric|between:-90,90|required_with:lng","required":false},{"name":"lng","rules":"nullable|numeric|between:-180,180|required_with:lat","required":false},{"name":"limit","rules":"nullable|integer|between:1,10","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/geocode\/reverse","name":"api.v1.app.field.geocode.reverse","audience":"app","section":"field","permissions":["self.field_jobs","field.jobs.view","field.jobs.manage","field_setup.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"lat, lng, lang (en|ar, default the UI language).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"lat","rules":"required|numeric|between:-90,90","required":true},{"name":"lng","rules":"required|numeric|between:-180,180","required":true},{"name":"lang","rules":"nullable|in:en,ar","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs","name":"api.v1.app.field.jobs.index","audience":"app","section":"field","permissions":["field.jobs.view","field.jobs.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"status (one or a list), branch_id, site_id, employee_id, q, date, from, to, flagged, flag, per_page; each job has flagged_count.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/summary","name":"api.v1.app.field.jobs.summary","audience":"app","section":"field","permissions":["field.jobs.view","field.jobs.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The board's counts (per status, today, in progress, awaiting review, flagged) under the same filters as jobs.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}","name":"api.v1.app.field.jobs.show","audience":"app","section":"field","permissions":["field.jobs.view","field.jobs.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/events","name":"api.v1.app.field.jobs.events","audience":"app","section":"field","permissions":["field.jobs.view","field.jobs.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/overtime","name":"api.v1.app.field.jobs.overtime","audience":"app","section":"field","permissions":["field.overtime.view"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/overtime","name":"api.v1.app.field.overtime.queue","audience":"app","section":"field","permissions":["field.overtime.view"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Overtime from field jobs in the person's branches. status (pending by default, or all), waiting_on_me, q, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/overtime\/{employeeRequest}\/decide","name":"api.v1.app.field.overtime.decide","audience":"app","section":"field","permissions":["field.overtime.approve"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"decision approved or rejected, note (required to reject).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[{"name":"decision","rules":"required|in:approved,rejected","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/sites","name":"api.v1.app.field.sites.index","audience":"app","section":"field","permissions":["field.sites.view"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/dispatch","name":"api.v1.app.field.dispatch","audience":"app","section":"field","permissions":["field.dispatch.view"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"date (Y-m-d, default today), branch_id, status, q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/candidates","name":"api.v1.app.field.jobs.candidates","audience":"app","section":"field","permissions":["field.dispatch.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Who could take the job, best first. q: find someone else of the branch by name or number.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/map-tiles","name":"api.v1.app.field.map-tiles","audience":"app","section":"field","permissions":["field.dispatch.view","field.evidence.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Where the app's maps take their pictures from (config\/mihnaro.php).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs","name":"api.v1.app.field.jobs.store","audience":"app","section":"field","permissions":["field.jobs.create"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"title, description, branch_id, field_site_id, priority, planned_start_at, planned_end_at, estimated_minutes, assignee_ids.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}","name":"api.v1.app.field.jobs.update","audience":"app","section":"field","permissions":["field.jobs.edit","field.dispatch.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}","name":"api.v1.app.field.jobs.destroy","audience":"app","section":"field","permissions":["field.jobs.delete"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/decide","name":"api.v1.app.field.jobs.decide","audience":"app","section":"field","permissions":["field.jobs.review","field.jobs.cancel"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"action approve | reject | cancel, note (required to reject or cancel).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|in:approve,reject,cancel","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/submit-without-departure","name":"api.v1.app.field.jobs.submit-without-departure","audience":"app","section":"field","permissions":["field.jobs.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"reason (required): a job waiting for its departure photo goes to review without it.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"required|string|min:3|'max:' . \\App\\Support\\Limits::chars(1000)","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/request-upload","name":"api.v1.app.field.jobs.request-upload","audience":"app","section":"field","permissions":["field.jobs.request_upload"],"modules":["fsm"],"rate_limit_per_minute":30,"summary":"note (optional): tells the job's employees to upload what is still on their phones.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/reassign","name":"api.v1.app.field.jobs.reassign","audience":"app","section":"field","permissions":["field.dispatch.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"employee_id, note (optional).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/bulk-cancel","name":"api.v1.app.field.jobs.bulk-cancel","audience":"app","section":"field","permissions":["field.jobs.cancel"],"modules":["fsm"],"rate_limit_per_minute":20,"summary":"job_ids[], reason \u2192 {cancelled: [ids], skipped: [{id, reason: not_found|not_open}]}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/jobs\/{job}\/overtime","name":"api.v1.app.field.jobs.overtime.store","audience":"app","section":"field","permissions":["field.jobs.overtime"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Draft the job's overtime now (e.g. switched on after the job was submitted). 422 when the job doesn't qualify.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/sites","name":"api.v1.app.field.sites.store","audience":"app","section":"field","permissions":["field.sites.create"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"name, address, latitude, longitude, radius_m (empty = the company default), active, branch_id (new only).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/sites\/{site}","name":"api.v1.app.field.sites.update","audience":"app","section":"field","permissions":["field.sites.edit"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"site","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/sites\/{site}","name":"api.v1.app.field.sites.destroy","audience":"app","section":"field","permissions":["field.sites.delete"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"site","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/customers","name":"api.v1.app.field.customers.index","audience":"app","section":"field","permissions":["field.customers.view"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"q, branch_id, active, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/customers","name":"api.v1.app.field.customers.store","audience":"app","section":"field","permissions":["field.customers.create"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/customers\/{customer}","name":"api.v1.app.field.customers.show","audience":"app","section":"field","permissions":["field.customers.view"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"customer","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/customers\/{customer}","name":"api.v1.app.field.customers.update","audience":"app","section":"field","permissions":["field.customers.edit"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"customer","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/customers\/{customer}","name":"api.v1.app.field.customers.destroy","audience":"app","section":"field","permissions":["field.customers.delete"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"customer","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/evidence\/{evidence}\/void","name":"api.v1.app.field.evidence.void","audience":"app","section":"field","permissions":["field.evidence.void"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"reason (required).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"required|string|min:3|'max:' . \\App\\Support\\Limits::chars(1000)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/devices","name":"api.v1.app.field.devices.index","audience":"app","section":"field","permissions":["field.evidence.devices"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Every phone key in the reviewer's branches.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/devices\/{key}\/revoke","name":"api.v1.app.field.devices.revoke","audience":"app","section":"field","permissions":["field.evidence.devices"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"key","type":"string","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/evidence","name":"api.v1.app.field.evidence.index","audience":"app","section":"field","permissions":["field.evidence.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"job_id, stage, employee_id, accepted, flag, voided, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/evidence\/{evidence}","name":"api.v1.app.field.evidence.show","audience":"app","section":"field","permissions":["field.evidence.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/evidence\/{evidence}\/c2pa","name":"api.v1.app.field.evidence.c2pa","audience":"app","section":"field","permissions":["field.evidence.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The photo's C2PA (Content Credentials) copy: its status, validation, trust and assertions (docs\/field-proof.md \u00a722).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/evidence\/{evidence}\/c2pa\/download","name":"api.v1.app.field.evidence.c2pa.download","audience":"app","section":"field","permissions":["field.evidence.review"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The C2PA copy itself (JPEG with the embedded, server-signed manifest), when signed, valid and the photo not voided.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/technicians","name":"api.v1.app.field.technicians.index","audience":"app","section":"field","permissions":["field.technicians.view","field.technicians.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"q, availability, skill, zone, branch_id, per_page. meta.options has the skills and zones in use.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/technicians\/export","name":"api.v1.app.field.technicians.export","audience":"app","section":"field","permissions":["field.technicians.export"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/technicians","name":"api.v1.app.field.technicians.store","audience":"app","section":"field","permissions":["field.technicians.create"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"employee_id, skills, zones, availability, available_until, work_days (0 = Sunday), day_start, day_end, max_daily_jobs, notes.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/technicians\/{technician}","name":"api.v1.app.field.technicians.show","audience":"app","section":"field","permissions":["field.technicians.view","field.technicians.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"technician","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/technicians\/{technician}","name":"api.v1.app.field.technicians.update","audience":"app","section":"field","permissions":["field.technicians.edit"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"technician","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/technicians\/{technician}","name":"api.v1.app.field.technicians.destroy","audience":"app","section":"field","permissions":["field.technicians.delete"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"technician","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts","name":"api.v1.app.field.inventory.parts.index","audience":"app","section":"field","permissions":["field.inventory.view","field.inventory.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"q, category, branch_id, low (1 = at or under the minimum), active, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/export","name":"api.v1.app.field.inventory.parts.export","audience":"app","section":"field","permissions":["field.inventory.export"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts","name":"api.v1.app.field.inventory.parts.store","audience":"app","section":"field","permissions":["field.inventory.create"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"sku, name, category, unit, unit_cost, supplier, min_stock, notes, active, branch_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}","name":"api.v1.app.field.inventory.parts.show","audience":"app","section":"field","permissions":["field.inventory.view","field.inventory.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}","name":"api.v1.app.field.inventory.parts.update","audience":"app","section":"field","permissions":["field.inventory.edit"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}","name":"api.v1.app.field.inventory.parts.destroy","audience":"app","section":"field","permissions":["field.inventory.delete"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}\/receive","name":"api.v1.app.field.inventory.parts.receive","audience":"app","section":"field","permissions":["field.inventory.receive"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"location_id, quantity, reference, note.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}\/adjust","name":"api.v1.app.field.inventory.parts.adjust","audience":"app","section":"field","permissions":["field.inventory.adjust"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"location_id, counted, note (required).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}\/transfer","name":"api.v1.app.field.inventory.parts.transfer","audience":"app","section":"field","permissions":["field.inventory.transfer"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"from_location_id, to_location_id, quantity, note.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}\/issue","name":"api.v1.app.field.inventory.parts.issue","audience":"app","section":"field","permissions":["field.inventory.issue"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"location_id, job_id, quantity, employee_id, note.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/parts\/{part}\/return","name":"api.v1.app.field.inventory.parts.return","audience":"app","section":"field","permissions":["field.inventory.issue"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"location_id, job_id, quantity, note.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"part","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/locations","name":"api.v1.app.field.inventory.locations.index","audience":"app","section":"field","permissions":["field.inventory.view","field.inventory.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"q, active, branch_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/locations","name":"api.v1.app.field.inventory.locations.store","audience":"app","section":"field","permissions":["field.inventory.locations"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"name, kind (warehouse, van, site), address, active, branch_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/locations\/{location}","name":"api.v1.app.field.inventory.locations.show","audience":"app","section":"field","permissions":["field.inventory.view","field.inventory.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The location and what it holds.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"location","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/locations\/{location}","name":"api.v1.app.field.inventory.locations.update","audience":"app","section":"field","permissions":["field.inventory.locations"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"location","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/locations\/{location}","name":"api.v1.app.field.inventory.locations.destroy","audience":"app","section":"field","permissions":["field.inventory.locations"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"location","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/movements","name":"api.v1.app.field.inventory.movements.index","audience":"app","section":"field","permissions":["field.inventory.view","field.inventory.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"part_id, location_id, job_id, type, from, to, branch_id, q, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/movements\/export","name":"api.v1.app.field.inventory.movements.export","audience":"app","section":"field","permissions":["field.inventory.export"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/inventory\/jobs\/{job}\/parts","name":"api.v1.app.field.inventory.jobs.parts","audience":"app","section":"field","permissions":["field.inventory.view","field.inventory.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"The parts on a work order, net of what came back.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles","name":"api.v1.app.field.vehicles.index","audience":"app","section":"field","permissions":["field.vehicles.view","field.vehicles.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"q, status, driver_id, branch_id, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/alerts","name":"api.v1.app.field.vehicles.alerts","audience":"app","section":"field","permissions":["field.vehicles.view","field.vehicles.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/export","name":"api.v1.app.field.vehicles.export","audience":"app","section":"field","permissions":["field.vehicles.export"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles","name":"api.v1.app.field.vehicles.store","audience":"app","section":"field","permissions":["field.vehicles.create"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"plate_number, make, model, year, vin, status, driver_employee_id, odometer_km, notes, branch_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}","name":"api.v1.app.field.vehicles.show","audience":"app","section":"field","permissions":["field.vehicles.view","field.vehicles.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}","name":"api.v1.app.field.vehicles.update","audience":"app","section":"field","permissions":["field.vehicles.edit","field.vehicles.driver"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}","name":"api.v1.app.field.vehicles.destroy","audience":"app","section":"field","permissions":["field.vehicles.delete"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/documents","name":"api.v1.app.field.vehicles.documents.index","audience":"app","section":"field","permissions":["field.vehicles.view","field.vehicles.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/documents","name":"api.v1.app.field.vehicles.documents.store","audience":"app","section":"field","permissions":["field.vehicles.documents"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/documents\/{row}","name":"api.v1.app.field.vehicles.documents.update","audience":"app","section":"field","permissions":["field.vehicles.documents"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null},{"name":"row","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/documents\/{row}","name":"api.v1.app.field.vehicles.documents.destroy","audience":"app","section":"field","permissions":["field.vehicles.documents"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null},{"name":"row","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/maintenance","name":"api.v1.app.field.vehicles.maintenance.index","audience":"app","section":"field","permissions":["field.vehicles.view","field.vehicles.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/maintenance","name":"api.v1.app.field.vehicles.maintenance.store","audience":"app","section":"field","permissions":["field.vehicles.maintenance"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/maintenance\/{row}","name":"api.v1.app.field.vehicles.maintenance.update","audience":"app","section":"field","permissions":["field.vehicles.maintenance"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null},{"name":"row","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/maintenance\/{row}","name":"api.v1.app.field.vehicles.maintenance.destroy","audience":"app","section":"field","permissions":["field.vehicles.maintenance"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null},{"name":"row","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/fuel","name":"api.v1.app.field.vehicles.fuel.index","audience":"app","section":"field","permissions":["field.vehicles.view","field.vehicles.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/fuel","name":"api.v1.app.field.vehicles.fuel.store","audience":"app","section":"field","permissions":["field.vehicles.fuel"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/fuel\/{row}","name":"api.v1.app.field.vehicles.fuel.update","audience":"app","section":"field","permissions":["field.vehicles.fuel"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null},{"name":"row","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/vehicles\/{vehicle}\/fuel\/{row}","name":"api.v1.app.field.vehicles.fuel.destroy","audience":"app","section":"field","permissions":["field.vehicles.fuel"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"vehicle","type":"integer","pattern":null},{"name":"row","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/settings","name":"api.v1.app.field.settings","audience":"app","section":"field","permissions":["field_setup.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/settings","name":"api.v1.app.field.settings.update","audience":"app","section":"field","permissions":["field_setup.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Any field_* setting (docs\/field-proof.md); the others keep their value.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/settings\/branches\/{branch}","name":"api.v1.app.field.settings.branch","audience":"app","section":"field","permissions":["field_setup.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Every key: {company, branch (null = inherited), effective, source}.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/field\/settings\/branches\/{branch}","name":"api.v1.app.field.settings.branch.update","audience":"app","section":"field","permissions":["field_setup.manage"],"modules":["fsm"],"rate_limit_per_minute":60,"summary":"Any field_* key; null or \"inherit\" takes it back to the company's value.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions","name":"api.v1.app.payroll.transactions","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Financial transactions in my scope: month, employee_id, type (earning | deduction), off_cycle.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions\/{transaction}","name":"api.v1.app.payroll.transactions.show","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One transaction in my scope, with the employee and its attachments' names.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"transaction","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions","name":"api.v1.app.payroll.transactions.store","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"transaction_type_id","rules":"nullable|integer|exists:transaction_types,id","required":false},{"name":"type","rules":"required_without:transaction_type_id|nullable|in:earning,deduction","required":false},{"name":"category","rules":"required_without:transaction_type_id|nullable|in:bonus,commission,overtime,expense,per_diem,air_ticket,penalty,other","required":false},{"name":"amount","rules":"required|numeric|min:0.01","required":true},{"name":"month","rules":"required_without:effective_date|nullable|date_format:Y-m","required":false},{"name":"effective_date","rules":"nullable|date_format:Y-m-d","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"amount_type","rules":"nullable|in:total,net","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions\/{transaction}","name":"api.v1.app.payroll.transactions.update","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Edit an unpaid transaction added by HR: the fields of storeTransaction; new files join its attachments.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"transaction","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"transaction_type_id","rules":"nullable|integer|exists:transaction_types,id","required":false},{"name":"type","rules":"required_without:transaction_type_id|nullable|in:earning,deduction","required":false},{"name":"category","rules":"required_without:transaction_type_id|nullable|in:bonus,commission,overtime,expense,per_diem,air_ticket,penalty,other","required":false},{"name":"amount","rules":"required|numeric|min:0.01","required":true},{"name":"month","rules":"required_without:effective_date|nullable|date_format:Y-m","required":false},{"name":"effective_date","rules":"nullable|date_format:Y-m-d","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"amount_type","rules":"nullable|in:total,net","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions\/{transaction}","name":"api.v1.app.payroll.transactions.destroy","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"transaction","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions\/bulk-delete","name":"api.v1.app.payroll.transactions.bulk-destroy","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ids: unpaid, regular-payroll transactions of employees in payroll.manage scope; returns how many were deleted.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"ids","rules":"required|array|min:1","required":true},{"name":"ids.*","rules":"integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions\/{transaction}\/next-month","name":"api.v1.app.payroll.transactions.next-month","audience":"app","section":"financial-transactions","permissions":["payroll.transactions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"transaction","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/financial-transactions\/amortized","name":"api.v1.app.payroll.transactions.amortized","audience":"app","section":"financial-transactions","permissions":["payroll.expenses.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_id, type earning|deduction, amount, months (2-60), start_month (Y-m), description.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"type","rules":"required|in:earning,deduction","required":true},{"name":"amount","rules":"required|numeric|gt:0","required":true},{"name":"months","rules":"required|integer|min:2|max:60","required":true},{"name":"start_month","rules":"required|date_format:Y-m","required":true},{"name":"description","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(190)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/{kind}\/{id}\/comments","name":"api.v1.app.requests.comments","audience":"app","section":"general","permissions":["self.requests.view","self.approvals.decide","requests.view","requests.manage","self.leaves.view","leaves.view","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"requests|leaves"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/{kind}\/{id}\/comments","name":"api.v1.app.requests.comments.store","audience":"app","section":"general","permissions":["self.requests.view","self.approvals.decide","requests.view","requests.manage","self.leaves.view","leaves.view","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"requests|leaves"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/general-factor-templates","name":"api.v1.app.performance.factor-templates.store","audience":"app","section":"general-factor-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, branch_ids, factors [{name {en, ar}, weight}].","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/general-factor-templates\/{template}","name":"api.v1.app.performance.factor-templates.update","audience":"app","section":"general-factor-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, branch_ids, factors [{name {en, ar}, weight}].","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/general-factor-templates\/{template}","name":"api.v1.app.performance.factor-templates.destroy","audience":"app","section":"general-factor-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/geolocations","name":"api.v1.app.geolocations.index","audience":"app","section":"geolocations","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/geolocations","name":"api.v1.app.geolocations.store","audience":"app","section":"geolocations","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/geolocations\/{location}","name":"api.v1.app.geolocations.update","audience":"app","section":"geolocations","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Send only what changes.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"location","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/geolocations\/{location}","name":"api.v1.app.geolocations.destroy","audience":"app","section":"geolocations","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"location","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/geolocations\/{location}\/bulk","name":"api.v1.app.geolocations.bulk","audience":"app","section":"geolocations","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"action assign|unassign|replace: this location for every active employee in reach (attendance.manage).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"location","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|in:assign,unassign,replace","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/goals","name":"api.v1.app.performance.goals.store","audience":"app","section":"goals","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_id or employee_ids (default: me), title, description, due_date.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"nullable|integer","required":false},{"name":"employee_ids","rules":"nullable|array","required":false},{"name":"employee_ids.*","rules":"integer","required":false},{"name":"title","rules":"required|string|max:200","required":true},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"due_date","rules":"nullable|date","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/goals\/{goal}","name":"api.v1.app.performance.goals.update","audience":"app","section":"goals","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"progress, status.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"goal","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/goals\/{goal}","name":"api.v1.app.performance.goals.destroy","audience":"app","section":"goals","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"goal","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/help","name":"api.v1.app.help.index","audience":"app","section":"help","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"The help center: the topics the person may use, in their language (docs\/help.md).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/holiday-calendar","name":"api.v1.app.holidays.calendar","audience":"app","section":"holiday-calendar","permissions":["self.holiday_calendar","leaves.view","employees.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET holiday-calendar?month=YYYY-MM","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/holidays","name":"api.v1.app.holidays.index","audience":"app","section":"holidays","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The year's holidays (?year, this year by default).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/holidays","name":"api.v1.app.holidays.store","audience":"app","section":"holidays","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"date","rules":"required|date|unique:holidays,date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:date","required":false},{"name":"religions","rules":"nullable|array","required":false},{"name":"religions.*","rules":"in:muslim,christian,hindu,buddhist,sikh,other","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/holidays\/{holiday}","name":"api.v1.app.holidays.update","audience":"app","section":"holidays","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Send only what changes.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"holiday","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/holidays\/{holiday}","name":"api.v1.app.holidays.destroy","audience":"app","section":"holidays","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"holiday","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/import","name":"api.v1.app.import.index","audience":"app","section":"import","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/import\/{type}\/template","name":"api.v1.app.import.template","audience":"app","section":"import","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":60,"summary":"The CSV template (language en|ar); existing=1 fills it with the current data. Preview is upload without commit.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/import\/{type}","name":"api.v1.app.import.upload","audience":"app","section":"import","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"string","pattern":null}],"fields":[{"name":"file","rules":"required|file|max:10240|extensions:csv,xlsx","required":true},{"name":"mode","rules":"nullable|in:create,update","required":false},{"name":"language","rules":"nullable|in:en,ar","required":false},{"name":"map","rules":"nullable|array","required":false},{"name":"commit","rules":"sometimes|boolean","required":false},{"name":"options","rules":"nullable|array","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/imported-sheets","name":"api.v1.app.import.logs","audience":"app","section":"imported-sheets","permissions":["employees.import"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-members\/{member}","name":"api.v1.app.insurance.members.destroy","audience":"app","section":"insurance-members","permissions":["payroll.insurance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"member","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-policies","name":"api.v1.app.insurance.index","audience":"app","section":"insurance-policies","permissions":["payroll.insurance.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Policies, latest expiry first, each with its members in my scope; active=1 keeps the policies in force today.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-policies\/{policy}","name":"api.v1.app.insurance.show","audience":"app","section":"insurance-policies","permissions":["payroll.insurance.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-policies\/{policy}\/members","name":"api.v1.app.insurance.members.store","audience":"app","section":"insurance-policies","permissions":["payroll.insurance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"family_member_id","rules":"nullable|exists:family_members,id","required":false},{"name":"offline_insurance_id","rules":"nullable|string|max:60","required":false},{"name":"start_date","rules":"nullable|date","required":false},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"adult_dependents","rules":"nullable|integer|min:0|max:20","required":false},{"name":"minor_dependents","rules":"nullable|integer|min:0|max:20","required":false},{"name":"custom_cost","rules":"nullable|required_if:custom_setup,1|numeric|min:0","required":false},{"name":"monthly_deduction","rules":"nullable|numeric|min:0","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-policies","name":"api.v1.app.insurance.store","audience":"app","section":"insurance-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"insurer","rules":"required|string|max:120","required":true},{"name":"policy_number","rules":"nullable|string|max:60","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"expiry_date","rules":"required|date|after:start_date","required":true},{"name":"cost_adult","rules":"required|numeric|min:0","required":true},{"name":"cost_minor","rules":"required|numeric|min:0","required":true},{"name":"currency_adult","rules":"nullable|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,ZWL","required":false},{"name":"currency_minor","rules":"nullable|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,ZWL","required":false},{"name":"branch_id","rules":"nullable|exists:branches,id","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-policies\/{policy}","name":"api.v1.app.insurance.update","audience":"app","section":"insurance-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[{"name":"insurer","rules":"required|string|max:120","required":true},{"name":"policy_number","rules":"nullable|string|max:60","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"expiry_date","rules":"required|date|after:start_date","required":true},{"name":"cost_adult","rules":"required|numeric|min:0","required":true},{"name":"cost_minor","rules":"required|numeric|min:0","required":true},{"name":"currency_adult","rules":"nullable|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,ZWL","required":false},{"name":"currency_minor","rules":"nullable|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,ZWL","required":false},{"name":"branch_id","rules":"nullable|exists:branches,id","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/insurance-policies\/{policy}","name":"api.v1.app.insurance.destroy","audience":"app","section":"insurance-policies","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/marketplace","name":"api.v1.app.integrations.marketplace","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"GET integrations\/marketplace?category=&active=active|inactive&q=: the connector catalogue and each one's state.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/connections","name":"api.v1.app.integrations.connections.index","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/connections\/{provider}\/mode","name":"api.v1.app.integrations.connections.mode","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/connections\/{provider}","name":"api.v1.app.integrations.connections.save","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[{"name":"app","rules":"sometimes|in:own,platform","required":false},{"name":"client_id","rules":"sometimes|nullable|string|max:190","required":false},{"name":"client_secret","rules":"sometimes|nullable|string|max:500","required":false},{"name":"tenant","rules":"sometimes|nullable|string|max:64|regex:\/^[A-Za-z0-9.-]+$\/","required":false},{"name":"organization","rules":"sometimes|nullable|digits_between:3,20","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/connections\/{provider}\/authorize-url","name":"api.v1.app.integrations.connections.authorize","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"The consent page to open in a browser where the same person is signed in to Mihnaro.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/connections\/{provider}\/test","name":"api.v1.app.integrations.connections.test","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/integrations\/connections\/{provider}","name":"api.v1.app.integrations.connections.disconnect","audience":"app","section":"integrations","permissions":["integrations.manage.*"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"provider","type":"string","pattern":"zoom|google|microsoft|linkedin|odoo|quickbooks|xero|netsuite|business_central|sap_b1|sap_s4hana|dynamics_fo"}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/job-grade-levels\/{level}","name":"api.v1.app.job-grades.levels.destroy","audience":"app","section":"job-grade-levels","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"level","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/job-grades","name":"api.v1.app.job-grades.index","audience":"app","section":"job-grades","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The job grades with their ranges, levels, leave days, headcount, average, compa-ratio and who is outside the range.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/job-grades\/{grade}","name":"api.v1.app.job-grades.update","audience":"app","section":"job-grades","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"grade","type":"integer","pattern":null}],"fields":[{"name":"ideal_compa_ratio","rules":"required|numeric|between:0.5,1.5","required":true},{"name":"benefits","rules":"nullable|string|max:2000","required":false},{"name":"leave","rules":"array","required":false},{"name":"leave.*","rules":"nullable|numeric|min:0|max:365","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/job-grades\/{grade}\/levels","name":"api.v1.app.job-grades.levels.store","audience":"app","section":"job-grades","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"grade","type":"integer","pattern":null}],"fields":[{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"rank","rules":"required|integer|min:1|max:100","required":true},{"name":"salary","rules":"required|numeric|min:0","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions","name":"api.v1.app.succession.index","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions","name":"api.v1.app.succession.store","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.positions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, position_id, department_id, holder_id, risk_of_loss, impact, notes.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions\/{position}","name":"api.v1.app.succession.update","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.positions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, position_id, department_id, holder_id, risk_of_loss, impact, notes.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"position","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions\/{position}","name":"api.v1.app.succession.destroy","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.positions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"position","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions\/{position}\/successors","name":"api.v1.app.succession.successors.store","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.successors.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_id, readiness, development_plan.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"position","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer|exists:employees,id|Rule::notIn(array_filter([$position->holder_id]))","required":true},{"name":"readiness","rules":"required|in:ready_now,one_two_years,three_plus_years","required":true},{"name":"development_plan","rules":"nullable|string|max:255","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions\/{position}\/suggestions","name":"api.v1.app.succession.suggestions","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"limit (1\u201350, default 10).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"position","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/key-positions\/{position}\/suggestions\/{employee}\/explain","name":"api.v1.app.succession.explain","audience":"app","section":"key-positions","permissions":["succession.manage.*","succession.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"position","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-adjustments","name":"api.v1.app.leaves.adjustments","audience":"app","section":"leave-adjustments","permissions":["leaves.adjustments.view","leaves.moved_balances.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ZenHR Manage adjustments \/ Manage moved balances (kind=moved): type, year, employee; 50 a page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"kind","rules":"nullable|in:adjustments,moved","required":false},{"name":"type","rules":"nullable|integer","required":false},{"name":"year","rules":"nullable|integer","required":false},{"name":"employee","rules":"nullable|integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-adjustments","name":"api.v1.app.leaves.adjust","audience":"app","section":"leave-adjustments","permissions":["leaves.adjustments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"leave_type_id","rules":"required|exists:leave_types,id","required":true},{"name":"year","rules":"required|integer|between:2000,2100","required":true},{"name":"days","rules":"required|numeric|not_in:0|between:-365,365","required":true},{"name":"reason","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(255)","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-adjustments\/{adjustment}","name":"api.v1.app.leaves.adjust.destroy","audience":"app","section":"leave-adjustments","permissions":["leaves.adjustments.manage","leaves.moved_balances.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"adjustment","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-balance-history","name":"api.v1.app.leaves.balance-history","audience":"app","section":"leave-balance-history","permissions":["leaves.balance_corrections.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee","rules":"nullable|integer","required":false},{"name":"from","rules":"nullable|date_format:Y-m-d","required":false},{"name":"to","rules":"nullable|date_format:Y-m-d","required":false},{"name":"status","rules":"nullable|in:present,absent,partial","required":false},{"name":"type","rules":"nullable|integer","required":false},{"name":"year","rules":"nullable|integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-balances\/move","name":"api.v1.app.leaves.move","audience":"app","section":"leave-balances","permissions":["leaves.moved_balances.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Moves unused days of a type into next year: leave_type_id, year, max_days (leaves.moved_balances.manage over the company).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"leave_type_id","rules":"required|integer","required":true},{"name":"year","rules":"required|integer|between:2000,2100","required":true},{"name":"max_days","rules":"required|numeric|min:0|max:365","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-encashments","name":"api.v1.app.leaves.encashments","audience":"app","section":"leave-encashments","permissions":["leaves.encashments.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-encashments","name":"api.v1.app.leaves.encash","audience":"app","section":"leave-encashments","permissions":["leaves.encashments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"attachment","rules":"nullable|file|max:10240|mimes:pdf,jpg,jpeg,png","required":false},{"name":"leave_type_id","rules":"required|integer|exists:leave_types,id","required":true},{"name":"days","rules":"required|numeric|min:0.5|max:365","required":true},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-encashments\/{encashment}","name":"api.v1.app.leaves.encash.destroy","audience":"app","section":"leave-encashments","permissions":["leaves.encashments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"encashment","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-types\/{type}\/discipline","name":"api.v1.app.discipline.time-off.update","audience":"app","section":"leave-types","permissions":["discipline_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-types\/{leaveType}\/apply","name":"api.v1.app.leaves.apply","audience":"app","section":"leave-types","permissions":["leaves.balance_corrections.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Gives a leave type to employees: scope all|selected, employee_ids, entitlement_days, open_balance, balance_year.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leaveType","type":"integer","pattern":null}],"fields":[{"name":"scope","rules":"required|in:all,selected","required":true},{"name":"employee_ids","rules":"required_if:scope,selected|array","required":false},{"name":"employee_ids.*","rules":"integer","required":false},{"name":"entitlement_days","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"open_balance","rules":"nullable|numeric|min:-365|max:365","required":false},{"name":"balance_year","rules":"nullable|integer|min:2000|max:2100","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-types","name":"api.v1.app.leave-types.index","audience":"app","section":"leave-types","permissions":["leave_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Leave types, of one ?category, with how many employees have each.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-types","name":"api.v1.app.leave-types.store","audience":"app","section":"leave-types","permissions":["leave_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A new type: category and the whole form, as on the screen.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"code","rules":"nullable|alpha_dash|max:30|unique:leave_types","required":false},{"name":"color","rules":"nullable|regex:\/^#[0-9a-fA-F]{6}$\/","required":false},{"name":"icon","rules":"nullable|in:\u23f3,\u2708\ufe0f,\u2744\ufe0f,\ud83c\udf34,\ud83c\udfd6\ufe0f,\ud83c\udfe0,\ud83d\udc4b,\ud83d\udcc5,\ud83d\udcda,\ud83d\udd57,\ud83e\udd12,\ud83e\udd13,\ud83e\udd30,\ud83d\ude98","required":false},{"name":"gl_identifier","rules":"nullable|string|max:50","required":false},{"name":"balance_type","rules":"nullable|in:contractual,normal,first_request","required":false},{"name":"entitlement_days","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"entitlement_hours","rules":"nullable|numeric|min:0|max:200","required":false},{"name":"allowed_after_value","rules":"nullable|integer|min:0|max:3650","required":false},{"name":"allowed_after_unit","rules":"nullable|in:day,month,year","required":false},{"name":"max_consecutive_days","rules":"nullable|integer|min:1|max:365","required":false},{"name":"min_consecutive_days","rules":"nullable|integer|min:1|max:365","required":false},{"name":"max_consecutive_hours","rules":"nullable|numeric|min:0.25|max:24","required":false},{"name":"min_consecutive_hours","rules":"nullable|numeric|min:0.25|max:24","required":false},{"name":"min_notice_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"notice_slices","rules":"nullable|array","required":false},{"name":"notice_slices.*.from","rules":"nullable|numeric|min:0","required":false},{"name":"notice_slices.*.to","rules":"nullable|numeric|min:0","required":false},{"name":"notice_slices.*.notice","rules":"nullable|integer|min:0|max:365","required":false},{"name":"max_weekend_exclude","rules":"nullable|integer|min:0|max:365","required":false},{"name":"exceed_by","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"accrual_rate","rules":"nullable|in:daily,monthly","required":false},{"name":"balance_cap","rules":"nullable|numeric|min:0|max:999","required":false},{"name":"compensation_percent","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"compensation_allowance_ids","rules":"nullable|array","required":false},{"name":"compensation_allowance_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"balance_setups","rules":"nullable|array","required":false},{"name":"balance_setups.*.from","rules":"nullable|integer|min:0|max:60","required":false},{"name":"balance_setups.*.to","rules":"nullable|integer|min:0|max:60","required":false},{"name":"balance_setups.*.open","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"balance_setups.*.carry","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"encash_payroll","rules":"nullable|in:in_payroll,off_cycle","required":false},{"name":"attachment_after","rules":"nullable|numeric|min:0|max:999","required":false},{"name":"deduction_percent","rules":"nullable|numeric|min:0|$hourly && ($input['deduction_type'] ?? null) === 'fixed' ? 'max:100000000' : 'm...","required":false},{"name":"deduction_type","rules":"nullable|in:fixed,pro_rata","required":false},{"name":"grace_amount","rules":"nullable|integer|min:0|max:10000","required":false},{"name":"grace_interval","rules":"nullable|in:day,week,month","required":false},{"name":"disciplinary_type_id","rules":"nullable|integer","required":false},{"name":"request_limit","rules":"nullable|integer|min:1|max:100","required":false},{"name":"request_limit_type","rules":"nullable|in:service,per_year,none","required":false},{"name":"rules","rules":"nullable|array","required":false},{"name":"rules.*.type","rules":"nullable|in:gender,religion,nationality,department,section,work_location,work_type,job_role,hierarchy_group,business_unit,division,segment,main_project","required":false},{"name":"rules.*.values","rules":"nullable|array","required":false},{"name":"minutes_allowed","rules":"nullable|integer|min:1|max:100000","required":false},{"name":"minutes_allowed_per","rules":"nullable|in:day,week,month","required":false},{"name":"transactions_allowed","rules":"nullable|integer|min:1|max:1000","required":false},{"name":"transactions_allowed_per","rules":"nullable|in:day,week,month","required":false},{"name":"hourly_deductions","rules":"nullable|array","required":false},{"name":"hourly_deductions.*.leave_type_id","rules":"nullable|integer|exists:leave_types,id","required":false},{"name":"hourly_deductions.*.percent","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"repeat_every","rules":"nullable|integer|min:1|max:120","required":false},{"name":"repeat_unit","rules":"nullable|in:month,year,once","required":false},{"name":"sick_slices","rules":"nullable|array","required":false},{"name":"sick_slices.*.from","rules":"nullable|integer|min:1|max:366","required":false},{"name":"sick_slices.*.to","rules":"nullable|integer|min:1|max:366","required":false},{"name":"sick_slices.*.deduction","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"applies_to","rules":"nullable|in:all,assigned","required":false},{"name":"effective_date","rules":"nullable|date","required":false},{"name":"balance_update_type","rules":"nullable|in:current,new","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-types\/{leaveType}","name":"api.v1.app.leave-types.update","audience":"app","section":"leave-types","permissions":["leave_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A type's whole form, as on the screen (balance_update_type and effective_date for a new balance from a date).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leaveType","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(100)","required":true},{"name":"code","rules":"nullable|alpha_dash|max:30|unique:leave_types","required":false},{"name":"color","rules":"nullable|regex:\/^#[0-9a-fA-F]{6}$\/","required":false},{"name":"icon","rules":"nullable|in:\u23f3,\u2708\ufe0f,\u2744\ufe0f,\ud83c\udf34,\ud83c\udfd6\ufe0f,\ud83c\udfe0,\ud83d\udc4b,\ud83d\udcc5,\ud83d\udcda,\ud83d\udd57,\ud83e\udd12,\ud83e\udd13,\ud83e\udd30,\ud83d\ude98","required":false},{"name":"gl_identifier","rules":"nullable|string|max:50","required":false},{"name":"balance_type","rules":"nullable|in:contractual,normal,first_request","required":false},{"name":"entitlement_days","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"entitlement_hours","rules":"nullable|numeric|min:0|max:200","required":false},{"name":"allowed_after_value","rules":"nullable|integer|min:0|max:3650","required":false},{"name":"allowed_after_unit","rules":"nullable|in:day,month,year","required":false},{"name":"max_consecutive_days","rules":"nullable|integer|min:1|max:365","required":false},{"name":"min_consecutive_days","rules":"nullable|integer|min:1|max:365","required":false},{"name":"max_consecutive_hours","rules":"nullable|numeric|min:0.25|max:24","required":false},{"name":"min_consecutive_hours","rules":"nullable|numeric|min:0.25|max:24","required":false},{"name":"min_notice_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"notice_slices","rules":"nullable|array","required":false},{"name":"notice_slices.*.from","rules":"nullable|numeric|min:0","required":false},{"name":"notice_slices.*.to","rules":"nullable|numeric|min:0","required":false},{"name":"notice_slices.*.notice","rules":"nullable|integer|min:0|max:365","required":false},{"name":"max_weekend_exclude","rules":"nullable|integer|min:0|max:365","required":false},{"name":"exceed_by","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"accrual_rate","rules":"nullable|in:daily,monthly","required":false},{"name":"balance_cap","rules":"nullable|numeric|min:0|max:999","required":false},{"name":"compensation_percent","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"compensation_allowance_ids","rules":"nullable|array","required":false},{"name":"compensation_allowance_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"balance_setups","rules":"nullable|array","required":false},{"name":"balance_setups.*.from","rules":"nullable|integer|min:0|max:60","required":false},{"name":"balance_setups.*.to","rules":"nullable|integer|min:0|max:60","required":false},{"name":"balance_setups.*.open","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"balance_setups.*.carry","rules":"nullable|numeric|min:0|max:365","required":false},{"name":"encash_payroll","rules":"nullable|in:in_payroll,off_cycle","required":false},{"name":"attachment_after","rules":"nullable|numeric|min:0|max:999","required":false},{"name":"deduction_percent","rules":"nullable|numeric|min:0|$hourly && ($input['deduction_type'] ?? null) === 'fixed' ? 'max:100000000' : 'm...","required":false},{"name":"deduction_type","rules":"nullable|in:fixed,pro_rata","required":false},{"name":"grace_amount","rules":"nullable|integer|min:0|max:10000","required":false},{"name":"grace_interval","rules":"nullable|in:day,week,month","required":false},{"name":"disciplinary_type_id","rules":"nullable|integer","required":false},{"name":"request_limit","rules":"nullable|integer|min:1|max:100","required":false},{"name":"request_limit_type","rules":"nullable|in:service,per_year,none","required":false},{"name":"rules","rules":"nullable|array","required":false},{"name":"rules.*.type","rules":"nullable|in:gender,religion,nationality,department,section,work_location,work_type,job_role,hierarchy_group,business_unit,division,segment,main_project","required":false},{"name":"rules.*.values","rules":"nullable|array","required":false},{"name":"minutes_allowed","rules":"nullable|integer|min:1|max:100000","required":false},{"name":"minutes_allowed_per","rules":"nullable|in:day,week,month","required":false},{"name":"transactions_allowed","rules":"nullable|integer|min:1|max:1000","required":false},{"name":"transactions_allowed_per","rules":"nullable|in:day,week,month","required":false},{"name":"hourly_deductions","rules":"nullable|array","required":false},{"name":"hourly_deductions.*.leave_type_id","rules":"nullable|integer|exists:leave_types,id","required":false},{"name":"hourly_deductions.*.percent","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"repeat_every","rules":"nullable|integer|min:1|max:120","required":false},{"name":"repeat_unit","rules":"nullable|in:month,year,once","required":false},{"name":"sick_slices","rules":"nullable|array","required":false},{"name":"sick_slices.*.from","rules":"nullable|integer|min:1|max:366","required":false},{"name":"sick_slices.*.to","rules":"nullable|integer|min:1|max:366","required":false},{"name":"sick_slices.*.deduction","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"applies_to","rules":"nullable|in:all,assigned","required":false},{"name":"effective_date","rules":"nullable|date","required":false},{"name":"balance_update_type","rules":"nullable|in:current,new","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/leave-types\/{leaveType}","name":"api.v1.app.leave-types.destroy","audience":"app","section":"leave-types","permissions":["leave_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leaveType","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leaves","name":"api.v1.app.leaves.store","audience":"app","section":"leaves","permissions":["self.leaves.request"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"Ask for time off (multipart with an attachment when the type needs one).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"attachment","rules":"nullable|file|max:10240|mimes:pdf,jpg,jpeg,png","required":false},{"name":"half_day","rules":"nullable|boolean","required":false},{"name":"advance_requested","rules":"nullable|boolean","required":false},{"name":"start_time","rules":"required","required":true},{"name":"end_time","rules":"required","required":true},{"name":"end_date","rules":"required","required":true},{"name":"leave_type_id","rules":"required|exists:leave_types,id","required":true},{"name":"start_date","rules":"required|date","required":true},{"name":"reason","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leaves\/{leave}","name":"api.v1.app.leaves.show","audience":"app","section":"leaves","permissions":["self.leaves.view","self.approvals.decide","leaves.view","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leave","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leaves\/{leave}\/attachment","name":"api.v1.app.leaves.attachment","audience":"app","section":"leaves","permissions":["self.leaves.view","self.approvals.decide","leaves.view","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET leaves\/{id}\/attachment: the file, for the employee or whoever sees their leaves.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leave","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/leaves\/{leave}\/approval-cycle","name":"api.v1.app.leaves.cycle","audience":"app","section":"leaves","permissions":["self.leaves.view","self.approvals.decide","leaves.view","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET leaves\/{id}\/approval-cycle: ZenHR's \"Approval Cycle\" of a time off (ApprovalCycle), for the employee, whoever sees their leaves, or an approver.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leave","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leaves\/{leave}\/withdraw","name":"api.v1.app.leaves.withdraw","audience":"app","section":"leaves","permissions":["self.leaves.cancel","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leave","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/leaves\/{leave}\/decide","name":"api.v1.app.leaves.decide","audience":"app","section":"leaves","permissions":["self.approvals.decide","requests.manage","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Decide the step it waits on: decision approved|rejected, decision_note, non_deduct (leaves.manage).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"leave","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/legal-rules","name":"api.v1.app.legal-rules.index","audience":"app","section":"legal-rules","permissions":["payroll_setup.manage","legal_rules.validate"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/legal-rules\/{rule}","name":"api.v1.app.legal-rules.record","audience":"app","section":"legal-rules","permissions":["payroll_setup.manage","legal_rules.validate"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"rule","type":"string","pattern":"overtime_to_leave|rest_day_overtime|holiday_overtime|loan_settlement_deduction|eos_formula|tax_scale|day_divisor"}],"fields":[{"name":"validated_by","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"reference","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(255)","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/legal-rules\/{rule}","name":"api.v1.app.legal-rules.withdraw","audience":"app","section":"legal-rules","permissions":["payroll_setup.manage","legal_rules.validate"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"rule","type":"string","pattern":"overtime_to_leave|rest_day_overtime|holiday_overtime|loan_settlement_deduction|eos_formula|tax_scale|day_divisor"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates","name":"api.v1.app.letters.templates","audience":"app","section":"letter-templates","permissions":["self.letters.request","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Letter templates: all for letters.manage, else the self-service ones I can generate.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/{template}","name":"api.v1.app.letters.templates.show","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One template with its body (letters.manage).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/placeholders","name":"api.v1.app.letters.templates.placeholders","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"What the editor can insert: the {placeholders} with their names, and the active e-signatures as {signature:ID}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/images","name":"api.v1.app.letters.templates.images","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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>.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/preview","name":"api.v1.app.letters.templates.preview","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A body as its letter prints, before saving: body, language, employee_id (none: placeholders shown by name); format=pdf for the PDF.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"body","rules":"nullable|string|max:200000","required":false},{"name":"language","rules":"nullable|in:ar,en","required":false},{"name":"employee_id","rules":"nullable|integer","required":false},{"name":"addressed_to","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"effective_date","rules":"nullable|date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates","name":"api.v1.app.letters.templates.store","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"description","rules":"nullable|array","required":false},{"name":"description.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"description.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"language","rules":"required|in:ar,en","required":true},{"name":"letter_category_id","rules":"nullable|exists:letter_categories,id","required":false},{"name":"body","rules":"required|string|max:200000","required":true},{"name":"direct_access","rules":"nullable|in:no,yes,notify,approval","required":false},{"name":"confirmation_days","rules":"nullable|integer|min:1|max:365","required":false},{"name":"branch_ids","rules":"nullable|array","required":false},{"name":"branch_ids.*","rules":"integer|exists:branches,id","required":false},{"name":"notify_employee_ids","rules":"nullable|array","required":false},{"name":"notify_employee_ids.*","rules":"integer|exists:employees,id","required":false},{"name":"financial","rules":"sometimes|boolean","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/{template}","name":"api.v1.app.letters.templates.update","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/{template}\/duplicate","name":"api.v1.app.letters.templates.duplicate","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letter-templates\/{template}\/favorite","name":"api.v1.app.letters.templates.favorite","audience":"app","section":"letter-templates","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/letters","name":"api.v1.app.letters.index","audience":"app","section":"letters","permissions":["self.letters.view","letters.view","letters.manage","letters.issue","letters.decide"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Letters I may see (mine once released, and those in my letters scope): status, employee_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/letters\/{letter}","name":"api.v1.app.letters.show","audience":"app","section":"letters","permissions":["self.letters.view","letters.view","letters.manage","letters.issue","letters.decide"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A letter with its text; opening my own marks it seen.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"letter","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/letters\/{letter}\/pdf","name":"api.v1.app.letters.pdf","audience":"app","section":"letters","permissions":["self.letters.download","letters.view","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"The letter as a PDF file (application\/pdf), in the letter's language.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"letter","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letters\/generate","name":"api.v1.app.letters.generate","audience":"app","section":"letters","permissions":["self.letters.request","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"Generate a self-service letter for myself.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"letter_template_id","rules":"required|integer","required":true},{"name":"addressed_to","rules":"nullable|string|max:150","required":false},{"name":"effective_date","rules":"nullable|date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letters\/{letter}\/confirm","name":"api.v1.app.letters.confirm","audience":"app","section":"letters","permissions":["self.letters.request","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"letter","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letters","name":"api.v1.app.letters.issue","audience":"app","section":"letters","permissions":["letters.issue"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Issue a letter from a template to an employee in scope (letters.manage).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"letter_template_id","rules":"required|integer","required":true},{"name":"addressed_to","rules":"nullable|string|max:150","required":false},{"name":"effective_date","rules":"nullable|date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/letters\/{letter}\/decide","name":"api.v1.app.letters.decide","audience":"app","section":"letters","permissions":["letters.decide"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Approve or reject a letter waiting for approval: decision approved|rejected (letters.manage, not one you issued).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"letter","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/line-manager-access","name":"api.v1.app.line-manager-access.show","audience":"app","section":"line-manager-access","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"What direct managers may do for their reports (LineManagerAccess).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/line-manager-access","name":"api.v1.app.line-manager-access.update","audience":"app","section":"line-manager-access","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Turns direct-manager items on or off; keys left out keep their value.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/live-location","name":"api.v1.app.live-location.index","audience":"app","section":"live-location","permissions":["live_location.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Latest positions: branch, department, group, status (online|lost|offline|none), q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/live-location\/employees\/{employee}\/trail","name":"api.v1.app.live-location.trail","audience":"app","section":"live-location","permissions":["live_location.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One employee's trail on a day (date, default today).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[{"name":"date","rules":"nullable|date","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/live-location\/export","name":"api.v1.app.live-location.export","audience":"app","section":"live-location","permissions":["live_location.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"CSV: the positions by branch, department, group, status, q; or one employee's trail on date. Logged as an api export.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee","rules":"nullable|integer","required":false},{"name":"date","rules":"nullable|date","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/live-location\/views","name":"api.v1.app.live-location.views","audience":"app","section":"live-location","permissions":["live_location.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Who looked at whose location (newest first).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/loans","name":"api.v1.app.payroll.loans","audience":"app","section":"loans","permissions":["payroll.loans.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Loans in my scope: employee_id, status (active | settled).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/loans\/{loan}","name":"api.v1.app.payroll.loans.show","audience":"app","section":"loans","permissions":["payroll.loans.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One loan with its installment schedule (made on first read for a loan from before schedules were kept).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"loan","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/loans","name":"api.v1.app.payroll.loans.store","audience":"app","section":"loans","permissions":["payroll.loans.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"loan_type_id","rules":"nullable|integer|exists:loan_types,id","required":false},{"name":"amount","rules":"required|numeric|min:1","required":true},{"name":"installments","rules":"required_without:installment_amount|nullable|integer|min:1|max:120","required":false},{"name":"installment_amount","rules":"nullable|numeric|gt:0|lte:amount","required":false},{"name":"effective_date","rules":"nullable|date","required":false},{"name":"first_installment_date","rules":"nullable|date|'after_or_equal:' . \\App\\Support\\PayrollMonth::open() . '-01'","required":false},{"name":"start_month","rules":"required_without:first_installment_date|nullable|date_format:Y-m|'after_or_equal:' . \\App\\Support\\PayrollMonth::open()","required":false},{"name":"reason","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"payout","rules":"nullable|in:off_cycle,payroll","required":false},{"name":"currency","rules":"nullable|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,ZWL","required":false},{"name":"attachments","rules":"array|max:10","required":false},{"name":"attachments.*","rules":"file|max:10240|mimes:mp4,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zip","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/loans\/{loan}","name":"api.v1.app.payroll.loans.destroy","audience":"app","section":"loans","permissions":["payroll.loans.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"loan","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/loans\/{loan}\/reschedule","name":"api.v1.app.payroll.loans.reschedule","audience":"app","section":"loans","permissions":["payroll.loans.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Reschedule: installment_amount or number_of_payments for what is still owed.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"loan","type":"integer","pattern":null}],"fields":[{"name":"installment_amount","rules":"required_without:number_of_payments|nullable|numeric|gt:0","required":false},{"name":"number_of_payments","rules":"required_without:installment_amount|nullable|integer|min:1|max:120","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/loans\/{loan}\/installments\/{installment}\/{action}","name":"api.v1.app.payroll.loans.installment","audience":"app","section":"loans","permissions":["payroll.loans.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Skip an unpaid installment (it moves to the end) or record it as paid in cash.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"loan","type":"integer","pattern":null},{"name":"installment","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"skip|pay-cash"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/location\/policy","name":"api.v1.app.location.policy","audience":"app","section":"location","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The signed-in employee's policy: required, mode, interval_seconds, distance_meters, max_silence_minutes, reason_en, reason_ar, last_ping.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/location\/pings","name":"api.v1.app.location.pings","audience":"app","section":"location","permissions":["self.live_location"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A batch of pings: device {id, platform, app_version}, points [{lat, lng, accuracy, speed, heading, altitude, recorded_at, mocked, battery, elapsed_ms}].","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"device","rules":"required|array","required":true},{"name":"device.id","rules":"required|string|max:100","required":true},{"name":"device.platform","rules":"nullable|string|max:20","required":false},{"name":"device.app_version","rules":"nullable|string|max:40","required":false},{"name":"points","rules":"required|array|min:1|max:500","required":true},{"name":"points.*.lat","rules":"required|numeric|between:-90,90","required":true},{"name":"points.*.lng","rules":"required|numeric|between:-180,180","required":true},{"name":"points.*.accuracy","rules":"nullable|numeric|min:0|max:100000","required":false},{"name":"points.*.speed","rules":"nullable|numeric|min:0|max:1000","required":false},{"name":"points.*.heading","rules":"nullable|numeric|between:0,360","required":false},{"name":"points.*.altitude","rules":"nullable|numeric|between:-1000,20000","required":false},{"name":"points.*.recorded_at","rules":"required|date","required":true},{"name":"points.*.mocked","rules":"nullable|boolean","required":false},{"name":"points.*.battery","rules":"nullable|integer|between:0,100","required":false},{"name":"points.*.elapsed_ms","rules":"nullable|integer|min:0","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/map-tiles","name":"api.v1.app.map-tiles","audience":"app","section":"map-tiles","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"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.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/mass-actions","name":"api.v1.app.mass-actions.index","audience":"app","section":"mass-actions","permissions":["employees.edit","payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET mass-actions: the history.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/mass-actions\/{tab}","name":"api.v1.app.mass-actions.apply","audience":"app","section":"mass-actions","permissions":[],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"POST mass-actions\/{tab}: the tab's fields and employee_ids; dry_run=1 only previews.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"tab","type":"string","pattern":"personal|professional|financial"}],"fields":[{"name":"employee_ids","rules":"required|array|min:1|max:1000","required":true},{"name":"employee_ids.*","rules":"integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/two-factor","name":"api.v1.app.me.two-factor","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"My two-step verification: on or off, required or not, recovery codes left.","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/two-factor","name":"api.v1.app.me.two-factor.start","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"Starts setting it up: the key and the otpauth:\/\/ link for the authenticator app (only to the user themself).","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/two-factor\/confirm","name":"api.v1.app.me.two-factor.confirm","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"Confirms with a code from the app; the recovery codes are returned this once.","parameters":[],"fields":[{"name":"code","rules":"required|string|max:20","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/me\/two-factor","name":"api.v1.app.me.two-factor.disable","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[{"name":"password","rules":"required|string","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/two-factor\/recovery-codes","name":"api.v1.app.me.two-factor.recovery-codes","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[{"name":"password","rules":"required|string","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/me","name":"api.v1.app.me","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/me\/password","name":"api.v1.app.me.password","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/me\/preferences","name":"api.v1.app.me.preferences","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/list-columns","name":"api.v1.app.me.list-columns","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"Show \/ hide columns: every list with the columns I hid (list= one list).","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/me\/list-columns\/{list}","name":"api.v1.app.me.list-columns.update","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"Saves the columns I hide in a list: hidden[] (empty shows them all).","parameters":[{"name":"list","type":"string","pattern":"[a-z_.]+"}],"fields":[{"name":"hidden","rules":"present|array","required":false},{"name":"hidden.*","rules":"string|max:60","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/deletion-request","name":"api.v1.app.me.deletion-request","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"This person's account-deletion requests, newest first (docs\/account-deletion.md).","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/deletion-request","name":"api.v1.app.me.deletion-request.store","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"Asks for the account and its data to be deleted: reason (optional). HR of each company and the Mihnaro team are told.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/devices","name":"api.v1.app.me.devices","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"GET me\/devices: the person's own phones, their IPs and sign-in activity (docs\/platform-control.md, \"Phone activity\").","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/connected-apps","name":"api.v1.app.me.connected-apps","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/me\/connected-apps\/{grant}","name":"api.v1.app.me.connected-apps.destroy","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"grant","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/connected-apps\/tokens","name":"api.v1.app.me.connected-apps.tokens.store","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"A token by hand, for a client without OAuth. Its value is in this answer only.","parameters":[],"fields":[{"name":"company_id","rules":"required|integer","required":true},{"name":"name","rules":"required|string|max:80","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/me\/connected-apps\/tokens\/{token}","name":"api.v1.app.me.connected-apps.tokens.destroy","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"token","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/push-tokens","name":"api.v1.app.me.push-tokens","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"The phones this person gets push notices on (docs\/mobile-app.md).","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/push-tokens","name":"api.v1.app.me.push-tokens.store","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[],"fields":[{"name":"platform","rules":"required|in:ios,android","required":true},{"name":"provider","rules":"required|in:fcm,apns","required":true},{"name":"token","rules":"required|string|max:512|$input['provider'] === 'apns' ? 'regex:\/^[0-9a-f]{64,200}$\/' : 'regex:\/^[A-Za-z0...","required":true},{"name":"device_name","rules":"nullable|string|max:80","required":false},{"name":"apns_environment","rules":"nullable|in:production,sandbox","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/me\/push-tokens","name":"api.v1.app.me.push-tokens.destroy","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[{"name":"token","rules":"required|string|max:512","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/debug","name":"api.v1.app.me.debug","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"GET me\/debug: {on, until, send_requested}. Asked at the 15th tap and at each open; never cached.","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/debug\/reports","name":"api.v1.app.me.debug.reports","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":6,"summary":"POST me\/debug\/reports: the phone's state and recent log, redacted. 403 while debug mode is off for this account.","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/me\/device-context","name":"api.v1.app.me.device-context","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":30,"summary":"","parameters":[],"fields":[{"name":"snapshots","rules":"required|array|min:1|max:20","required":true},{"name":"snapshots.*.trigger","rules":"required|in:open,resume,sign_in,punch","required":true},{"name":"snapshots.*.open_id","rules":"nullable|string|max:64|regex:\/^[A-Za-z0-9._:\\-]+$\/","required":false},{"name":"snapshots.*.company_id","rules":"nullable|integer","required":false},{"name":"snapshots.*.location","rules":"nullable|array","required":false},{"name":"snapshots.*.context","rules":"nullable|array","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/me\/appearance","name":"api.v1.app.me.appearance","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/me\/appearance","name":"api.v1.app.me.appearance.update","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/me\/appearance","name":"api.v1.app.me.appearance.reset","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/permissions","name":"api.v1.app.me.permissions","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"What the token's user may do here, and where.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/access","name":"api.v1.app.me.access","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"What the mobile app shows: modules, permissions with their scope, and the features they open (MyAccess).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/locale","name":"api.v1.app.me.locale","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/profile","name":"api.v1.app.me.profile","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"My profile in this company (Mawarid's profile page).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/boardings","name":"api.v1.app.boardings.mine","audience":"app","section":"me","permissions":["self.workflows"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboard-sections","name":"api.v1.app.dashboard.sections","audience":"app","section":"me","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET \/ PUT me\/dashboard-sections: the HR dashboard sections this person shows ({key: bool}); PUT with show [keys].","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/home-widgets","name":"api.v1.app.home-widgets","audience":"app","section":"me","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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\u20134}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/report-files","name":"api.v1.app.report-files.index","audience":"app","section":"me","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET me\/report-files: the person's own background files.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/report-files\/{file}","name":"api.v1.app.report-files.show","audience":"app","section":"me","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"file","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/report-files\/{file}\/download","name":"api.v1.app.report-files.download","audience":"app","section":"me","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"file","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/attendance","name":"api.v1.app.attendance.me","audience":"app","section":"me","permissions":["self.attendance.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"My attendance: a month of days and today's records.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/clock","name":"api.v1.app.attendance.clock","audience":"app","section":"me","permissions":["self.clock"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The dashboard's clock card: today's shift, in or out, and what clocking needs here.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/face","name":"api.v1.app.me.face","audience":"app","section":"me","permissions":["self.face"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"What the consent screen shows: the text, the answer so far, and whether a template exists.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/face\/consent","name":"api.v1.app.me.face.consent","audience":"app","section":"me","permissions":["self.face"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"decision","rules":"required|in:granted,refused,withdrawn","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/face\/enrol","name":"api.v1.app.me.face.enrol","audience":"app","section":"me","permissions":["self.face"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"The biometric photo, before any punch (\u00a720). Multipart: face_token, face_frames[] (3 JPEGs), face_mirrored.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/face\/challenge","name":"api.v1.app.me.face.challenge","audience":"app","section":"me","permissions":["self.clock","self.presence"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/device-key","name":"api.v1.app.me.device-key","audience":"app","section":"me","permissions":["self.clock"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"The phone's new key: public_key (base64 of SubjectPublicKeyInfo or the X9.63 point), device_id, platform.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"public_key","rules":"required|string|max:1000","required":true},{"name":"device_id","rules":"required|string|max:100","required":true},{"name":"platform","rules":"nullable|in:ios,android","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/presence-check","name":"api.v1.app.me.presence","audience":"app","section":"me","permissions":["self.presence"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/presence-check\/{check}","name":"api.v1.app.me.presence.respond","audience":"app","section":"me","permissions":["self.presence"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"Multipart: face_token, face_frames[] (3 JPEGs), face_mirrored. Without consent, an empty body counts as unverified.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"check","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/schedule","name":"api.v1.app.attendance.schedule","audience":"app","section":"me","permissions":["self.schedule"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/team-calendar","name":"api.v1.app.team-calendar","audience":"app","section":"me","permissions":["self.team_calendar"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET me\/team-calendar?month=YYYY-MM: who is off or remote, holidays and events (MyCalendar).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/requests","name":"api.v1.app.requests.mine","audience":"app","section":"me","permissions":["self.requests.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"My requests: status (all by default).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/performance","name":"api.v1.app.performance.mine","audience":"app","section":"me","permissions":["self.performance.view","self.performance.review","self.performance.goals"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"My evaluations, the reviews waiting for me, my goals, my feedback requests and feedback forms.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/assessments","name":"api.v1.app.assessments.mine","audience":"app","section":"me","permissions":["self.assessments"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The signed-in employee's own tests, with the page to take each.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/payslips","name":"api.v1.app.payroll.mine","audience":"app","section":"me","permissions":["self.payslips.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"My payslips: the approved runs only.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/earned-wage","name":"api.v1.app.earned-wage.me","audience":"app","section":"me","permissions":["self.earned_wage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/leaves","name":"api.v1.app.leaves.mine","audience":"app","section":"me","permissions":["self.leaves.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"My balances this year (or ?year) and my requests.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/notifications","name":"api.v1.app.notifications.index","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"GET me\/notifications?unread=1&category=&page=","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/notifications\/read-all","name":"api.v1.app.notifications.read-all","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/notifications\/{notice}\/read","name":"api.v1.app.notifications.read","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"POST me\/notifications\/{notice}\/read (unread=1 to mark it unread again)","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"notice","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/notification-preferences","name":"api.v1.app.notifications.preferences","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/notification-preferences","name":"api.v1.app.notifications.preferences.update","audience":"app","section":"me","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"PUT me\/notification-preferences {categories: {requests: {in_app, email, whatsapp}, ...}}","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards","name":"api.v1.app.my-dashboards.index","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards","name":"api.v1.app.my-dashboards.store","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(60)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(60)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards\/{dashboard}","name":"api.v1.app.my-dashboards.show","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET me\/dashboards\/{dashboard}: with every widget's figure.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"dashboard","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards\/{dashboard}","name":"api.v1.app.my-dashboards.update","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"dashboard","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(60)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(60)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards\/{dashboard}","name":"api.v1.app.my-dashboards.destroy","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"dashboard","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards\/{dashboard}\/order","name":"api.v1.app.my-dashboards.order","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"PUT me\/dashboards\/{dashboard}\/order {ids: [...]}","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"dashboard","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards\/{dashboard}\/interval","name":"api.v1.app.my-dashboards.interval","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"dashboard","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards-order","name":"api.v1.app.my-dashboards.reorder","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboards\/{dashboard}\/widgets","name":"api.v1.app.my-dashboards.widgets.store","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"dashboard","type":"integer","pattern":null}],"fields":[{"name":"metric","rules":"$widget ? 'sometimes' : 'required'|Rule::in(array_keys(self::METRICS))","required":false},{"name":"title","rules":"sometimes|nullable|array","required":false},{"name":"title.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(60)","required":false},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(60)","required":false},{"name":"chart","rules":"sometimes|nullable|Rule::in($metric === 'report' ? array_keys(\\App\\Support\\CommandCenter::CHARTS) :...","required":false},{"name":"width","rules":"sometimes|integer|in:1,2,3,4","required":false},{"name":"report_type","rules":"required|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_pay","required":true},{"name":"breakdown","rules":"nullable|in:none,age_group,gender,nationality,service_period,work_type","required":false},{"name":"level","rules":"required|in:company,branch,work_location,department,section,group,project,job_role","required":true},{"name":"unit_ids","rules":"$hasUnits ? 'required' : 'nullable'|array","required":false},{"name":"unit_ids.*","rules":"integer|Rule::in(array_keys(\\App\\Support\\CommandCenter::units($level)))","required":false},{"name":"interval","rules":"$intervals ? ['required', 'integer', Rule::in($intervals)] : ['nullable']","required":false},{"name":"upcoming","rules":"nullable|boolean","required":false},{"name":"options","rules":"nullable|array","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboard-widgets\/{widget}","name":"api.v1.app.my-dashboards.widgets.update","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"widget","type":"integer","pattern":null}],"fields":[{"name":"metric","rules":"$widget ? 'sometimes' : 'required'|Rule::in(array_keys(self::METRICS))","required":false},{"name":"title","rules":"sometimes|nullable|array","required":false},{"name":"title.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(60)","required":false},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(60)","required":false},{"name":"chart","rules":"sometimes|nullable|Rule::in($metric === 'report' ? array_keys(\\App\\Support\\CommandCenter::CHARTS) :...","required":false},{"name":"width","rules":"sometimes|integer|in:1,2,3,4","required":false},{"name":"report_type","rules":"required|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_pay","required":true},{"name":"breakdown","rules":"nullable|in:none,age_group,gender,nationality,service_period,work_type","required":false},{"name":"level","rules":"required|in:company,branch,work_location,department,section,group,project,job_role","required":true},{"name":"unit_ids","rules":"$hasUnits ? 'required' : 'nullable'|array","required":false},{"name":"unit_ids.*","rules":"integer|Rule::in(array_keys(\\App\\Support\\CommandCenter::units($level)))","required":false},{"name":"interval","rules":"$intervals ? ['required', 'integer', Rule::in($intervals)] : ['nullable']","required":false},{"name":"upcoming","rules":"nullable|boolean","required":false},{"name":"options","rules":"nullable|array","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/me\/dashboard-widgets\/{widget}","name":"api.v1.app.my-dashboards.widgets.destroy","audience":"app","section":"me","permissions":["self.dashboard"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"widget","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/miscellaneous-requests","name":"api.v1.app.misc-requests.index","audience":"app","section":"miscellaneous-requests","permissions":["requests.miscellaneous.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/miscellaneous-requests\/{employeeRequest}","name":"api.v1.app.misc-requests.update","audience":"app","section":"miscellaneous-requests","permissions":["requests.miscellaneous.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/miscellaneous-requests\/{employeeRequest}","name":"api.v1.app.misc-requests.destroy","audience":"app","section":"miscellaneous-requests","permissions":["requests.miscellaneous.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/nine-box\/employees\/{employee}","name":"api.v1.app.nine-box.employee","audience":"app","section":"nine-box","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/nine-box","name":"api.v1.app.nine-box.index","audience":"app","section":"nine-box","permissions":["performance.view","performance.manage","performance.nine_box.view","performance.nine_box.assess"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"cycle_id, branch_id, department_id, position_id; box narrows to one box. format=csv downloads it.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/notification-events","name":"api.v1.app.notifications.events","audience":"app","section":"notification-events","permissions":["notifications.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"GET notification-events?kind=&category=&q= \u2014 which events notify whom (notifications.manage).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/notification-log","name":"api.v1.app.notifications.log","audience":"app","section":"notification-log","permissions":["notifications.log.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET notification-log?from=&to=&category=&channel=&status=&person=&branch=&kind=&actor=&q=&per_page=&summary=1","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/notification-log\/export","name":"api.v1.app.notifications.log.export","audience":"app","section":"notification-log","permissions":["notifications.log.view"],"modules":[],"rate_limit_per_minute":20,"summary":"GET notification-log\/export?format=csv|xlsx&\u2026filters, or with send= one send's recipients.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"format","rules":"nullable|in:csv,xlsx","required":false},{"name":"send","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/notification-log\/{send}","name":"api.v1.app.notifications.log.show","audience":"app","section":"notification-log","permissions":["notifications.log.view"],"modules":[],"rate_limit_per_minute":60,"summary":"GET notification-log\/{send}: the send with every person in scope and what each channel answered.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"send","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/notification-setup","name":"api.v1.app.notifications.setup","audience":"app","section":"notification-setup","permissions":["notifications.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/notification-setup","name":"api.v1.app.notifications.setup.update","audience":"app","section":"notification-setup","permissions":["notifications.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"PUT notification-setup {categories_off, receiver_emails, email_everyone, reminders}","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/objectives\/{objective}","name":"api.v1.app.performance.objectives.update","audience":"app","section":"objectives","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"objective","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/objectives\/{objective}","name":"api.v1.app.performance.objectives.destroy","audience":"app","section":"objectives","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"objective","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/off-cycle-settlements","name":"api.v1.app.payroll.off-cycle.settle","audience":"app","section":"off-cycle-settlements","permissions":["payroll.transactions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ids: unpaid off-cycle transactions marked paid.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"ids","rules":"required|array|min:1","required":true},{"name":"ids.*","rules":"integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/okr-templates","name":"api.v1.app.performance.okr-templates.store","audience":"app","section":"okr-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}; objectives are added one by one.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/okr-templates\/{template}","name":"api.v1.app.performance.okr-templates.update","audience":"app","section":"okr-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}; objectives are added one by one.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/okr-templates\/{template}","name":"api.v1.app.performance.okr-templates.destroy","audience":"app","section":"okr-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/okr-templates\/{template}\/objectives","name":"api.v1.app.performance.okr-templates.objectives.store","audience":"app","section":"okr-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An objective (as for an employee's OKRs) added, or replaced at index.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/okr-templates\/{template}\/objectives\/{index}","name":"api.v1.app.performance.okr-templates.objectives.update","audience":"app","section":"okr-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An objective (as for an employee's OKRs) added, or replaced at index.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null},{"name":"index","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/okr-templates\/{template}\/objectives\/{index}","name":"api.v1.app.performance.okr-templates.objectives.destroy","audience":"app","section":"okr-templates","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null},{"name":"index","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/okrs\/mass-assign","name":"api.v1.app.performance.okrs.mass-assign","audience":"app","section":"okrs","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"template_id, evaluations (ids).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/org-chart","name":"api.v1.app.directory.chart","audience":"app","section":"org-chart","permissions":["self.org_chart","employees.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/org-units","name":"api.v1.app.org-units.index","audience":"app","section":"org-units","permissions":["structure.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/org-units","name":"api.v1.app.org-units.store","audience":"app","section":"org-units","permissions":["structure.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"type","rules":"$unit ? 'sometimes' : 'required'|in:work_location,department,section,project,hierarchy_group,business_unit,division,segment","required":false},{"name":"name","rules":"$unit ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$unit ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"code","rules":"nullable|alpha_dash|max:30","required":false},{"name":"establishment_number","rules":"nullable|string|max:60","required":false},{"name":"subsidiary_id","rules":"nullable|string|max:60","required":false},{"name":"external_ref","rules":"nullable|string|max:64","required":false},{"name":"logo","rules":"nullable|image|mimes:png,jpg,jpeg,webp,svg|max:10240","required":false},{"name":"remove_logo","rules":"sometimes|boolean","required":false},{"name":"establishment_name","rules":"nullable|string|max:150","required":false},{"name":"governance_location","rules":"nullable|string|max:100","required":false},{"name":"ss_number","rules":"nullable|string|max:60","required":false},{"name":"tax_number","rules":"nullable|string|max:60","required":false},{"name":"address","rules":"nullable|string|max:255","required":false},{"name":"po_box","rules":"nullable|string|max:30","required":false},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"parent_id","rules":"$type === 'section' && !$unit?->parent_id ? 'required' : 'nullable'|integer|exists:org_units,id","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"sort_order","rules":"sometimes|integer|min:0","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/org-units\/inline","name":"api.v1.app.org-units.inline","audience":"app","section":"org-units","permissions":["structure.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Adds a missing level for an employee's job details, where the branch allows it (AddOrgLevel).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"type","rules":"required|in:work_location,department,section,project,hierarchy_group,business_unit,division,segment","required":true},{"name":"employee_id","rules":"nullable|integer|exists:employees,id","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/org-units\/{unit}","name":"api.v1.app.org-units.update","audience":"app","section":"org-units","permissions":["structure.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"unit","type":"integer","pattern":null}],"fields":[{"name":"type","rules":"$unit ? 'sometimes' : 'required'|in:work_location,department,section,project,hierarchy_group,business_unit,division,segment","required":false},{"name":"name","rules":"$unit ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$unit ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"code","rules":"nullable|alpha_dash|max:30","required":false},{"name":"establishment_number","rules":"nullable|string|max:60","required":false},{"name":"subsidiary_id","rules":"nullable|string|max:60","required":false},{"name":"external_ref","rules":"nullable|string|max:64","required":false},{"name":"logo","rules":"nullable|image|mimes:png,jpg,jpeg,webp,svg|max:10240","required":false},{"name":"remove_logo","rules":"sometimes|boolean","required":false},{"name":"establishment_name","rules":"nullable|string|max:150","required":false},{"name":"governance_location","rules":"nullable|string|max:100","required":false},{"name":"ss_number","rules":"nullable|string|max:60","required":false},{"name":"tax_number","rules":"nullable|string|max:60","required":false},{"name":"address","rules":"nullable|string|max:255","required":false},{"name":"po_box","rules":"nullable|string|max:30","required":false},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"parent_id","rules":"$type === 'section' && !$unit?->parent_id ? 'required' : 'nullable'|integer|exists:org_units,id","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"sort_order","rules":"sometimes|integer|min:0","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/org-units\/{unit}","name":"api.v1.app.org-units.destroy","audience":"app","section":"org-units","permissions":["structure.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"unit","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/overtime-types","name":"api.v1.app.overtime-types.index","audience":"app","section":"overtime-types","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/overtime-types","name":"api.v1.app.overtime-types.store","audience":"app","section":"overtime-types","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"applies_on","rules":"required|in:any,workday,weekend,holiday","required":true},{"name":"rate","rules":"required|numeric|min:0|max:20","required":true},{"name":"allowance_method","rules":"required|in:hourly,daily","required":true},{"name":"allowances_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"allowance_type_ids","rules":"nullable|array","required":false},{"name":"allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"transaction_type_id","rules":"nullable|integer|exists:transaction_types,id","required":false},{"name":"limit_hours","rules":"nullable|numeric|min:0|max:744","required":false},{"name":"limit_period","rules":"nullable|in:day,week,month","required":false},{"name":"exceptions","rules":"nullable|array","required":false},{"name":"exceptions.*.day","rules":"nullable|in:0,1,2,3,4,5,6,off","required":false},{"name":"exceptions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"exceptions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"exceptions.*.basic_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"exceptions.*.allowances_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"exceptions.*.method","rules":"nullable|in:hourly,daily","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/overtime-types\/{type}","name":"api.v1.app.overtime-types.update","audience":"app","section":"overtime-types","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"applies_on","rules":"required|in:any,workday,weekend,holiday","required":true},{"name":"rate","rules":"required|numeric|min:0|max:20","required":true},{"name":"allowance_method","rules":"required|in:hourly,daily","required":true},{"name":"allowances_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"allowance_type_ids","rules":"nullable|array","required":false},{"name":"allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"transaction_type_id","rules":"nullable|integer|exists:transaction_types,id","required":false},{"name":"limit_hours","rules":"nullable|numeric|min:0|max:744","required":false},{"name":"limit_period","rules":"nullable|in:day,week,month","required":false},{"name":"exceptions","rules":"nullable|array","required":false},{"name":"exceptions.*.day","rules":"nullable|in:0,1,2,3,4,5,6,off","required":false},{"name":"exceptions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"exceptions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"exceptions.*.basic_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"exceptions.*.allowances_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"exceptions.*.method","rules":"nullable|in:hourly,daily","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/overtime-types\/{type}","name":"api.v1.app.overtime-types.destroy","audience":"app","section":"overtime-types","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/overtimes","name":"api.v1.app.overtimes.index","audience":"app","section":"overtimes","permissions":["payroll.overtime.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Overtimes in scope, newest first: employee_id, status, overtime_type, from \/ to (the overtime date).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/overtimes","name":"api.v1.app.overtimes.store","audience":"app","section":"overtimes","permissions":["payroll.overtime.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"effective_date","rules":"nullable|date","required":false},{"name":"out_of_payroll","rules":"nullable|boolean","required":false},{"name":"attachment","rules":"nullable|file|max:10240|mimes:mp4,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zip","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/overtimes\/{overtime}","name":"api.v1.app.overtimes.update","audience":"app","section":"overtimes","permissions":["payroll.overtime.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"overtime","type":"integer","pattern":null}],"fields":[{"name":"effective_date","rules":"nullable|date","required":false},{"name":"out_of_payroll","rules":"nullable|boolean","required":false},{"name":"attachment","rules":"nullable|file|max:10240|mimes:mp4,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zip","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/overtimes\/convert","name":"api.v1.app.overtimes.convert","audience":"app","section":"overtimes","permissions":["payroll.overtime.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Overtime \u2192 time off: from, to, leave_type_id, rate (%), effective_date, minimum_hours, combined, notes, department, work_location, section, main_project.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"from","rules":"required|date","required":true},{"name":"to","rules":"required|date|after_or_equal:from","required":true},{"name":"leave_type_id","rules":"required|integer","required":true},{"name":"rate","rules":"required|numeric|min:0.01|max:1000","required":true},{"name":"effective_date","rules":"required|date","required":true},{"name":"minimum_hours","rules":"required|numeric|min:0","required":true},{"name":"combined","rules":"nullable|boolean","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"department","rules":"nullable|integer","required":false},{"name":"work_location","rules":"nullable|integer","required":false},{"name":"section","rules":"nullable|integer","required":false},{"name":"main_project","rules":"nullable|integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/overtimes\/batch-as-income","name":"api.v1.app.overtimes.batch-as-income","audience":"app","section":"overtimes","permissions":["payroll.overtime.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An overtime batch as income: employee_id, transaction_type_id (an earning), overtime_type_id, hours, date, description.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"transaction_type_id","rules":"required|exists:transaction_types,id","required":true},{"name":"overtime_type_id","rules":"nullable|integer","required":false},{"name":"hours","rules":"required|numeric|gt:0|max:744","required":true},{"name":"date","rules":"required|date","required":true},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(190)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/part-time-assignments","name":"api.v1.app.part-time.index","audience":"app","section":"part-time-assignments","permissions":["payroll.part_time.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Assignments in scope, newest first: employee_id, type (transaction type id), effective (a date), from \/ to, and the org filters.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/part-time-assignments","name":"api.v1.app.part-time.store","audience":"app","section":"part-time-assignments","permissions":["payroll.part_time.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"transaction_type_id","rules":"required|exists:transaction_types,id","required":true},{"name":"amount","rules":"nullable|numeric|min:0","required":false},{"name":"recurring_value","rules":"nullable|numeric|min:0","required":false},{"name":"net","rules":"nullable|boolean","required":false},{"name":"effective_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:effective_date","required":false},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"attachment","rules":"nullable|file|max:10240|mimes:pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zip","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/part-time-assignments\/{assignment}","name":"api.v1.app.part-time.destroy","audience":"app","section":"part-time-assignments","permissions":["payroll.part_time.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/part-time-assignments\/{assignment}","name":"api.v1.app.part-time.update","audience":"app","section":"part-time-assignments","permissions":["payroll.part_time.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[{"name":"transaction_type_id","rules":"required|exists:transaction_types,id","required":true},{"name":"amount","rules":"nullable|numeric|min:0","required":false},{"name":"recurring_value","rules":"nullable|numeric|min:0","required":false},{"name":"net","rules":"nullable|boolean","required":false},{"name":"effective_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:effective_date","required":false},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"attachment","rules":"nullable|file|max:10240|mimes:pdf,doc,docx,xls,xlsx,ppt,pptx,txt,csv,jpeg,png,gif,jpg,zip","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll\/{month}","name":"api.v1.app.payroll.month","audience":"app","section":"payroll","permissions":["payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Mawarid's GET payroll\/{YYYY-MM}: the month's approved regular run with its payslips (404 until approved).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"month","type":"string","pattern":"[0-9]{4}-[0-9]{2}"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-lists\/{list}","name":"api.v1.app.payroll.lists","audience":"app","section":"payroll-lists","permissions":["payroll.view","payroll.manage","payroll.business_trips.view","payroll.expenses.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"air-tickets, business-trips, expenses or missing-punches: status, from, to, travel_policy, travel_from, travel_to, expense_name; paged.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"list","type":"string","pattern":"air-tickets|business-trips|expenses|missing-punches"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-rules\/{section}","name":"api.v1.app.payroll-rules.index","audience":"app","section":"payroll-rules","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A rules list; bank-accounts can be filtered by branch_id.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-rules\/{section}","name":"api.v1.app.payroll-rules.store","audience":"app","section":"payroll-rules","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates"}],"fields":[{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"employee_percent","rules":"required|numeric|min:0|max:100","required":true},{"name":"employer_percent","rules":"required|numeric|min:0|max:100","required":true},{"name":"salary_from","rules":"nullable|numeric|min:0","required":false},{"name":"salary_to","rules":"nullable|numeric|min:0|gte:salary_from","required":false},{"name":"ceiling","rules":"nullable|numeric|min:0","required":false},{"name":"floor","rules":"nullable|numeric|min:0","required":false},{"name":"base","rules":"required|in:basic,gross","required":true},{"name":"external_ref","rules":"nullable|string|max:64","required":false},{"name":"min_work_days","rules":"nullable|integer|min:0|max:31","required":false},{"name":"effective_from","rules":"required|date","required":true},{"name":"effective_to","rules":"nullable|date|after_or_equal:effective_from","required":false},{"name":"percent","rules":"required|numeric|min:0|max:1000","required":true},{"name":"distribution","rules":"required|in:once,monthly","required":true},{"name":"pay_month","rules":"required|integer|between:1,12","required":true},{"name":"country","rules":"nullable|string|max:60","required":false},{"name":"bank_name","rules":"required|string|max:150","required":true},{"name":"bank_branch","rules":"nullable|string|max:150","required":false},{"name":"account_name","rules":"nullable|string|max:150","required":false},{"name":"account_number","rules":"required|string|max:60","required":true},{"name":"iban","rules":"nullable|string|max:60","required":false},{"name":"exchange_account","rules":"nullable|string|max:60","required":false},{"name":"establishment_number","rules":"nullable|string|max:60","required":false},{"name":"currency","rules":"nullable|alpha|size:3","required":false},{"name":"branch_id","rules":"nullable|exists:branches,id","required":false},{"name":"bank_export_template_id","rules":"nullable|exists:bank_export_templates,id","required":false},{"name":"brackets","rules":"$rows ? 'nullable' : 'required'|string|max:2000|regex:\/^(\\s*\\d+(\\.\\d+)?\\s*:\\s*\\d+(\\.\\d+)?\\s*(\\r?\\n|$))+$\/","required":false},{"name":"bracket_period","rules":"nullable|in:monthly,annual","required":false},{"name":"bracket_rows","rules":"array|max:30","required":false},{"name":"bracket_rows.*.min","rules":"nullable|numeric|min:0","required":false},{"name":"bracket_rows.*.max","rules":"nullable|numeric|min:0","required":false},{"name":"bracket_rows.*.rate","rules":"required|numeric|min:0|max:100","required":true},{"name":"bracket_rows.*.extra_exemption","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"personal_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"family_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"other_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"kind","rules":"required|in:bank,wps","required":true},{"name":"bank","rules":"nullable|string|max:150","required":false},{"name":"extension","rules":"required|in:csv,txt,sif,xlsx","required":true},{"name":"delimiter","rules":"required|in:,,;,|,tab","required":true},{"name":"header_lines","rules":"nullable|string|max:2000","required":false},{"name":"footer_lines","rules":"nullable|string|max:2000","required":false},{"name":"columns_text","rules":"required|string|max:4000","required":true},{"name":"date_format","rules":"required|string|max:20","required":true},{"name":"amount_decimals","rules":"required|integer|between:0,4","required":true},{"name":"slip_type","rules":"required|in:salary,settlement","required":true},{"name":"language","rules":"required|in:en,ar|unique:salary_slip_templates","required":true},{"name":"header","rules":"nullable|string|max:5000","required":false},{"name":"footer","rules":"nullable|string|max:5000","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-rules\/{section}\/{id}","name":"api.v1.app.payroll-rules.update","audience":"app","section":"payroll-rules","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The whole record is sent, as on the screen (a switch left out is off).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates"},{"name":"id","type":"integer","pattern":null}],"fields":[{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"employee_percent","rules":"required|numeric|min:0|max:100","required":true},{"name":"employer_percent","rules":"required|numeric|min:0|max:100","required":true},{"name":"salary_from","rules":"nullable|numeric|min:0","required":false},{"name":"salary_to","rules":"nullable|numeric|min:0|gte:salary_from","required":false},{"name":"ceiling","rules":"nullable|numeric|min:0","required":false},{"name":"floor","rules":"nullable|numeric|min:0","required":false},{"name":"base","rules":"required|in:basic,gross","required":true},{"name":"external_ref","rules":"nullable|string|max:64","required":false},{"name":"min_work_days","rules":"nullable|integer|min:0|max:31","required":false},{"name":"effective_from","rules":"required|date","required":true},{"name":"effective_to","rules":"nullable|date|after_or_equal:effective_from","required":false},{"name":"percent","rules":"required|numeric|min:0|max:1000","required":true},{"name":"distribution","rules":"required|in:once,monthly","required":true},{"name":"pay_month","rules":"required|integer|between:1,12","required":true},{"name":"country","rules":"nullable|string|max:60","required":false},{"name":"bank_name","rules":"required|string|max:150","required":true},{"name":"bank_branch","rules":"nullable|string|max:150","required":false},{"name":"account_name","rules":"nullable|string|max:150","required":false},{"name":"account_number","rules":"required|string|max:60","required":true},{"name":"iban","rules":"nullable|string|max:60","required":false},{"name":"exchange_account","rules":"nullable|string|max:60","required":false},{"name":"establishment_number","rules":"nullable|string|max:60","required":false},{"name":"currency","rules":"nullable|alpha|size:3","required":false},{"name":"branch_id","rules":"nullable|exists:branches,id","required":false},{"name":"bank_export_template_id","rules":"nullable|exists:bank_export_templates,id","required":false},{"name":"brackets","rules":"$rows ? 'nullable' : 'required'|string|max:2000|regex:\/^(\\s*\\d+(\\.\\d+)?\\s*:\\s*\\d+(\\.\\d+)?\\s*(\\r?\\n|$))+$\/","required":false},{"name":"bracket_period","rules":"nullable|in:monthly,annual","required":false},{"name":"bracket_rows","rules":"array|max:30","required":false},{"name":"bracket_rows.*.min","rules":"nullable|numeric|min:0","required":false},{"name":"bracket_rows.*.max","rules":"nullable|numeric|min:0","required":false},{"name":"bracket_rows.*.rate","rules":"required|numeric|min:0|max:100","required":true},{"name":"bracket_rows.*.extra_exemption","rules":"nullable|numeric|min:0|max:100","required":false},{"name":"personal_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"family_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"other_exemption","rules":"nullable|numeric|min:0","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false},{"name":"kind","rules":"required|in:bank,wps","required":true},{"name":"bank","rules":"nullable|string|max:150","required":false},{"name":"extension","rules":"required|in:csv,txt,sif,xlsx","required":true},{"name":"delimiter","rules":"required|in:,,;,|,tab","required":true},{"name":"header_lines","rules":"nullable|string|max:2000","required":false},{"name":"footer_lines","rules":"nullable|string|max:2000","required":false},{"name":"columns_text","rules":"required|string|max:4000","required":true},{"name":"date_format","rules":"required|string|max:20","required":true},{"name":"amount_decimals","rules":"required|integer|between:0,4","required":true},{"name":"slip_type","rules":"required|in:salary,settlement","required":true},{"name":"language","rules":"required|in:en,ar|unique:salary_slip_templates","required":true},{"name":"header","rules":"nullable|string|max:5000","required":false},{"name":"footer","rules":"nullable|string|max:5000","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-rules\/{section}\/{id}","name":"api.v1.app.payroll-rules.destroy","audience":"app","section":"payroll-rules","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"social-security|tax|extra-salaries|bank-accounts|bank-templates|slip-templates"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs","name":"api.v1.app.payroll.runs","audience":"app","section":"payroll-runs","permissions":["payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Payroll runs, newest first: month, kind (regular | off_cycle), status.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/review","name":"api.v1.app.payroll.runs.review","audience":"app","section":"payroll-runs","permissions":["payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}","name":"api.v1.app.payroll.runs.show","audience":"app","section":"payroll-runs","permissions":["payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A run with its payslips (the ones in my scope).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs","name":"api.v1.app.payroll.runs.store","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"month","rules":"required|date_format:Y-m","required":true},{"name":"departments","rules":"nullable|array","required":false},{"name":"departments.*","rules":"integer","required":false},{"name":"branches","rules":"nullable|array","required":false},{"name":"branches.*","rules":"integer","required":false},{"name":"employees","rules":"nullable|array","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"picks","rules":"nullable|array","required":false},{"name":"picks.*","rules":"string","required":false},{"name":"period_from","rules":"nullable|required_with:period_to|date_format:Y-m-d","required":false},{"name":"period_to","rules":"nullable|required_with:period_from|date_format:Y-m-d|after_or_equal:period_from","required":false},{"name":"batch_id","rules":"nullable|integer","required":false},{"name":"move_pending","rules":"nullable|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/off-cycle","name":"api.v1.app.payroll.runs.off-cycle","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|string|max:100","required":true},{"name":"month","rules":"required|date_format:Y-m","required":true},{"name":"percent_of_basic","rules":"required|numeric|min:1|max:1000","required":true},{"name":"picks","rules":"nullable|array","required":false},{"name":"picks.*","rules":"string","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/recalculate","name":"api.v1.app.payroll.runs.recalculate","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/approve","name":"api.v1.app.payroll.runs.approve","audience":"app","section":"payroll-runs","permissions":["payroll.runs.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Approve, or send through the salary batch approval chain: result is \"approved\" or \"sent\".","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/paid","name":"api.v1.app.payroll.runs.paid","audience":"app","section":"payroll-runs","permissions":["payroll.runs.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[{"name":"paid_at","rules":"required|date","required":true},{"name":"payment_reference","rules":"nullable|string|max:100","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/payslips\/{payslip}","name":"api.v1.app.payroll.runs.payslips.destroy","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Salary row \u2192 Delete: takes one employee out of a draft batch.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null},{"name":"payslip","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/revert","name":"api.v1.app.payroll.runs.revert-check","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Whether an approved run can go back to draft: can_revert and the reasons it can't (blockers, keyed).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}\/revert","name":"api.v1.app.payroll.runs.revert","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Revert to draft: undoes what approving did (reason optional); 422 with the blockers when refused.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-runs\/{run}","name":"api.v1.app.payroll.runs.destroy","audience":"app","section":"payroll-runs","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-settings\/{section}","name":"api.v1.app.payroll-settings.show","audience":"app","section":"payroll-settings","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"payroll-setup|in-advance|extra-salaries|tax-setup|journal|provision-setup"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/payroll-settings\/{section}","name":"api.v1.app.payroll-settings.update","audience":"app","section":"payroll-settings","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Only the fields sent change; the others keep their values.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"section","type":"string","pattern":"payroll-setup|in-advance|extra-salaries|tax-setup|journal|provision-setup"}],"fields":[{"name":"payroll_cutoff_day","rules":"nullable|integer|min:0|max:28","required":false},{"name":"day_base_absence","rules":"$base","required":false},{"name":"day_base_unpaid","rules":"$base","required":false},{"name":"day_base_overtime","rules":"$base","required":false},{"name":"day_base_vacation","rules":"$base","required":false},{"name":"absence_calc_mode","rules":"$mode","required":false},{"name":"unpaid_calc_mode","rules":"$mode","required":false},{"name":"gross_up_rate_on","rules":"required|in:net,gross","required":true},{"name":"gross_up_type_id","rules":"nullable|exists:transaction_types,id","required":false},{"name":"gross_up_excluded","rules":"array","required":false},{"name":"gross_up_excluded.*","rules":"Rule::in(array_keys(self::GROSS_UP_EXCLUSIONS))","required":false},{"name":"tax_method","rules":"required|in:monthly,accumulative,distributed","required":true},{"name":"slip_annual_types","rules":"array","required":false},{"name":"slip_annual_types.*","rules":"$leaveType","required":false},{"name":"slip_sick_types","rules":"array","required":false},{"name":"slip_sick_types.*","rules":"$leaveType","required":false},{"name":"slip_taken_types","rules":"array","required":false},{"name":"slip_taken_types.*","rules":"$leaveType","required":false},{"name":"neg_settlement_name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"neg_settlement_name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"neg_deduction_name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"neg_deduction_name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"payslip_header","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"payslip_footer","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"ss_base","rules":"nullable|in:basic,gross","required":false},{"name":"advance_calc_base","rules":"required|Rule::in(array_keys(self::advanceBases()))","required":true},{"name":"advance_slip","rules":"required|in:regular,advance","required":true},{"name":"advance_allowance_type_ids","rules":"nullable|array","required":false},{"name":"advance_allowance_type_ids.*","rules":"integer|exists:transaction_types,id","required":false},{"name":"es_reimburse_type_id","rules":"Rule::requiredIf($reimburse)|nullable|$type","required":false},{"name":"es_calc_base","rules":"required|in:30,calendar","required":true},{"name":"es_included_type_ids","rules":"nullable|array","required":false},{"name":"es_included_type_ids.*","rules":"integer|$type","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payslips\/{payslip}","name":"api.v1.app.payroll.payslips.show","audience":"app","section":"payslips","permissions":["self.payslips.view","payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A payslip: my own once its run is approved, or any in my payroll scope.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"payslip","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/payslips\/{payslip}\/pdf","name":"api.v1.app.payroll.payslips.pdf","audience":"app","section":"payslips","permissions":["self.payslips.download","payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"The payslip as a PDF file (application\/pdf), with the same access as showPayslip; lang=en|ar picks its language.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"payslip","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/payslips\/{payslip}\/adjustment","name":"api.v1.app.payroll.payslips.adjust","audience":"app","section":"payslips","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"payslip","type":"integer","pattern":null}],"fields":[{"name":"adjustment","rules":"required|numeric","required":true},{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/pending-biometrics","name":"api.v1.app.devices.pending","audience":"app","section":"pending-biometrics","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"New biometrics and conflicts waiting for HR, each with the devices a publish reaches and the ones that can't take it.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/pending-biometrics\/publish-all","name":"api.v1.app.devices.publish-all","audience":"app","section":"pending-biometrics","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Every pending biometric, one employee's (employee_id) or the ticked people's (employee_ids).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_ids","rules":"nullable|array","required":false},{"name":"employee_ids.*","rules":"integer","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/pending-biometrics\/{template}\/decide","name":"api.v1.app.devices.decide","audience":"app","section":"pending-biometrics","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"action publish (device_ids for chosen devices only), source_only or reject.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|in:publish,source_only,reject","required":true},{"name":"device_ids","rules":"nullable|array","required":false},{"name":"device_ids.*","rules":"integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/people\/{user}\/access","name":"api.v1.app.people.access","audience":"app","section":"people","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"See as them: everything a person has on the web and in the app. ?about=employee id for the field levels about one employee.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/people\/{user}\/access\/explain","name":"api.v1.app.people.access.explain","audience":"app","section":"people","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Why is this open? ?permission=key","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"integer","pattern":null}],"fields":[{"name":"permission","rules":"required|string|Rule::in(\\App\\Models\\Role::allPermissions())","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/performance-kpis","name":"api.v1.app.performance.kpis","audience":"app","section":"performance-kpis","permissions":["performance.view","performance.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/performance-setup\/{kind}","name":"api.v1.app.performance.setup.index","audience":"app","section":"performance-setup","permissions":["performance.view","performance.manage.*","performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One list of setup records: templates, general_factors, okr_templates, rating_types, competency categories, levels, competencies, position_competencies.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"kind","type":"string","pattern":"evaluation-templates|general-factor-templates|okr-templates|rating-types|categories|levels|competencies|position-competencies"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-groups","name":"api.v1.app.permission-groups.index","audience":"app","section":"permission-groups","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-groups","name":"api.v1.app.permission-groups.store","audience":"app","section":"permission-groups","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$group ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$group ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.*","rules":"nullable|string|max:300","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"branch_ids","rules":"sometimes|nullable|array","required":false},{"name":"branch_ids.*","rules":"integer|exists:branches,id","required":false},{"name":"unit_rules","rules":"sometimes|nullable|array","required":false},{"name":"unit_rules.*","rules":"array","required":false},{"name":"unit_rules.*.*","rules":"integer|exists:org_units,id","required":false},{"name":"people","rules":"sometimes|nullable|array","required":false},{"name":"people.*","rules":"integer|exists:employees,id","required":false},{"name":"manager_role_id","rules":"sometimes|$roleRule","required":false},{"name":"team_leader_role_id","rules":"sometimes|$roleRule","required":false},{"name":"employee_role_id","rules":"sometimes|$roleRule","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-groups\/{group}","name":"api.v1.app.permission-groups.update","audience":"app","section":"permission-groups","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$group ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$group ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.*","rules":"nullable|string|max:300","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"branch_ids","rules":"sometimes|nullable|array","required":false},{"name":"branch_ids.*","rules":"integer|exists:branches,id","required":false},{"name":"unit_rules","rules":"sometimes|nullable|array","required":false},{"name":"unit_rules.*","rules":"array","required":false},{"name":"unit_rules.*.*","rules":"integer|exists:org_units,id","required":false},{"name":"people","rules":"sometimes|nullable|array","required":false},{"name":"people.*","rules":"integer|exists:employees,id","required":false},{"name":"manager_role_id","rules":"sometimes|$roleRule","required":false},{"name":"team_leader_role_id","rules":"sometimes|$roleRule","required":false},{"name":"employee_role_id","rules":"sometimes|$roleRule","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-groups\/{group}","name":"api.v1.app.permission-groups.destroy","audience":"app","section":"permission-groups","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"group","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-overrides","name":"api.v1.app.permission-overrides.index","audience":"app","section":"permission-overrides","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"One person's exceptions, or everyone's.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-overrides","name":"api.v1.app.permission-overrides.store","audience":"app","section":"permission-overrides","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Sets a person's exception; both channels empty take it off (data is then null).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"user_id","rules":"required|integer","required":true},{"name":"kind","rules":"required|in:action,field","required":true},{"name":"subject","rules":"required|string|Rule::in($kind === \\App\\Models\\PermissionOverride::FIELD ? \\App\\Tenancy\\FieldAcc...","required":true},{"name":"web","rules":"nullable|Rule::in($values)","required":false},{"name":"app","rules":"nullable|Rule::in($values)","required":false},{"name":"scope","rules":"nullable|in:company,branch,department,work_location,section,project,hierarchy_group,business_unit,division,segment,reports,team,reports_of","required":false},{"name":"scope_id","rules":"nullable|integer","required":false},{"name":"reason","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/permission-overrides\/{override}","name":"api.v1.app.permission-overrides.destroy","audience":"app","section":"permission-overrides","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"override","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/plan-actions\/{action}","name":"api.v1.app.succession.actions.update","audience":"app","section":"plan-actions","permissions":["succession.manage.*","succession.successors.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Fields not sent stay as they are.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"action","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|string|max:255","required":true},{"name":"kind","rules":"nullable|in:training,mentoring,assignment,project,other","required":false},{"name":"owner_id","rules":"nullable|integer|exists:employees,id","required":false},{"name":"due_date","rules":"nullable|date","required":false},{"name":"status","rules":"nullable|in:planned,in_progress,done","required":false},{"name":"progress","rules":"nullable|integer|between:0,100","required":false},{"name":"competency_id","rules":"nullable|integer|exists:competencies,id","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/plan-actions\/{action}","name":"api.v1.app.succession.actions.destroy","audience":"app","section":"plan-actions","permissions":["succession.manage.*","succession.successors.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"action","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/position-competencies","name":"api.v1.app.performance.position-competencies.store","audience":"app","section":"position-competencies","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"position_id, competency_id, required_level, weight.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"position_id","rules":"required|integer|exists:positions,id","required":true},{"name":"competency_id","rules":"required|integer|exists:competencies,id","required":true},{"name":"required_level","rules":"required|integer|'between:1,' . \\App\\Models\\CompetencyLevel::scale()","required":true},{"name":"weight","rules":"nullable|numeric|min:0|max:100","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/position-competencies\/{link}","name":"api.v1.app.performance.position-competencies.destroy","audience":"app","section":"position-competencies","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"link","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/positions","name":"api.v1.app.positions.index","audience":"app","section":"positions","permissions":["positions.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/positions","name":"api.v1.app.positions.store","audience":"app","section":"positions","permissions":["positions.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$position ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$position ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"code","rules":"nullable|alpha_dash|max:30","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"job_description","rules":"nullable|string|max:20000","required":false},{"name":"job_role_type","rules":"sometimes|in:regular,hazardous","required":false},{"name":"company_level","rules":"sometimes|boolean","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/positions\/{position}","name":"api.v1.app.positions.update","audience":"app","section":"positions","permissions":["positions.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"position","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$position ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$position ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(120)","required":false},{"name":"code","rules":"nullable|alpha_dash|max:30","required":false},{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"job_description","rules":"nullable|string|max:20000","required":false},{"name":"job_role_type","rules":"sometimes|in:regular,hazardous","required":false},{"name":"company_level","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/potential-assessments","name":"api.v1.app.nine-box.assess","audience":"app","section":"potential-assessments","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_id, rating (low|medium|high), criteria {learning_agility, leadership, drive, adaptability, aspiration: 1\u20135}, notes, evaluation_cycle_id, assessed_on.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer|exists:employees,id","required":true},{"name":"rating","rules":"required|in:low,medium,high","required":true},{"name":"criteria","rules":"nullable|array","required":false},{"name":"criteria.*","rules":"nullable|integer|between:1,5","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"evaluation_cycle_id","rules":"nullable|integer|exists:evaluation_cycles,id","required":false},{"name":"assessed_on","rules":"nullable|date|before_or_equal:today","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/potential-assessments\/{assessment}","name":"api.v1.app.nine-box.assessments.destroy","audience":"app","section":"potential-assessments","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assessment","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/professional-data\/{record}\/cancel","name":"api.v1.app.professional-data.cancel","audience":"app","section":"professional-data","permissions":["employees.edit"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"record","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/professional-data\/{record}","name":"api.v1.app.professional-data.update","audience":"app","section":"professional-data","permissions":["employees.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"record","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/professional-data\/{record}","name":"api.v1.app.professional-data.destroy","audience":"app","section":"professional-data","permissions":["employees.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"record","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/projects","name":"api.v1.app.projects.index","audience":"app","section":"projects","permissions":["projects.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/projects","name":"api.v1.app.projects.store","audience":"app","section":"projects","permissions":["projects.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"code","rules":"required|string|max:30|unique:org_units,code","required":true},{"name":"name","rules":"required|array","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"client","rules":"nullable|string|max:150","required":false},{"name":"group_name","rules":"nullable|string|max:150","required":false},{"name":"group_code","rules":"nullable|string|max:30","required":false},{"name":"entity_code","rules":"nullable|string|max:30","required":false},{"name":"manager_id","rules":"nullable|integer|exists:employees,id","required":false},{"name":"start_date","rules":"nullable|date","required":false},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"budget_hours","rules":"nullable|numeric|min:0","required":false},{"name":"cost_center_id","rules":"nullable|integer|exists:cost_centers,id","required":false},{"name":"status","rules":"required|Rule::in(self::STATUSES)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/projects\/{project}","name":"api.v1.app.projects.show","audience":"app","section":"projects","permissions":["projects.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"project","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/projects\/{project}","name":"api.v1.app.projects.update","audience":"app","section":"projects","permissions":["projects.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"project","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/projects\/{project}\/assignments","name":"api.v1.app.projects.assign","audience":"app","section":"projects","permissions":["projects.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"project","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"position_id","rules":"nullable|integer|exists:positions,id","required":false},{"name":"contribution_percent","rules":"required|numeric|min:0|max:100","required":true},{"name":"staff_code","rules":"nullable|string|max:30","required":false},{"name":"start_date","rules":"nullable|date","required":false},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/projects\/{project}\/assignments\/{assignment}","name":"api.v1.app.projects.unassign","audience":"app","section":"projects","permissions":["projects.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"project","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/proof\/time-anchor","name":"api.v1.app.proof.time-anchor","audience":"app","section":"proof","permissions":["self.tasks.capture","self.field_capture"],"modules":[],"rate_limit_per_minute":30,"summary":"body: device_id, boot_id, elapsed_ms (the phone's since-boot clock as it asks).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"device_id","rules":"required|string|max:100","required":true},{"name":"boot_id","rules":"nullable|string|max:100","required":false},{"name":"elapsed_ms","rules":"nullable|integer|min:0","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/proof\/device-keys\/challenge","name":"api.v1.app.proof.device-keys.challenge","audience":"app","section":"proof","permissions":["self.tasks.capture","self.field_capture"],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/proof\/device-keys","name":"api.v1.app.proof.device-keys.store","audience":"app","section":"proof","permissions":["self.tasks.capture","self.field_capture"],"modules":[],"rate_limit_per_minute":10,"summary":"device_id, public_key (base64 SPKI P-256), platform, challenge, attestation {android_key_chain | ios_app_attest {key_id, attestation_object}}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/provisions","name":"api.v1.app.provisions.index","audience":"app","section":"provisions","permissions":["payroll.provisions.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Rows: month (YYYY-MM, default this month) or from \/ to; stb_types[], contract_type, employee_status, kind, and the org filters (branch, department, \u2026) of the screens.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/provisions\/months","name":"api.v1.app.provisions.months","audience":"app","section":"provisions","permissions":["payroll.provisions.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The calculated months (last 24) with the people, the month's provisions and the running total, for the employees in scope.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/provisions","name":"api.v1.app.provisions.calculate","audience":"app","section":"provisions","permissions":["payroll.provisions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/provisions\/bulk-delete","name":"api.v1.app.provisions.bulk-destroy","audience":"app","section":"provisions","permissions":["payroll.provisions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ids[]: an earlier month a later one builds on stays (deleted < chosen).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"ids","rules":"required|array","required":true},{"name":"ids.*","rules":"integer","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/provisions\/{month}","name":"api.v1.app.provisions.destroy","audience":"app","section":"provisions","permissions":["payroll.provisions.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"month","type":"string","pattern":"[0-9]{4}-[0-9]{2}"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/rating-types","name":"api.v1.app.performance.rating-types.store","audience":"app","section":"rating-types","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, units [{id?, name {en, ar}}].","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/rating-types\/{type}","name":"api.v1.app.performance.rating-types.update","audience":"app","section":"rating-types","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, units [{id?, name {en, ar}}].","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/rating-types\/{type}","name":"api.v1.app.performance.rating-types.destroy","audience":"app","section":"rating-types","permissions":["performance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/interviews\/{interview}\/scorecard","name":"api.v1.app.recruitment.scorecards.store","audience":"app","section":"recruitment","permissions":["self.interviews","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A panel member's own scorecard: ratings [{criterion, rating}], overall 1\u20135, recommendation, notes.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"interview","type":"integer","pattern":null}],"fields":[{"name":"ratings","rules":"nullable|array|max:20","required":false},{"name":"ratings.*.criterion","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(120)","required":true},{"name":"ratings.*.rating","rules":"required|integer|between:1,5","required":true},{"name":"overall","rules":"required|integer|between:1,5","required":true},{"name":"recommendation","rules":"required|in:strong_yes,yes,no,strong_no","required":true},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(5000)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/offers\/{offer}\/decide","name":"api.v1.app.recruitment.offers.decide","audience":"app","section":"recruitment","permissions":["recruitment.approve_offers"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"decision: approve or reject, note (needed to reject). Needs recruitment.approve_offers.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"offer","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/offers","name":"api.v1.app.recruitment.offers.index","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*","recruitment.approve_offers"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filter: status.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/offers\/{offer}","name":"api.v1.app.recruitment.offers.show","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*","recruitment.approve_offers"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"offer","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/dashboard","name":"api.v1.app.recruitment.dashboard","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: from, to (dates, default the last 90 days), job.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/pipeline","name":"api.v1.app.recruitment.pipeline","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/pool","name":"api.v1.app.recruitment.pool","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: q (name, email, skills, tags), tag.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/availability","name":"api.v1.app.recruitment.availability","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filter: employee.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/interviews\/{interview}\/ics","name":"api.v1.app.recruitment.interviews.ics","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"interview","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/templates","name":"api.v1.app.recruitment.templates","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/assessments","name":"api.v1.app.recruitment.candidates.assessments","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A candidate's tests: status, best result, pass or fail, the gate and the link.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/stage-assessments","name":"api.v1.app.recruitment.stage-assessments","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The test each pipeline stage sends, and its gate.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/settings","name":"api.v1.app.recruitment.settings","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"AI switches, the candidate email language, and which accounts are connected (secrets are never returned).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/summary","name":"api.v1.app.recruitment.summary","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Counts, and whether the careers page is on, with its address.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs","name":"api.v1.app.recruitment.jobs.index","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: status, type, department, branch, q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}","name":"api.v1.app.recruitment.jobs.show","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A job opening and its candidates by stage.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates","name":"api.v1.app.recruitment.candidates.index","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: job, stage, source, q.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}","name":"api.v1.app.recruitment.candidates.show","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A candidate with notes and interviews.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/cv","name":"api.v1.app.recruitment.candidates.cv","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/interviews","name":"api.v1.app.recruitment.interviews.index","audience":"app","section":"recruitment","permissions":["recruitment.view","recruitment.manage.*"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Filters: status (scheduled, done, cancelled), from, to (dates), candidate.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/careers","name":"api.v1.app.recruitment.careers","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"enabled: true or false.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs","name":"api.v1.app.recruitment.jobs.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, department_id, branch_id, position_id, employment_type, description, requirements, positions, closing_date, status.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"department_id","rules":"nullable|integer|exists:org_units,id","required":false},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"position_id","rules":"nullable|integer|exists:positions,id","required":false},{"name":"employment_type","rules":"required|in:full_time,part_time,contract,internship","required":true},{"name":"description","rules":"required|string|max:5000","required":true},{"name":"requirements","rules":"nullable|string|max:5000","required":false},{"name":"description_ar","rules":"nullable|string|max:5000","required":false},{"name":"requirements_ar","rules":"nullable|string|max:5000","required":false},{"name":"in_job_feed","rules":"nullable|boolean","required":false},{"name":"positions","rules":"required|integer|between:1,100","required":true},{"name":"closing_date","rules":"nullable|date","required":false},{"name":"status","rules":"required|in:draft,open,closed","required":true}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}","name":"api.v1.app.recruitment.jobs.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}","name":"api.v1.app.recruitment.jobs.destroy","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}\/candidates","name":"api.v1.app.recruitment.candidates.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name, email, phone, source, cover_note, cv (file).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|string|max:150","required":true},{"name":"email","rules":"required|email|max:150|unique:candidates,email","required":true},{"name":"phone","rules":"nullable|string|max:30","required":false},{"name":"source","rules":"required|in:careers_page,referral,linkedin,job_board,other","required":true},{"name":"cover_note","rules":"nullable|string|max:3000","required":false},{"name":"rating","rules":"nullable|integer|between:1,5","required":false},{"name":"expected_salary","rules":"nullable|numeric|min:0|max:999999999","required":false},{"name":"expected_salary_currency","rules":"nullable|string|size:3","required":false},{"name":"cv","rules":"nullable|file|max:10240|mimes:pdf,doc,docx","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}","name":"api.v1.app.recruitment.candidates.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"stage (not hired: use hire), rejection_reason, rating 1\u20135.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[{"name":"stage","rules":"sometimes|required|Rule::in(array_diff(\\App\\Models\\Candidate::STAGES, ['hired']))","required":true},{"name":"rating","rules":"sometimes|nullable|integer|between:1,5","required":false},{"name":"rejection_reason","rules":"sometimes|nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"expected_salary","rules":"sometimes|nullable|numeric|min:0|max:999999999","required":false},{"name":"expected_salary_currency","rules":"sometimes|nullable|string|size:3","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}","name":"api.v1.app.recruitment.candidates.destroy","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/notes","name":"api.v1.app.recruitment.notes.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"body.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[{"name":"body","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(3000)","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/interviews","name":"api.v1.app.recruitment.interviews.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.interviews.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"interviewer_id (employee), panel_ids, scheduled_at, kind (onsite, video, phone), duration_minutes, location, video_provider (zoom, google_meet, teams, manual), video_link.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/interviews\/{interview}","name":"api.v1.app.recruitment.interviews.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.interviews.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"status, rating, feedback, video_link, location.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"interview","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"sometimes|required|Rule::in(array_diff(\\App\\Models\\Interview::STATUSES, ['awaiting_booking']))","required":true},{"name":"rating","rules":"sometimes|nullable|integer|between:1,5","required":false},{"name":"feedback","rules":"sometimes|nullable|string|max:3000","required":false},{"name":"video_link","rules":"sometimes|nullable|url|max:500","required":false},{"name":"location","rules":"sometimes|nullable|string|max:255","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/hire","name":"api.v1.app.recruitment.candidates.hire","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.hire"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Make the employee record: employee_number, hire_date, branch_id, department_id, position_id, manager_id, basic_salary, create_login.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/stage","name":"api.v1.app.recruitment.candidates.stage","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.move"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"stage, reason (for rejected).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/bulk","name":"api.v1.app.recruitment.candidates.bulk","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ids, action (move, reject, tag, untag, pool, unpool, email, delete), stage, reason, tags, template, send_email.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"required|Rule::in(self::BULK_ACTIONS)","required":true},{"name":"ids","rules":"required|array|max:500","required":true},{"name":"ids.*","rules":"integer","required":false},{"name":"stage","rules":"required_if:action,move|nullable|Rule::in(array_diff(\\App\\Models\\Candidate::STAGES, ['hired']))","required":false},{"name":"reason","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"tags","rules":"required_if:action,tag|required_if:action,untag|nullable","required":false},{"name":"template","rules":"required_if:action,email|nullable|in:applied,screening,interview,offer,hired,rejected","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/profile","name":"api.v1.app.recruitment.candidates.profile","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"tags, in_talent_pool, linkedin_url.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[{"name":"tags","rules":"sometimes|nullable","required":false},{"name":"in_talent_pool","rules":"sometimes|boolean","required":false},{"name":"linkedin_url","rules":"sometimes|nullable|url|max:255|regex:#^https:\/\/([a-z]+\\.)?linkedin\\.com\/#i","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/email","name":"api.v1.app.recruitment.candidates.email","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"template: the stage whose email to send.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/add-to-job","name":"api.v1.app.recruitment.candidates.add-to-job","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"job_opening_id: puts a pool or past candidate forward for a job (a new candidate on that job).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/pool","name":"api.v1.app.recruitment.pool.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name, email, phone, linkedin_url, tags, source, cover_note, cv (file).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|string|max:150","required":true},{"name":"email","rules":"required|email|max:150|unique:candidates,email","required":true},{"name":"phone","rules":"nullable|string|max:30","required":false},{"name":"linkedin_url","rules":"nullable|url|max:255|regex:#^https:\/\/([a-z]+\\.)?linkedin\\.com\/#i","required":false},{"name":"source","rules":"nullable|in:careers_page,referral,linkedin,job_board,other","required":false},{"name":"cover_note","rules":"nullable|string|max:3000","required":false},{"name":"tags","rules":"nullable","required":false},{"name":"cv","rules":"nullable|file|max:10240|mimes:pdf,doc,docx","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/ai\/parse","name":"api.v1.app.recruitment.ai.parse","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/ai\/match","name":"api.v1.app.recruitment.ai.match","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}\/ai\/rank","name":"api.v1.app.recruitment.ai.rank","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"refresh: score everyone again. Returns the job's active candidates, best match first.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}\/ai\/questions","name":"api.v1.app.recruitment.ai.questions","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"count (3\u201315).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/ai\/job-draft","name":"api.v1.app.recruitment.ai.draft","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title, department, employment_type, notes \u2192 description {en, ar}, requirements {en, ar}.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|string|max:150","required":true},{"name":"department","rules":"nullable|string|max:150","required":false},{"name":"employment_type","rules":"nullable|in:full_time,part_time,contract,internship","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/jobs\/{job}\/linkedin","name":"api.v1.app.recruitment.jobs.linkedin","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.jobs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Posts the job to the company's LinkedIn page; without a connected page answers with the share link.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"job","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/booking","name":"api.v1.app.recruitment.interviews.invite","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.interviews.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"interviewer_id, panel_ids, kind, duration_minutes, location, video_provider, video_link, booking_from, booking_to.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/availability\/{employee}","name":"api.v1.app.recruitment.availability.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.interviews.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"windows: [{weekday 0\u20136 (Sunday = 0), starts_at HH:MM, ends_at HH:MM}], replacing the employee's.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employee","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/offers","name":"api.v1.app.recruitment.offers.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.offers.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/offers\/{offer}","name":"api.v1.app.recruitment.offers.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.offers.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"offer","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/offers\/{offer}\/{action}","name":"api.v1.app.recruitment.offers.action","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.offers.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"action: submit, send, withdraw.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"offer","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"submit|send|withdraw"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/offers\/{offer}\/convert","name":"api.v1.app.recruitment.offers.convert","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.hire"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employee_number, branch_id, department_id, position_id, manager_id, create_login, boarding_template_id.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"offer","type":"integer","pattern":null}],"fields":[{"name":"boarding_template_id","rules":"integer|exists:boarding_templates,id","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/templates\/emails\/{stage}","name":"api.v1.app.recruitment.templates.email","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"subject {en, ar}, body {en, ar}, auto_send.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"stage","type":"string","pattern":"applied|screening|interview|offer|hired|rejected|assessment"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/candidates\/{candidate}\/assessments","name":"api.v1.app.recruitment.candidates.assessments.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.candidates.manage","assessments.invite"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"assessment_id, due_date (Y-m-d), pass_stage, fail_stage, locale: sends the link by the \"Assessment\" email.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"candidate","type":"integer","pattern":null}],"fields":[{"name":"assessment_id","rules":"required|integer","required":true},{"name":"due_date","rules":"nullable|date|after_or_equal:today","required":false},{"name":"pass_stage","rules":"nullable|Rule::in(self::gateStages())","required":false},{"name":"fail_stage","rules":"nullable|Rule::in(self::gateStages())","required":false},{"name":"locale","rules":"nullable|in:en,ar","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/stage-assessments","name":"api.v1.app.recruitment.stage-assessments.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"{stage: {assessment_test_id (null removes), auto_send, pass_stage, fail_stage, due_days}} (or under \"stages\").","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"stages","rules":"array","required":false},{"name":"stages.*","rules":"array","required":false},{"name":"stages.*.assessment_test_id","rules":"nullable|integer|exists:assessment_tests,id","required":false},{"name":"stages.*.auto_send","rules":"nullable|boolean","required":false},{"name":"stages.*.pass_stage","rules":"nullable|Rule::in(self::gateStages())","required":false},{"name":"stages.*.fail_stage","rules":"nullable|Rule::in(self::gateStages())","required":false},{"name":"stages.*.due_days","rules":"nullable|integer|between:1,90","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/templates\/offers","name":"api.v1.app.recruitment.templates.offers.store","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, body {en, ar}, active.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"body","rules":"required|array","required":true},{"name":"body.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(20000)","required":true},{"name":"body.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(20000)","required":true},{"name":"active","rules":"nullable|boolean","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/templates\/offers\/{template}","name":"api.v1.app.recruitment.templates.offers.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name {en, ar}, body {en, ar}, active.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"body","rules":"required|array","required":true},{"name":"body.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(20000)","required":true},{"name":"body.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(20000)","required":true},{"name":"active","rules":"nullable|boolean","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/templates\/offers\/{template}","name":"api.v1.app.recruitment.templates.offers.destroy","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/recruitment\/settings","name":"api.v1.app.recruitment.settings.update","audience":"app","section":"recruitment","permissions":["recruitment.manage.*","recruitment.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ai_enabled, ai_candidate_data, ai_auto_parse, recruitment_email_language (en, ar, both).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"ai_enabled","rules":"sometimes|boolean","required":false},{"name":"ai_candidate_data","rules":"sometimes|boolean","required":false},{"name":"ai_auto_parse","rules":"sometimes|boolean","required":false},{"name":"recruitment_email_language","rules":"sometimes|in:en,ar,both","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/regional-settings","name":"api.v1.app.regional-settings.index","audience":"app","section":"regional-settings","permissions":["settings.manage","branches.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/regional-settings","name":"api.v1.app.regional-settings.update","audience":"app","section":"regional-settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/reports","name":"api.v1.app.reports.index","audience":"app","section":"reports","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET reports: the reports by group (the ones the person may run, and the ones coming with a module), their saved options.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/reports\/{report}","name":"api.v1.app.reports.show","audience":"app","section":"reports","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET reports\/{report}: its filters with their options, columns, switches and exports.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["GET","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/reports\/{report}\/run","name":"api.v1.app.reports.run","audience":"app","section":"reports","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"string","pattern":"[a-z_]+"}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/reports\/{report}\/queue","name":"api.v1.app.reports.queue","audience":"app","section":"reports","permissions":[],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"POST reports\/{report}\/queue: format xlsx|csv and the run's options; the file is built in the background (202).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"string","pattern":"[a-z_]+"}],"fields":[{"name":"format","rules":"required|in:xlsx,csv","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/reports\/{report}\/saved","name":"api.v1.app.reports.saved.store","audience":"app","section":"reports","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"POST reports\/{report}\/saved: {name, options: {\u2026the run input\u2026}}.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"report","type":"string","pattern":"[a-z_]+"}],"fields":[{"name":"name","rules":"required|string|max:100","required":true},{"name":"options","rules":"nullable|array","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/request-types","name":"api.v1.app.requests.types","audience":"app","section":"request-types","permissions":["self.requests.file","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The request types this company offers, with the fields each asks for and their choices (for my own requests).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/requests\/{type}","name":"api.v1.app.requests.store","audience":"app","section":"requests","permissions":["self.requests.file","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":20,"summary":"File a request of a type: its fields, an attachment (multipart), and employee_id to file for someone else.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"string","pattern":"[a-z_]+"}],"fields":[{"name":"attachment","rules":"nullable|file|max:10240|mimes:pdf,jpg,jpeg,png,doc,docx","required":false},{"name":"employee_id","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/requests\/{employeeRequest}","name":"api.v1.app.requests.show","audience":"app","section":"requests","permissions":["self.requests.view","self.approvals.decide","requests.view","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/requests\/{employeeRequest}\/attachment","name":"api.v1.app.requests.attachment","audience":"app","section":"requests","permissions":["self.requests.view","self.approvals.decide","requests.view","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/requests\/{employeeRequest}\/approval-cycle","name":"api.v1.app.requests.cycle","audience":"app","section":"requests","permissions":["self.requests.view","self.approvals.decide","requests.view","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET requests\/{id}\/approval-cycle: ZenHR's \"Approval Cycle\" \u2014 every step, its approver, status, times and note (ApprovalCycle).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/requests\/{employeeRequest}\/decide","name":"api.v1.app.requests.decide","audience":"app","section":"requests","permissions":["self.approvals.decide","requests.manage","leaves.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Decide the step a request waits on: decision approved|rejected, decision_note.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/requests\/{employeeRequest}\/withdraw","name":"api.v1.app.requests.withdraw","audience":"app","section":"requests","permissions":["self.requests.cancel","requests.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Withdraw my pending request.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"employeeRequest","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/role-assignments","name":"api.v1.app.role-assignments.index","audience":"app","section":"role-assignments","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/role-assignments","name":"api.v1.app.role-assignments.store","audience":"app","section":"role-assignments","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Give a role to an employee's sign-in account: employee_id, role_id, scope, scope_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"role_id","rules":"required|integer|exists:roles,id","required":true},{"name":"scope","rules":"required|in:company,branch,department,work_location,section,project,hierarchy_group,business_unit,division,segment,reports,team,reports_of","required":true},{"name":"scope_id","rules":"Rule::requiredIf(in_array($input['scope'] ?? null, self::TARGETED, true))|nullable|integer|match ($input['scope'] ?? null) {\n    'branch' => Rule::exists('branches', 'id')...","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/role-assignments\/{assignment}","name":"api.v1.app.role-assignments.destroy","audience":"app","section":"role-assignments","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"assignment","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/roles\/{role}\/matrix","name":"api.v1.app.roles.matrix","audience":"app","section":"roles","permissions":["setup.roles.permissions"],"modules":[],"rate_limit_per_minute":60,"summary":"A role's whole table of web and app switches and field levels (docs\/mobile-setup.md).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"role","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/roles\/{role}\/matrix","name":"api.v1.app.roles.matrix.update","audience":"app","section":"roles","permissions":["setup.roles.permissions"],"modules":[],"rate_limit_per_minute":60,"summary":"Changes the rows sent, the rest stays; the same rules as saving a role (nobody gives what they don't have).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"role","type":"integer","pattern":null}],"fields":[{"name":"actions","rules":"sometimes|array","required":false},{"name":"actions.*","rules":"array","required":false},{"name":"fields","rules":"sometimes|array","required":false},{"name":"fields.*","rules":"array","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/roles","name":"api.v1.app.roles.index","audience":"app","section":"roles","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/roles","name":"api.v1.app.roles.store","audience":"app","section":"roles","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$role ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$role ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.*","rules":"nullable|string|max:300","required":false},{"name":"permissions","rules":"$role ? 'sometimes' : 'required'|array|$role?->isEveryone() ? 'min:0' : 'min:1'","required":false},{"name":"permissions.*","rules":"Rule::in($role?->isEveryone() ? \\App\\Models\\Role::selfPermissions() : \\App\\Model...","required":false},{"name":"channels","rules":"sometimes|nullable|array","required":false},{"name":"channels.*","rules":"in:both,web,app,none","required":false},{"name":"fields","rules":"sometimes|nullable|array","required":false},{"name":"fields.*","rules":"array:web,app","required":false},{"name":"fields.*.web","rules":"required|in:hidden,view,edit","required":true},{"name":"fields.*.app","rules":"required|in:hidden,view,edit","required":true},{"name":"is_active","rules":"sometimes|boolean","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/roles\/{role}","name":"api.v1.app.roles.update","audience":"app","section":"roles","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"role","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"$role ? 'sometimes' : 'required'|array","required":false},{"name":"name.en","rules":"$role ? 'required_with:name' : 'required'|string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"name.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(80)","required":false},{"name":"description","rules":"nullable|array","required":false},{"name":"description.*","rules":"nullable|string|max:300","required":false},{"name":"permissions","rules":"$role ? 'sometimes' : 'required'|array|$role?->isEveryone() ? 'min:0' : 'min:1'","required":false},{"name":"permissions.*","rules":"Rule::in($role?->isEveryone() ? \\App\\Models\\Role::selfPermissions() : \\App\\Model...","required":false},{"name":"channels","rules":"sometimes|nullable|array","required":false},{"name":"channels.*","rules":"in:both,web,app,none","required":false},{"name":"fields","rules":"sometimes|nullable|array","required":false},{"name":"fields.*","rules":"array:web,app","required":false},{"name":"fields.*.web","rules":"required|in:hidden,view,edit","required":true},{"name":"fields.*.app","rules":"required|in:hidden,view,edit","required":true},{"name":"is_active","rules":"sometimes|boolean","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/roles\/{role}","name":"api.v1.app.roles.destroy","audience":"app","section":"roles","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"role","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/roles\/{role}\/where","name":"api.v1.app.roles.where","audience":"app","section":"roles","permissions":["roles.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"What a role shows on the web and in the app.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"role","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salaries","name":"api.v1.app.salaries.index","audience":"app","section":"salaries","permissions":["payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salaries\/calculate","name":"api.v1.app.salaries.calculate.options","audience":"app","section":"salaries","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/salaries\/calculate","name":"api.v1.app.salaries.calculate","audience":"app","section":"salaries","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"salary_type","rules":"nullable|in:monthly,extra","required":false},{"name":"title","rules":"required|string|max:100","required":true},{"name":"month","rules":"required|date_format:Y-m","required":true},{"name":"percent_of_basic","rules":"required|numeric|min:1|max:1000","required":true},{"name":"picks","rules":"nullable|array","required":false},{"name":"picks.*","rules":"string","required":false},{"name":"departments","rules":"nullable|array","required":false},{"name":"departments.*","rules":"integer","required":false},{"name":"branches","rules":"nullable|array","required":false},{"name":"branches.*","rules":"integer","required":false},{"name":"employees","rules":"nullable|array","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"period_from","rules":"nullable|required_with:period_to|date_format:Y-m-d","required":false},{"name":"period_to","rules":"nullable|required_with:period_from|date_format:Y-m-d|after_or_equal:period_from","required":false},{"name":"batch_id","rules":"nullable|integer","required":false},{"name":"move_pending","rules":"nullable|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salaries\/off-cycle-settlement","name":"api.v1.app.salaries.settlement.options","audience":"app","section":"salaries","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"GET salaries\/off-cycle-settlement: who can get an off-cycle settlement (docs\/payroll-settlement-slips.md).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/salaries\/off-cycle-settlement","name":"api.v1.app.salaries.settlement","audience":"app","section":"salaries","permissions":["payroll.runs.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"POST salaries\/off-cycle-settlement {employee_id}: the leaver's final settlement as its own draft batch.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-batches","name":"api.v1.app.salaries.batches","audience":"app","section":"salary-batches","permissions":["payroll.runs.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Salary Batches: year, month (1-12), salary_type (regular | off_cycle), run_status (draft | pending | rejected | approved | sent).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-package-templates","name":"api.v1.app.payroll.templates","audience":"app","section":"salary-package-templates","permissions":["payroll.salary_packages.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Salary package templates with their items (active=1 or 0 to filter).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-package-templates","name":"api.v1.app.payroll.templates.store","audience":"app","section":"salary-package-templates","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A new template: name_en, name_ar, basic_salary, active, external_ref.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-package-templates\/{template}","name":"api.v1.app.payroll.templates.update","audience":"app","section":"salary-package-templates","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Changes only the given fields of a template.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"basic_salary","rules":"required|numeric|min:0","required":true},{"name":"external_ref","rules":"nullable|string|max:64","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-package-templates\/{template}","name":"api.v1.app.payroll.templates.destroy","audience":"app","section":"salary-package-templates","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-package-templates\/{template}\/items","name":"api.v1.app.payroll.templates.items.store","audience":"app","section":"salary-package-templates","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"An item: type allowance | deduction, transaction_type_id or name_en \/ name_ar, amount.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[{"name":"type","rules":"required|in:allowance,deduction","required":true},{"name":"transaction_type_id","rules":"nullable|exists:transaction_types,id","required":false},{"name":"name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"amount","rules":"required|numeric|min:0","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-package-templates\/{template}\/items\/{item}","name":"api.v1.app.payroll.templates.items.destroy","audience":"app","section":"salary-package-templates","permissions":["payroll.salary_packages.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null},{"name":"item","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-packages-screening","name":"api.v1.app.payroll.packages.screening","audience":"app","section":"salary-packages-screening","permissions":["payroll.salary_packages.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Salary packages screening: active_employees, effective_from, effective_to, approval_status, package_status and the org filters; paged.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"effective_from","rules":"nullable|date","required":false},{"name":"effective_to","rules":"nullable|date","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales","name":"api.v1.app.salary-scales.index","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Scales, newest activation first; status filter.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales","name":"api.v1.app.salary-scales.store","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"salary_range_layer","rules":"$layer","required":false},{"name":"benefits_layer","rules":"$layer","required":false},{"name":"timeoffs_layer","rules":"$layer","required":false},{"name":"exceed_range_percent","rules":"nullable|numeric|between:0,1000","required":false},{"name":"exceed_benefits_percent","rules":"nullable|numeric|between:0,1000","required":false},{"name":"compa_from","rules":"nullable|numeric|between:0,1000|required_with:compa_to","required":false},{"name":"compa_to","rules":"nullable|numeric|between:0,1000|required_with:compa_from|gte:compa_from","required":false},{"name":"activation_date","rules":"nullable|date","required":false},{"name":"status","rules":"required|in:active,inactive,draft","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales\/{scale}","name":"api.v1.app.salary-scales.show","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"scale","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales\/{scale}","name":"api.v1.app.salary-scales.update","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"scale","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"salary_range_layer","rules":"$layer","required":false},{"name":"benefits_layer","rules":"$layer","required":false},{"name":"timeoffs_layer","rules":"$layer","required":false},{"name":"exceed_range_percent","rules":"nullable|numeric|between:0,1000","required":false},{"name":"exceed_benefits_percent","rules":"nullable|numeric|between:0,1000","required":false},{"name":"compa_from","rules":"nullable|numeric|between:0,1000|required_with:compa_to","required":false},{"name":"compa_to","rules":"nullable|numeric|between:0,1000|required_with:compa_from|gte:compa_from","required":false},{"name":"activation_date","rules":"nullable|date","required":false},{"name":"status","rules":"required|in:active,inactive,draft","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales\/{scale}","name":"api.v1.app.salary-scales.destroy","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"scale","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales\/{scale}\/{layer}","name":"api.v1.app.salary-scales.layers.store","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"scale","type":"integer","pattern":null},{"name":"layer","type":"string","pattern":"grade|band|level"}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"scale_grade_id","rules":"$layer === 'grade' ? ['prohibited'] : $parent('grade')","required":false},{"name":"scale_band_id","rules":"$layer === 'level' ? $parent('band') : ['prohibited']","required":false},{"name":"min_salary","rules":"nullable|numeric|min:0","required":false},{"name":"max_salary","rules":"nullable|numeric|min:0|gte:min_salary","required":false},{"name":"mid_salary","rules":"nullable|numeric|min:0","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales\/{scale}\/{layer}\/{id}","name":"api.v1.app.salary-scales.layers.update","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"scale","type":"integer","pattern":null},{"name":"layer","type":"string","pattern":"grade|band|level"},{"name":"id","type":"integer","pattern":null}],"fields":[{"name":"name_en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name_ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"scale_grade_id","rules":"$layer === 'grade' ? ['prohibited'] : $parent('grade')","required":false},{"name":"scale_band_id","rules":"$layer === 'level' ? $parent('band') : ['prohibited']","required":false},{"name":"min_salary","rules":"nullable|numeric|min:0","required":false},{"name":"max_salary","rules":"nullable|numeric|min:0|gte:min_salary","required":false},{"name":"mid_salary","rules":"nullable|numeric|min:0","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/salary-scales\/{scale}\/{layer}\/{id}","name":"api.v1.app.salary-scales.layers.destroy","audience":"app","section":"salary-scales","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"scale","type":"integer","pattern":null},{"name":"layer","type":"string","pattern":"grade|band|level"},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/saved-reports\/{saved}","name":"api.v1.app.reports.saved.destroy","audience":"app","section":"saved-reports","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"saved","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/search","name":"api.v1.app.search","audience":"app","section":"search","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/limits","name":"api.v1.app.settings.limits","audience":"app","section":"settings","permissions":["limits.view"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch_id","rules":"sometimes|nullable|integer","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/limits","name":"api.v1.app.settings.limits.update","audience":"app","section":"settings","permissions":["limits.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"values: {key: number, or null to go back to the level above}; sizes in KB. Only the keys sent change.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch_id","rules":"sometimes|nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/app-colors","name":"api.v1.app.settings.app-colors","audience":"app","section":"settings","permissions":["app_colors.view"],"modules":[],"rate_limit_per_minute":60,"summary":"?branch_id= one branch's own colors; none: the company's.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch_id","rules":"sometimes|nullable|integer","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/app-colors","name":"api.v1.app.settings.app-colors.update","audience":"app","section":"settings","permissions":["app_colors.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"primary, secondary (#RRGGBB; empty follows the level above), branch_id. Only what's sent changes.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"primary","rules":"sometimes|nullable|regex:\/^#[0-9A-Fa-f]{6}$\/","required":false},{"name":"secondary","rules":"sometimes|nullable|regex:\/^#[0-9A-Fa-f]{6}$\/","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/app-colors","name":"api.v1.app.settings.app-colors.reset","audience":"app","section":"settings","permissions":["app_colors.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/account","name":"api.v1.app.settings.account","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/account","name":"api.v1.app.settings.account.update","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"PATCH: send only what changes. POST works too, for a logo as multipart\/form-data.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/mail","name":"api.v1.app.settings.mail","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/mail","name":"api.v1.app.settings.mail.update","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"host","rules":"nullable|string|max:190|regex:\/^[A-Za-z0-9.\\-]+$\/","required":false},{"name":"port","rules":"$on ? 'required' : 'nullable'|integer|between:1,65535","required":false},{"name":"username","rules":"nullable|string|max:190","required":false},{"name":"password","rules":"nullable|string|max:190","required":false},{"name":"encryption","rules":"$on ? 'required' : 'nullable'|in:tls,ssl,none","required":false},{"name":"from","rules":"$on ? 'required' : 'nullable'|email:filter|max:190","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/mail\/test","name":"api.v1.app.settings.mail.test","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/mail\/employees","name":"api.v1.app.settings.mail.employees","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"\"Email employees\" on or off (docs\/mail.md): for branch_id when given, else the branch being worked in.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/appearance","name":"api.v1.app.settings.appearance","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/appearance","name":"api.v1.app.settings.appearance.update","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"allow_user_override","rules":"boolean","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/appearance","name":"api.v1.app.settings.appearance.reset","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/sign-in","name":"api.v1.app.settings.sign-in","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/sign-in","name":"api.v1.app.settings.sign-in.update","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"Send only what changes; the client secret is write-only (blank keeps it).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"two_factor_required","rules":"sometimes|boolean","required":false},{"name":"sso_enabled","rules":"sometimes|boolean","required":false},{"name":"sso_protocol","rules":"sometimes|in:oidc,saml","required":false},{"name":"sso_name","rules":"sometimes|nullable|string|max:40","required":false},{"name":"sso_issuer","rules":"sometimes|nullable|url:https|max:255","required":false},{"name":"sso_client_id","rules":"sometimes|nullable|string|max:255","required":false},{"name":"sso_client_secret","rules":"sometimes|nullable|string|max:500","required":false},{"name":"sso_only","rules":"sometimes|boolean","required":false},{"name":"sso_exempt_user_ids","rules":"sometimes|nullable|array|max:200","required":false},{"name":"sso_exempt_user_ids.*","rules":"integer|exists:company_user,user_id","required":false},{"name":"saml_idp_entity_id","rules":"sometimes|nullable|string|max:255","required":false},{"name":"saml_idp_sso_url","rules":"sometimes|nullable|url:https|max:500","required":false},{"name":"saml_idp_cert","rules":"sometimes|nullable|string|max:20000","required":false},{"name":"saml_metadata_url","rules":"sometimes|nullable|url:https|max:500","required":false},{"name":"saml_metadata_xml","rules":"sometimes|nullable|string|max:500000","required":false},{"name":"saml_email_attribute","rules":"sometimes|nullable|string|max:190","required":false},{"name":"pw_min_length","rules":"sometimes|integer|min:6|max:64","required":false},{"name":"pw_upper","rules":"sometimes|boolean","required":false},{"name":"pw_lower","rules":"sometimes|boolean","required":false},{"name":"pw_numbers","rules":"sometimes|boolean","required":false},{"name":"pw_special","rules":"sometimes|boolean","required":false},{"name":"pw_max_age_days","rules":"sometimes|integer|min:0|max:365","required":false},{"name":"pw_reuse","rules":"sometimes|integer|min:0|max:24","required":false},{"name":"pw_max_attempts","rules":"sometimes|integer|min:0|max:20|fn($a, $v, $fail) => (int) $v === 0 || (int) $v >= 3 || $fail(__('Allow at least...","required":false},{"name":"pw_lock_minutes","rules":"sometimes|integer|min:0|max:1440","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/sign-in\/sso-log","name":"api.v1.app.settings.sign-in.sso-log","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"The single sign-on audit log: sign-ins, refusals, blocked password sign-ins and settings changes, newest first.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"limit","rules":"sometimes|integer|min:1|'max:' . \\App\\Support\\Limits::cap(200)","required":false},{"name":"event","rules":"sometimes|in:sign_in,sign_in_failed,password_blocked,settings_changed","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/log-retention","name":"api.v1.app.settings.log-retention","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/log-retention","name":"api.v1.app.settings.log-retention.update","audience":"app","section":"settings","permissions":["settings.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"retention","rules":"required|Rule::in(\\App\\Support\\LogRetention::options())","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/earned-wage","name":"api.v1.app.earned-wage.settings","audience":"app","section":"settings","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/earned-wage","name":"api.v1.app.earned-wage.settings.update","audience":"app","section":"settings","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/salary-scale","name":"api.v1.app.settings.salary-scale","audience":"app","section":"settings","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"salary_scale_enforce","rules":"required|in:off,block","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/live-location","name":"api.v1.app.settings.live-location","audience":"app","section":"settings","permissions":["live_location.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/live-location","name":"api.v1.app.settings.live-location.update","audience":"app","section":"settings","permissions":["live_location.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"enabled, mode, interval_seconds, distance_meters, max_silence_minutes, retention_days, reason {en, ar}, rules [{target_type, target_id, effect}].","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"enabled","rules":"sometimes|boolean","required":false},{"name":"mode","rules":"sometimes|in:while_clocked_in,during_shift,always_when_app_open","required":false},{"name":"interval_seconds","rules":"sometimes|integer|between:10,3600","required":false},{"name":"distance_meters","rules":"sometimes|integer|between:0,5000","required":false},{"name":"max_silence_minutes","rules":"sometimes|integer|between:2,1440","required":false},{"name":"retention_days","rules":"sometimes|integer|between:7,730","required":false},{"name":"reason","rules":"sometimes|nullable|array","required":false},{"name":"reason.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"reason.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false},{"name":"rules","rules":"sometimes|array","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/app-policies\/{policy}","name":"api.v1.app.settings.app-policies","audience":"app","section":"settings","permissions":["app_policy.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The app lock, the confirmation before a punch or blocking screenshots (app_policy.manage): enabled, its options and rules.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"string","pattern":"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"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/app-policies\/{policy}","name":"api.v1.app.settings.app-policies.update","audience":"app","section":"settings","permissions":["app_policy.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"policy","type":"string","pattern":"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"}],"fields":[{"name":"enabled","rules":"required|boolean","required":true},{"name":"methods","rules":"sometimes|in:biometric,biometric_or_passcode","required":false},{"name":"when","rules":"sometimes|in:every_open,after_background","required":false},{"name":"after_minutes","rules":"sometimes|integer|between:1,240","required":false},{"name":"rules","rules":"sometimes|array","required":false},{"name":"inherit","rules":"sometimes|boolean","required":false},{"name":"mode","rules":"sometimes|in:allow,warn,block","required":false},{"name":"max_accounts","rules":"sometimes|integer|between:1,10","required":false},{"name":"rules.*.target_type","rules":"required|in:all,branch,department,section,work_location,group,employee","required":true},{"name":"rules.*.target_id","rules":"nullable|integer","required":false},{"name":"rules.*.effect","rules":"sometimes|in:include,exclude","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/clocking-security","name":"api.v1.app.settings.clocking-security","audience":"app","section":"settings","permissions":["attendance.security.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The checks of the company, or of a branch (branch_id) where it has its own values.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/clocking-security","name":"api.v1.app.settings.clocking-security.update","audience":"app","section":"settings","permissions":["attendance.security.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Send only what changes: checks {check: off|flag|hold|block|on}, the numbers and ranges; branch_id for a branch's own values.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/buddy-punching","name":"api.v1.app.settings.buddy","audience":"app","section":"settings","permissions":["attendance.buddy.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/buddy-punching\/{layer}","name":"api.v1.app.settings.buddy.update","audience":"app","section":"settings","permissions":["attendance.buddy.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"PATCH settings\/buddy-punching\/{layer}: inherit, or mode off|flag|refuse; the layer's own settings; rules.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"layer","type":"string","pattern":"bp_face|bp_device_key|bp_presence|bp_pattern"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/attendance","name":"api.v1.app.settings.attendance","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/attendance","name":"api.v1.app.settings.attendance.update","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Attendance setup: send only what changes.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/attendance\/clock-button","name":"api.v1.app.settings.attendance.clock-button","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"\"Hide the clock button outside the work location\" (docs\/attendance-security.md \u00a717): on or off, and who it reaches. branch_id reads a branch's own value; choices are what that level may name (strict branch isolation).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false}]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/attendance\/clock-button","name":"api.v1.app.settings.attendance.clock-button.update","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Send only what changes: clock_hide_outside_location, scope (all|chosen), branch_ids, department_ids, employee_ids; branch_id for a branch's own value.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/timesheets","name":"api.v1.app.settings.timesheets","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/timesheets","name":"api.v1.app.settings.timesheets.update","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Timesheets setup: send only what changes.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/overtime-limit","name":"api.v1.app.settings.overtime-limit","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/settings\/overtime-limit","name":"api.v1.app.settings.overtime-limit.update","audience":"app","section":"settings","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"ot_limit_scope per_type|total, ot_total_limit_hours, ot_total_limit_period day|week|month.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/setup-forms\/{entity}","name":"api.v1.app.setup-forms.index","audience":"app","section":"setup-forms","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"entity","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/setup-forms\/{entity}","name":"api.v1.app.setup-forms.store","audience":"app","section":"setup-forms","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"entity","type":"string","pattern":null}],"fields":[]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/setup-forms\/{entity}\/{id}","name":"api.v1.app.setup-forms.update","audience":"app","section":"setup-forms","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"entity","type":"string","pattern":null},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/setup-forms\/{entity}\/{id}","name":"api.v1.app.setup-forms.destroy","audience":"app","section":"setup-forms","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"entity","type":"string","pattern":null},{"name":"id","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}\/shares","name":"api.v1.app.shifts.shares","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"HR: who a shift is shared with.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}\/shares","name":"api.v1.app.shifts.share","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"HR: replaces the shares. targets: [{target_type department|group|employee, target_id, can_edit}].","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts","name":"api.v1.app.shifts.index","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts","name":"api.v1.app.shifts.store","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"type","rules":"required|in:regular,flexible,split,roster,roster_flexible","required":true},{"name":"split_kind","rules":"nullable|in:regular,flexible,roster","required":false},{"name":"start_time","rules":"required|date_format:H:i","required":true},{"name":"end_time","rules":"required|date_format:H:i","required":true},{"name":"start_time_2","rules":"nullable|required_if:type,split|date_format:H:i","required":false},{"name":"end_time_2","rules":"nullable|required_if:type,split|date_format:H:i","required":false},{"name":"required_hours","rules":"nullable|numeric|min:0.5|max:24","required":false},{"name":"required_hours_2","rules":"nullable|numeric|min:0.5|max:24","required":false},{"name":"interval_margin_pct","rules":"nullable|integer|between:0,100","required":false},{"name":"days_off","rules":"nullable|array|max:6","required":false},{"name":"days_off.*","rules":"integer|between:0,6","required":false},{"name":"color","rules":"nullable|regex:\/^#[0-9a-fA-F]{6}$\/","required":false},{"name":"break_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"late_grace_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"early_grace_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"flex_grace_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"overtime_after_minutes","rules":"nullable|integer|between:0,1440","required":false},{"name":"punch_in_window_minutes","rules":"nullable|integer|between:0,720","required":false},{"name":"punch_out_grace_minutes","rules":"nullable|integer|between:0,720","required":false},{"name":"extra_intervals","rules":"nullable|array|'max:' . (\\App\\Models\\Shift::MAX_INTERVALS - 2)","required":false},{"name":"extra_intervals.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"extra_intervals.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"extra_intervals.*.required_hours","rules":"nullable|numeric|min:0.25|max:24","required":false},{"name":"functions","rules":"nullable|array","required":false},{"name":"functions.*.attendance_function_id","rules":"nullable|integer|exists:attendance_functions,id","required":false},{"name":"functions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"functions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"work_exceptions","rules":"nullable|array","required":false},{"name":"work_exceptions.*.day","rules":"nullable|integer|between:0,6","required":false},{"name":"work_exceptions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"work_exceptions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"overtime_exceptions","rules":"nullable|array","required":false},{"name":"overtime_exceptions.*.day","rules":"nullable|in:0,1,2,3,4,5,6,off","required":false},{"name":"overtime_exceptions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"overtime_exceptions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"overtime_exceptions.*.basic_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"overtime_exceptions.*.allowances_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"overtime_exceptions.*.method","rules":"nullable|in:hourly,daily","required":false},{"name":"is_default","rules":"sometimes|boolean","required":false},{"name":"archived","rules":"sometimes|boolean","required":false},{"name":"deduct_grace","rules":"sometimes|boolean","required":false},{"name":"exclude_break","rules":"sometimes|boolean","required":false},{"name":"holiday_overtime","rules":"sometimes|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}","name":"api.v1.app.shifts.show","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}\/copy-to-roster","name":"api.v1.app.shifts.copy-to-roster","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A roster copy of a regular shift, as the shift screen's \"Copy to roster\".","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}\/sync","name":"api.v1.app.shifts.sync","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The shift to every active employee without one.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}","name":"api.v1.app.shifts.update","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|array","required":true},{"name":"name.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"name.ar","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"type","rules":"required|in:regular,flexible,split,roster,roster_flexible","required":true},{"name":"split_kind","rules":"nullable|in:regular,flexible,roster","required":false},{"name":"start_time","rules":"required|date_format:H:i","required":true},{"name":"end_time","rules":"required|date_format:H:i","required":true},{"name":"start_time_2","rules":"nullable|required_if:type,split|date_format:H:i","required":false},{"name":"end_time_2","rules":"nullable|required_if:type,split|date_format:H:i","required":false},{"name":"required_hours","rules":"nullable|numeric|min:0.5|max:24","required":false},{"name":"required_hours_2","rules":"nullable|numeric|min:0.5|max:24","required":false},{"name":"interval_margin_pct","rules":"nullable|integer|between:0,100","required":false},{"name":"days_off","rules":"nullable|array|max:6","required":false},{"name":"days_off.*","rules":"integer|between:0,6","required":false},{"name":"color","rules":"nullable|regex:\/^#[0-9a-fA-F]{6}$\/","required":false},{"name":"break_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"late_grace_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"early_grace_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"flex_grace_minutes","rules":"nullable|integer|between:0,600","required":false},{"name":"overtime_after_minutes","rules":"nullable|integer|between:0,1440","required":false},{"name":"punch_in_window_minutes","rules":"nullable|integer|between:0,720","required":false},{"name":"punch_out_grace_minutes","rules":"nullable|integer|between:0,720","required":false},{"name":"extra_intervals","rules":"nullable|array|'max:' . (\\App\\Models\\Shift::MAX_INTERVALS - 2)","required":false},{"name":"extra_intervals.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"extra_intervals.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"extra_intervals.*.required_hours","rules":"nullable|numeric|min:0.25|max:24","required":false},{"name":"functions","rules":"nullable|array","required":false},{"name":"functions.*.attendance_function_id","rules":"nullable|integer|exists:attendance_functions,id","required":false},{"name":"functions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"functions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"work_exceptions","rules":"nullable|array","required":false},{"name":"work_exceptions.*.day","rules":"nullable|integer|between:0,6","required":false},{"name":"work_exceptions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"work_exceptions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"overtime_exceptions","rules":"nullable|array","required":false},{"name":"overtime_exceptions.*.day","rules":"nullable|in:0,1,2,3,4,5,6,off","required":false},{"name":"overtime_exceptions.*.from","rules":"nullable|date_format:H:i","required":false},{"name":"overtime_exceptions.*.to","rules":"nullable|date_format:H:i","required":false},{"name":"overtime_exceptions.*.basic_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"overtime_exceptions.*.allowances_rate","rules":"nullable|numeric|min:0|max:20","required":false},{"name":"overtime_exceptions.*.method","rules":"nullable|in:hourly,daily","required":false},{"name":"is_default","rules":"sometimes|boolean","required":false},{"name":"archived","rules":"sometimes|boolean","required":false},{"name":"deduct_grace","rules":"sometimes|boolean","required":false},{"name":"exclude_break","rules":"sometimes|boolean","required":false},{"name":"holiday_overtime","rules":"sometimes|boolean","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/shifts\/{shift}","name":"api.v1.app.shifts.destroy","audience":"app","section":"shifts","permissions":["attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/signatures","name":"api.v1.app.signatures.index","audience":"app","section":"signatures","permissions":["self.signatures","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Signature requests I may see: mine, and those in my letters scope.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/signatures\/{signature}","name":"api.v1.app.signatures.show","audience":"app","section":"signatures","permissions":["self.signatures","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"signature","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/signatures\/{signature}\/pdf","name":"api.v1.app.signatures.pdf","audience":"app","section":"signatures","permissions":["self.signatures","letters.view","letters.manage"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"A signed document as a PDF file (409 until it is signed).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"signature","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/signatures\/{signature}\/sign","name":"api.v1.app.signatures.sign","audience":"app","section":"signatures","permissions":["self.signatures"],"modules":["hrm"],"rate_limit_per_minute":10,"summary":"Sign my document: password, signature (a PNG data URL), agree.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"signature","type":"integer","pattern":null}],"fields":[{"name":"password","rules":"required|string|fn($attribute, $value, $fail) => \\Illuminate\\Support\\Facades\\Hash::check((string...","required":true},{"name":"signature","rules":"required|string|max:300000|regex:\/^data:image\\\/png;base64,[A-Za-z0-9+\\\/=]+$\/","required":true},{"name":"agree","rules":"accepted","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/signatures\/{signature}\/decline","name":"api.v1.app.signatures.decline","audience":"app","section":"signatures","permissions":["self.signatures"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"signature","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/signatures","name":"api.v1.app.signatures.store","audience":"app","section":"signatures","permissions":["letters.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Send a document to sign: employee_ids, and title + body or letter_id (letters.manage).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_ids","rules":"required|array|min:1","required":true},{"name":"employee_ids.*","rules":"integer","required":false},{"name":"title","rules":"nullable|string","required":false},{"name":"body","rules":"nullable|string","required":false},{"name":"letter_id","rules":"nullable|integer","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/slack","name":"api.v1.app.slack.show","audience":"app","section":"slack","permissions":["integrations.slack.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/slack","name":"api.v1.app.slack.update","audience":"app","section":"slack","permissions":["integrations.slack.manage"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/social-security-salaries","name":"api.v1.app.payroll-rules.ss-salaries","audience":"app","section":"social-security-salaries","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Update social security salaries (base basic | gross) for the active employees in the person's payroll.manage scope.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"base","rules":"required|in:basic,gross","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/stb-encashments\/settings","name":"api.v1.app.stb-encashments.settings","audience":"app","section":"stb-encashments","permissions":["payroll.stb_encashments.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/stb-encashments","name":"api.v1.app.stb-encashments.index","audience":"app","section":"stb-encashments","permissions":["payroll.stb_encashments.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Encashments in my scope, newest first (employee_id filter), with the company's limits.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/stb-encashments","name":"api.v1.app.stb-encashments.store","audience":"app","section":"stb-encashments","permissions":["payroll.stb_encashments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"amount","rules":"required|numeric|gt:0","required":true},{"name":"payment","rules":"required|in:payroll,off_cycle","required":true},{"name":"notes","rules":"$limits['stb_encash_notes_required'] ? 'required' : 'nullable'|string|max:500","required":false},{"name":"external_ref","rules":"nullable|string|max:64","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/stb-encashments\/{encashment}","name":"api.v1.app.stb-encashments.destroy","audience":"app","section":"stb-encashments","permissions":["payroll.stb_encashments.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"encashment","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/stb-encashments\/settings","name":"api.v1.app.stb-encashments.settings.update","audience":"app","section":"stb-encashments","permissions":["payroll_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"stb_encash_max_percent","rules":"required|numeric|min:0|max:100","required":true},{"name":"stb_encash_min_years","rules":"required|numeric|min:0|max:50","required":true},{"name":"stb_encash_every_years","rules":"required|numeric|min:0|max:50","required":true},{"name":"stb_encash_min_amount","rules":"nullable|numeric|min:0","required":false},{"name":"stb_encash_max_amount","rules":"nullable|numeric|min:0|gte:stb_encash_min_amount","required":false},{"name":"stb_encash_after_months","rules":"nullable|integer|min:0|max:600","required":false},{"name":"stb_encash_times","rules":"nullable|integer|min:1|max:100","required":false},{"name":"stb_encash_per_years","rules":"nullable|numeric|min:0|max:50|required_with:stb_encash_times","required":false},{"name":"stb_encash_eligible","rules":"nullable|in:all,citizens,non_citizens","required":false},{"name":"stb_encash_default_payment","rules":"nullable|in:payroll,off_cycle","required":false},{"name":"stb_encash_limited_policy_id","rules":"$policy","required":false},{"name":"stb_encash_unlimited_policy_id","rules":"$policy","required":false},{"name":"stb_encash_income_name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"stb_encash_income_name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"stb_encash_deduction_name_en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"stb_encash_deduction_name_ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/succession\/coverage","name":"api.v1.app.succession.coverage","audience":"app","section":"succession","permissions":["succession.manage.*","succession.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"exposure (critical|exposed|watch|covered), department_id.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/successors\/{successor}","name":"api.v1.app.succession.successors.destroy","audience":"app","section":"successors","permissions":["succession.manage.*","succession.successors.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"successor","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/successors\/{successor}","name":"api.v1.app.succession.successors.show","audience":"app","section":"successors","permissions":["succession.manage.*","succession.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"successor","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/successors\/{successor}\/draft-plan","name":"api.v1.app.succession.draft-plan","audience":"app","section":"successors","permissions":["succession.manage.*","succession.successors.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"apply: true saves the drafted actions on the plan.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"successor","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/successors\/{successor}\/plan-actions","name":"api.v1.app.succession.actions.store","audience":"app","section":"successors","permissions":["succession.manage.*","succession.successors.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title, kind, owner_id, due_date, status, progress, competency_id, notes.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"successor","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|string|max:255","required":true},{"name":"kind","rules":"nullable|in:training,mentoring,assignment,project,other","required":false},{"name":"owner_id","rules":"nullable|integer|exists:employees,id","required":false},{"name":"due_date","rules":"nullable|date","required":false},{"name":"status","rules":"nullable|in:planned,in_progress,done","required":false},{"name":"progress","rules":"nullable|integer|between:0,100","required":false},{"name":"competency_id","rules":"nullable|integer|exists:competencies,id","required":false},{"name":"notes","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/suspensions","name":"api.v1.app.suspensions.index","audience":"app","section":"suspensions","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/suspensions","name":"api.v1.app.suspensions.store","audience":"app","section":"suspensions","permissions":[],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/suspensions\/{suspension}\/{action}","name":"api.v1.app.suspensions.act","audience":"app","section":"suspensions","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"decide, withdraw, resume, decide-resumption, withdraw-resumption, cancel, decide-cancel, cancel-resumption, decide-cancel-resumption","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"suspension","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"decide|withdraw|resume|decide-resumption|withdraw-resumption|cancel|decide-cancel|cancel-resumption|decide-cancel-resumption"}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/suspensions\/{suspension}","name":"api.v1.app.suspensions.destroy","audience":"app","section":"suspensions","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"suspension","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/system-announcements","name":"api.v1.app.system-announcements.index","audience":"app","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/system-announcements\/{announcement}\/dismiss","name":"api.v1.app.system-announcements.dismiss","audience":"app","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/system-announcements\/{announcement}\/acknowledge","name":"api.v1.app.system-announcements.acknowledge","audience":"app","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/task-templates","name":"api.v1.app.task-templates.index","audience":"app","section":"task-templates","permissions":["tasks.templates.manage","tasks.templates.use"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/task-templates","name":"api.v1.app.task-templates.store","audience":"app","section":"task-templates","permissions":["tasks.templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"title {en, ar}, description, priority, due_in_days, related_to (general, onboarding, offboarding).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(200)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(200)","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"priority","rules":"nullable|in:low,normal,high","required":false},{"name":"due_in_days","rules":"nullable|integer|min:0|max:365","required":false},{"name":"related_to","rules":"nullable|in:general,onboarding,offboarding","required":false},{"name":"steps","rules":"nullable|array","required":false},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/task-templates\/{template}","name":"api.v1.app.task-templates.update","audience":"app","section":"task-templates","permissions":["tasks.templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/task-templates\/{template}","name":"api.v1.app.task-templates.destroy","audience":"app","section":"task-templates","permissions":["tasks.templates.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"template","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks","name":"api.v1.app.tasks.index","audience":"app","section":"tasks","permissions":["self.tasks.view","tasks.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"tab (mine, assigned, employees), show (pending, past_due, completed, all), status, kind, employee, template, q, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks","name":"api.v1.app.tasks.store","audience":"app","section":"tasks","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"kind","rules":"nullable|Rule::in(array_diff(array_keys(\\App\\Models\\Task::KINDS), \\App\\Models\\Task::WORKF...","required":false},{"name":"task_template_id","rules":"nullable|integer|exists:task_templates,id","required":false},{"name":"title","rules":"$kind === 'custom' ? 'required' : 'nullable'|string|max:200","required":false},{"name":"description","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"assign_mode","rules":"nullable|in:individual,group","required":false},{"name":"employee_id","rules":"$group ? 'nullable' : 'required'|integer|Rule::in($assignable)","required":false},{"name":"group_dimension","rules":"$group ? 'required' : 'nullable'|Rule::in(array_keys(self::dimensions()))","required":false},{"name":"group_value","rules":"$group ? 'required' : 'nullable'|string|max:50","required":false},{"name":"due_date","rules":"nullable|date","required":false},{"name":"priority","rules":"nullable|in:low,normal,high","required":false},{"name":"notes_required","rules":"nullable|boolean","required":false},{"name":"attachments_required","rules":"nullable|boolean","required":false},{"name":"proof_required","rules":"nullable|boolean","required":false},{"name":"steps","rules":"nullable|array","required":false},{"name":"document_type_id","rules":"$kind === 'document_upload' ? 'required' : 'nullable'|integer|exists:document_types,id","required":false},{"name":"document_id","rules":"$kind === 'document_download' ? 'required' : 'nullable'|integer|exists:employee_documents,id","required":false},{"name":"asset_type_id","rules":"$kind === 'give_asset' ? 'required' : 'nullable'|integer|exists:asset_types,id","required":false},{"name":"target_employee_id","rules":"in_array($kind, ['give_asset', 'take_asset'], true) ? 'required' : 'nullable'|integer","required":false},{"name":"asset_id","rules":"$kind === 'take_asset' ? 'required' : 'nullable'|integer|exists:assets,id","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/bulk-delete","name":"api.v1.app.tasks.bulk-destroy","audience":"app","section":"tasks","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"tasks: ids of pending tasks to delete.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/settings","name":"api.v1.app.tasks.settings","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"All the task settings: the photo switches and what a new task starts with (docs\/communication.md \u00a75\u0647\u0640).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/settings","name":"api.v1.app.tasks.settings.update","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/settings\/branches\/{branch}","name":"api.v1.app.tasks.settings.branch","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/settings\/branches\/{branch}","name":"api.v1.app.tasks.settings.branch.update","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof","name":"api.v1.app.tasks.proof.index","audience":"app","section":"tasks","permissions":["tasks.proof.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The tasks with photos of the people in scope, for a manager: show (open, flagged, done, all), employee, q, page, per_page.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}","name":"api.v1.app.tasks.show","audience":"app","section":"tasks","permissions":["self.tasks.view","tasks.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/status","name":"api.v1.app.tasks.status","audience":"app","section":"tasks","permissions":["self.tasks.update","tasks.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"status: todo, in_progress or done (a task that needs its form is completed with \/complete).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/complete","name":"api.v1.app.tasks.complete","audience":"app","section":"tasks","permissions":["self.tasks.update","tasks.manage"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"completion_notes, attachments[] (files), attachment (the document of a document upload), expires_at, asset_id (give asset).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[{"name":"completion_notes","rules":"$task->notes_required ? 'required' : 'nullable'|string|'max:' . \\App\\Support\\Limits::chars(2000)","required":false},{"name":"attachment","rules":"$task->kind === 'document_upload' ? 'required' : 'prohibited'|nullable|file|mimes:pdf,jpg,jpeg,png,webp,doc,docx,xls,xlsx|max:10240","required":false},{"name":"expires_at","rules":"nullable|date","required":false},{"name":"attachments","rules":"$task->attachments_required && $task->kind !== 'document_upload' ? 'required' :...|array|'max:' . (int) \\App\\Support\\Field\\FieldSettings::value('task_attachment_max_file...","required":false},{"name":"attachments.*","rules":"file|mimes:png,jpg,jpeg,pdf,doc,docx,txt,rtf|'max:' . 1024 * (int) \\App\\Support\\Field\\FieldSettings::value('task_attachment_m...","required":false},{"name":"asset_id","rules":"$task->kind === 'give_asset' ? 'required' : 'nullable'|integer|exists:assets,id","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/confirm-receipt","name":"api.v1.app.tasks.confirm-receipt","audience":"app","section":"tasks","permissions":["self.tasks.update","tasks.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The employee who got a handed-over asset confirms receiving it (give-asset tasks awaiting confirmation).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}","name":"api.v1.app.tasks.destroy","audience":"app","section":"tasks","permissions":[],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/mine","name":"api.v1.app.tasks.proof.mine","audience":"app","section":"tasks","permissions":["self.tasks.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The open tasks that ask for proof, with photos and rules, for working offline.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/proof\/mine","name":"api.v1.app.tasks.proof.own","audience":"app","section":"tasks","permissions":["self.tasks.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"One of the employee's own tasks with every photo they took, open or finished, waived or voided included. Anyone else's: 404.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/evidence\/video","name":"api.v1.app.tasks.video.start","audience":"app","section":"tasks","permissions":["self.tasks.capture"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"meta, signature, bytes, chunk_bytes. Again for the same client_uuid: where it got to, or the record if it's all there.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[{"name":"meta","rules":"required|string|max:20000","required":true},{"name":"signature","rules":"required|string|max:500","required":true},{"name":"bytes","rules":"required|integer|min:1","required":true},{"name":"chunk_bytes","rules":"required|integer|min:1024|'max:' . \\Illuminate\\Http\\UploadedFile::getMaxFilesize()","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/evidence\/video\/{upload}\/chunk","name":"api.v1.app.tasks.video.chunk","audience":"app","section":"tasks","permissions":["self.tasks.capture"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"offset, chunk (a file). A chunk that already arrived changes nothing, and the answer always says how much the server has.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null},{"name":"upload","type":"integer","pattern":null}],"fields":[{"name":"offset","rules":"required|integer|min:0","required":true},{"name":"chunk","rules":"required|file","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/evidence\/video\/{upload}\/finish","name":"api.v1.app.tasks.video.finish","audience":"app","section":"tasks","permissions":["self.tasks.capture"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"All there: the same checks as a photo. The answer is the same receipt as a photo's.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null},{"name":"upload","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/evidence","name":"api.v1.app.tasks.proof.upload","audience":"app","section":"tasks","permissions":["self.tasks.capture"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"multipart: photo, meta (with task_id, not job_id), signature. While the switch is off the phone gets 403 and keeps the draft.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[{"name":"photo","rules":"required|file|mimetypes:image\/jpeg|'max:' . 1024 * (int) \\App\\Support\\Field\\FieldSettings::value('task_photo_max_mb...","required":true},{"name":"meta","rules":"required|string|max:20000","required":true},{"name":"signature","rules":"required|string|max:500","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/proof","name":"api.v1.app.tasks.proof.show","audience":"app","section":"tasks","permissions":["tasks.proof.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/proof\/request-upload","name":"api.v1.app.tasks.proof.request-upload","audience":"app","section":"tasks","permissions":["tasks.proof.request_upload"],"modules":["hrm"],"rate_limit_per_minute":30,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[{"name":"note","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(500)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/{task}\/proof\/waive","name":"api.v1.app.tasks.proof.waive","audience":"app","section":"tasks","permissions":["tasks.proof.waive"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"task","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"required|string|min:3|'max:' . \\App\\Support\\Limits::chars(1000)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/evidence\/{evidence}\/photo","name":"api.v1.app.tasks.proof.photo","audience":"app","section":"tasks","permissions":["self.tasks.view","tasks.proof.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The photo: its employee, or who may see the task's proof. ?size=thumb","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/evidence\/{evidence}\/void","name":"api.v1.app.tasks.proof.void","audience":"app","section":"tasks","permissions":["tasks.proof.void"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"reason (required).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"evidence","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"required|string|min:3|'max:' . \\App\\Support\\Limits::chars(1000)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/settings","name":"api.v1.app.tasks.proof.settings","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/settings","name":"api.v1.app.tasks.proof.settings.update","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/settings\/branches\/{branch}","name":"api.v1.app.tasks.proof.settings.branch","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/tasks\/proof\/settings\/branches\/{branch}","name":"api.v1.app.tasks.proof.settings.branch.update","audience":"app","section":"tasks","permissions":["tasks.proof.settings"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/team-leaves","name":"api.v1.app.leaves.team","audience":"app","section":"team-leaves","permissions":["leaves.view"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The team's leaves: status (pending by default, or all), type, employee, from, to.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"nullable|in:pending,approved,rejected,withdrawn,all","required":false},{"name":"kind","rules":"nullable|in:days,hours","required":false},{"name":"type","rules":"nullable|integer","required":false},{"name":"employee","rules":"nullable|integer","required":false},{"name":"from","rules":"nullable|date","required":false},{"name":"to","rules":"nullable|date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/team-leaves","name":"api.v1.app.leaves.for-employee","audience":"app","section":"team-leaves","permissions":["leaves.record"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"HR adds approved leave for an employee.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true},{"name":"leave_type_id","rules":"required|exists:leave_types,id","required":true},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"start_time","rules":"nullable|date_format:H:i","required":false},{"name":"end_time","rules":"nullable|date_format:H:i","required":false},{"name":"reason","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule","name":"api.v1.app.team-schedule.index","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The shifts shared with the caller (every shift for HR), with whether they may change each, and their team.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule\/assign","name":"api.v1.app.team-schedule.assign","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"employees, shift_id (or \"off\"), start_date, end_date (none = open-ended), conflict replace|keep, draft.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employees","rules":"required|array|min:1|max:500","required":true},{"name":"employees.*","rules":"integer","required":false},{"name":"shift_id","rules":"required","required":true},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false},{"name":"conflict","rules":"sometimes|in:replace,keep","required":false},{"name":"draft","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule\/clear","name":"api.v1.app.team-schedule.clear","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employees","rules":"required|array|min:1|max:500","required":true},{"name":"employees.*","rules":"integer","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"nullable|date|after_or_equal:start_date","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule\/plan","name":"api.v1.app.team-schedule.plan","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"shift_ids","rules":"required|array|min:1","required":true},{"name":"shift_ids.*","rules":"integer","required":false},{"name":"employees","rules":"nullable|array|max:500","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"required|date|after_or_equal:start_date","required":true},{"name":"max_in_a_row","rules":"nullable|integer|between:1,14","required":false},{"name":"days_off_a_week","rules":"nullable|integer|between:0,6","required":false},{"name":"max_weekly_hours","rules":"nullable|numeric|between:1,168","required":false},{"name":"fair_nights","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule\/copy","name":"api.v1.app.team-schedule.copy","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"source_from, source_to, target_from, target_to, employees (none = the whole team), draft.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employees","rules":"nullable|array|max:500","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"source_from","rules":"required|date","required":true},{"name":"source_to","rules":"required|date|after_or_equal:source_from","required":true},{"name":"target_from","rules":"required|date","required":true},{"name":"target_to","rules":"required|date|after_or_equal:target_from","required":true},{"name":"draft","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule\/publish","name":"api.v1.app.team-schedule.publish","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"start_date, end_date, employees (none = the whole team).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employees","rules":"nullable|array|max:500","required":false},{"name":"employees.*","rules":"integer","required":false},{"name":"start_date","rules":"required|date","required":true},{"name":"end_date","rules":"required|date|after_or_equal:start_date","required":true}]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/team-schedule\/shifts\/{shift}","name":"api.v1.app.team-schedule.shift.update","audience":"app","section":"team-schedule","permissions":["shifts.assign_team","attendance_setup.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A shift's definition, where a share lets the caller change it (HR always). Same fields as the shift setup.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"shift","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/template-conflicts","name":"api.v1.app.devices.conflicts","audience":"app","section":"template-conflicts","permissions":["devices.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Slots devices hold different data for, with every version (no template data).","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/terminations","name":"api.v1.app.terminations.index","audience":"app","section":"terminations","permissions":["employees.terminate"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/timesheets","name":"api.v1.app.timesheets.index","audience":"app","section":"timesheets","permissions":["self.timesheets.view","timesheets.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"My period holding ?week (a date), with its entries, and all my periods.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/timesheets","name":"api.v1.app.timesheets.store","audience":"app","section":"timesheets","permissions":["self.timesheets.log"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"project_id","rules":"required|exists:org_units,id","required":true},{"name":"work_date","rules":"required|date|before_or_equal:today","required":true},{"name":"hours","rules":"required|numeric|min:0.25|'max:' . $max","required":true},{"name":"description","rules":"\\App\\Models\\CompanySetting::get('ts_notes_required', $companyId) === '1' ? 'requ...|string|'max:' . \\App\\Support\\Limits::chars(255)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/timesheets\/submit","name":"api.v1.app.timesheets.submit","audience":"app","section":"timesheets","permissions":["self.timesheets.log"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/timesheets\/{entry}","name":"api.v1.app.timesheets.destroy","audience":"app","section":"timesheets","permissions":["self.timesheets.log"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"entry","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/timesheets\/review","name":"api.v1.app.timesheets.review","audience":"app","section":"timesheets","permissions":["timesheets.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"Submitted periods of the employees in reach.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/timesheets\/review","name":"api.v1.app.timesheets.decide","audience":"app","section":"timesheets","permissions":["timesheets.approve"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"employee_id","rules":"required|integer","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/token","name":"api.v1.app.token.destroy","audience":"app","section":"token","permissions":[],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/tv","name":"api.v1.app.tv.index","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"The TV setup: channels, devices (no tokens), breaking news and slides.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/channels","name":"api.v1.app.tv.channels.store","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name, layout (full, split, quad), areas: one list of widgets per area.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|string|max:100","required":true},{"name":"layout","rules":"required|in:full,split,quad","required":true},{"name":"areas","rules":"required|array","required":true},{"name":"areas.*","rules":"nullable|array","required":false},{"name":"areas.*.*","rules":"in:today,announcements,birthdays,off_today,coming_up,content,clock,attendance_qr","required":false},{"name":"is_default","rules":"nullable|boolean","required":false},{"name":"active","rules":"nullable|boolean","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/channels\/{channel}","name":"api.v1.app.tv.channels.update","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"channel","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/channels\/{channel}","name":"api.v1.app.tv.channels.destroy","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"channel","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/devices","name":"api.v1.app.tv.devices.store","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"name, branch_id, work_location_id (site), tv_channel_id. The answer carries the TV's link and token, once.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"required|string|max:100","required":true},{"name":"branch_id","rules":"nullable|integer|exists:branches,id","required":false},{"name":"tv_channel_id","rules":"nullable|integer|exists:tv_channels,id","required":false},{"name":"work_location_id","rules":"nullable|integer|exists:org_units,id","required":false},{"name":"locale","rules":"nullable|in:en,ar","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/devices\/{device}","name":"api.v1.app.tv.devices.update","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/devices\/{device}\/token","name":"api.v1.app.tv.devices.rotate","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"A new link; the old one stops working. The answer carries the new token, once.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/devices\/{device}","name":"api.v1.app.tv.devices.destroy","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"device","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/items","name":"api.v1.app.tv.items.store","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"kind (news, slide), title {en, ar}, body {en, ar}, starts_on, ends_on, active, image (file), remove_image.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"kind","rules":"required|in:news,slide,video","required":true},{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"body","rules":"nullable|array","required":false},{"name":"body.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"body.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"starts_on","rules":"nullable|date","required":false},{"name":"ends_on","rules":"nullable|date|after_or_equal:starts_on","required":false},{"name":"image","rules":"nullable|image|mimes:jpg,jpeg,png,webp|max:10240","required":false},{"name":"video","rules":"($input['kind'] ?? null) === 'video' && !$item?->video_path ? 'required' : 'null...|file|mimetypes:video\/mp4,video\/webm|max:10240","required":false}]},{"methods":["PATCH","POST"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/items\/{item}","name":"api.v1.app.tv.items.update","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"item","type":"integer","pattern":null}],"fields":[{"name":"kind","rules":"required|in:news,slide,video","required":true},{"name":"title","rules":"required|array","required":true},{"name":"title.en","rules":"required|string|'max:' . \\App\\Support\\Limits::chars(150)","required":true},{"name":"title.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(150)","required":false},{"name":"body","rules":"nullable|array","required":false},{"name":"body.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"body.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(1000)","required":false},{"name":"starts_on","rules":"nullable|date","required":false},{"name":"ends_on","rules":"nullable|date|after_or_equal:starts_on","required":false},{"name":"image","rules":"nullable|image|mimes:jpg,jpeg,png,webp|max:10240","required":false},{"name":"video","rules":"($input['kind'] ?? null) === 'video' && !$item?->video_path ? 'required' : 'null...|file|mimetypes:video\/mp4,video\/webm|max:10240","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/tv\/items\/{item}","name":"api.v1.app.tv.items.destroy","audience":"app","section":"tv","permissions":["tv.manage"],"modules":["hrm"],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"item","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/users","name":"api.v1.app.users.index","audience":"app","section":"users","permissions":["users.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/app\/companies\/{company}\/users\/{user}","name":"api.v1.app.users.update","audience":"app","section":"users","permissions":["users.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"required|in:active,inactive","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/users\/{user}\/two-factor\/reset","name":"api.v1.app.users.two-factor.reset","audience":"app","section":"users","permissions":["users.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/webhook-deliveries","name":"api.v1.app.webhooks.deliveries","audience":"app","section":"webhook-deliveries","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"GET webhook-deliveries?webhook_id=&status=delivered|failed","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/webhook-deliveries\/{delivery}","name":"api.v1.app.webhooks.deliveries.show","audience":"app","section":"webhook-deliveries","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"delivery","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/webhook-deliveries\/{delivery}\/resend","name":"api.v1.app.webhooks.deliveries.resend","audience":"app","section":"webhook-deliveries","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"delivery","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/webhook-events","name":"api.v1.app.webhooks.events","audience":"app","section":"webhook-events","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/app\/companies\/{company}\/webhooks","name":"api.v1.app.webhooks.index","audience":"app","section":"webhooks","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/webhooks","name":"api.v1.app.webhooks.store","audience":"app","section":"webhooks","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"POST webhooks: the signing secret is in the answer this once.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"sometimes|nullable|string|max:100","required":false},{"name":"url","rules":"$req|url:http,https|max:500","required":false},{"name":"events","rules":"$req|array|min:1","required":false},{"name":"events.*","rules":"Rule::in($events)","required":false},{"name":"format","rules":"sometimes|in:json,xml","required":false},{"name":"active","rules":"sometimes|boolean","required":false},{"name":"group","rules":"sometimes|nullable|in:financial_employee,financial_journal","required":false},{"name":"api_key_id","rules":"sometimes|nullable|integer|exists:api_keys,id","required":false}]},{"methods":["PATCH","PUT"],"path":"\/api\/v1\/app\/companies\/{company}\/webhooks\/{webhook}","name":"api.v1.app.webhooks.update","audience":"app","section":"webhooks","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"webhook","type":"integer","pattern":null}],"fields":[{"name":"name","rules":"sometimes|nullable|string|max:100","required":false},{"name":"url","rules":"$req|url:http,https|max:500","required":false},{"name":"events","rules":"$req|array|min:1","required":false},{"name":"events.*","rules":"Rule::in($events)","required":false},{"name":"format","rules":"sometimes|in:json,xml","required":false},{"name":"active","rules":"sometimes|boolean","required":false},{"name":"group","rules":"sometimes|nullable|in:financial_employee,financial_journal","required":false},{"name":"api_key_id","rules":"sometimes|nullable|integer|exists:api_keys,id","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/app\/companies\/{company}\/webhooks\/{webhook}","name":"api.v1.app.webhooks.destroy","audience":"app","section":"webhooks","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"webhook","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/webhooks\/{webhook}\/rotate-secret","name":"api.v1.app.webhooks.rotate","audience":"app","section":"webhooks","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":60,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"webhook","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/app\/companies\/{company}\/webhooks\/{webhook}\/test","name":"api.v1.app.webhooks.test","audience":"app","section":"webhooks","permissions":["integrations.api_keys.manage"],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"webhook","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/ai","name":"api.v1.platform.ai.show","audience":"platform","section":"ai","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/ai","name":"api.v1.platform.ai.update","audience":"platform","section":"ai","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/ai\/models","name":"api.v1.platform.ai.models","audience":"platform","section":"ai","permissions":[],"modules":[],"rate_limit_per_minute":20,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-activity","name":"api.v1.platform.app-activity.index","audience":"platform","section":"app-activity","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET app-activity: every phone's sign-in activity (filters: user_id, install_id, device_id, event, result, from, to; page, per_page).","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-debug\/accounts","name":"api.v1.platform.app-debug.accounts","audience":"platform","section":"app-debug","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET app-debug\/accounts: the accounts with debug mode, on or ended.","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/app-debug\/accounts\/{user}","name":"api.v1.platform.app-debug.accounts.update","audience":"platform","section":"app-debug","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"PUT app-debug\/accounts\/{user}: on (boolean), hours (1\u2013168, default 24; null = no end), send (ask the phone for a report).","parameters":[{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/app-debug\/accounts\/{user}\/request","name":"api.v1.platform.app-debug.accounts.request","audience":"platform","section":"app-debug","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"POST app-debug\/accounts\/{user}\/request: the phone sends a report at its next open.","parameters":[{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-debug\/reports","name":"api.v1.platform.app-debug.reports","audience":"platform","section":"app-debug","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET app-debug\/reports: newest first; filters user_id, install_id, build.","parameters":[],"fields":[{"name":"user_id","rules":"nullable|integer","required":false},{"name":"install_id","rules":"nullable|string|max:64","required":false},{"name":"build","rules":"nullable|string|max:20","required":false},{"name":"per_page","rules":"nullable|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(100)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-debug\/reports\/{report}","name":"api.v1.platform.app-debug.reports.show","audience":"platform","section":"app-debug","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET app-debug\/reports\/{report}: the whole report.","parameters":[{"name":"report","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-fleet","name":"api.v1.platform.app-fleet.index","audience":"platform","section":"app-fleet","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Phones and versions: every phone with the app, with the summary. Filters as AppFleet::validateFilters; page, per_page.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-fleet\/people\/{user}\/context","name":"api.v1.platform.app-fleet.person.context","audience":"platform","section":"app-fleet","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET app-fleet\/people\/{user}\/context: a person's phone details, latest per phone and the history (filters install_id, category, limit).","parameters":[{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/app-fleet\/phones\/{install}\/test-push","name":"api.v1.platform.app-fleet.test-push","audience":"platform","section":"app-fleet","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"POST app-fleet\/phones\/{install}\/test-push: one test notification to one phone (docs\/notifications.md \u00ab\u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a\u00bb).","parameters":[{"name":"install","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-fleet\/people\/{user}","name":"api.v1.platform.app-fleet.person","audience":"platform","section":"app-fleet","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET app-fleet\/people\/{user}: one person's phones with their IPs and timelines.","parameters":[{"name":"user","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-releases","name":"api.v1.platform.app-releases.index","audience":"platform","section":"app-releases","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/app-releases\/sync","name":"api.v1.platform.app-releases.sync","audience":"platform","section":"app-releases","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"Reads both stores' latest version now (also hourly), and returns each check.","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/app-releases\/{platform}","name":"api.v1.platform.app-releases.update","audience":"platform","section":"app-releases","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"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.","parameters":[{"name":"platform","type":"string","pattern":"android|ios"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/app-releases\/companies\/{company}","name":"api.v1.platform.app-releases.overrides.update","audience":"platform","section":"app-releases","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"mode stricter (min_android and\/or min_ios), exempt, or none to remove the company's rule.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/app-releases\/{platform}\/impact","name":"api.v1.platform.app-releases.impact","audience":"platform","section":"app-releases","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"?version=: how many phones and people a minimum of that version would block, against today (default: forcing the latest).","parameters":[{"name":"platform","type":"string","pattern":"android|ios"}],"fields":[{"name":"version","rules":"nullable|string|regex:\/^\\d{1,5}(\\.\\d{1,5}){0,3}$\/","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/app-releases\/{platform}\/nudge","name":"api.v1.platform.app-releases.nudge","audience":"platform","section":"app-releases","permissions":[],"modules":[],"rate_limit_per_minute":5,"summary":"\"Please update\": version_state outdated (default) or below_min; a push linking to the store. Needs platform.broadcast too.","parameters":[{"name":"platform","type":"string","pattern":"android|ios"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/appearance","name":"api.v1.platform.appearance.show","audience":"platform","section":"appearance","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/appearance","name":"api.v1.platform.appearance.update","audience":"platform","section":"appearance","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/appearance","name":"api.v1.platform.appearance.reset","audience":"platform","section":"appearance","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/backups","name":"api.v1.platform.backups.status","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/backups\/runs","name":"api.v1.platform.backups.runs.index","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/backups\/runs\/{run}","name":"api.v1.platform.backups.runs.show","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/backups\/restore-tests","name":"api.v1.platform.backups.restore-tests.index","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/backups\/destinations","name":"api.v1.platform.backups.destinations.index","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/backups\/settings","name":"api.v1.platform.backups.settings.update","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/backups\/passphrase","name":"api.v1.platform.backups.passphrase.update","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[{"name":"passphrase","rules":"required|string","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/backups\/destinations","name":"api.v1.platform.backups.destinations.store","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/backups\/destinations\/{destination}","name":"api.v1.platform.backups.destinations.update","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"destination","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/backups\/destinations\/{destination}","name":"api.v1.platform.backups.destinations.destroy","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"destination","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/backups\/destinations\/{destination}\/connect-link","name":"api.v1.platform.backups.destinations.connect-link","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"A link to open in a browser signed in to the panel; the sign-in on the service happens there.","parameters":[{"name":"destination","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/backups\/destinations\/{destination}\/test","name":"api.v1.platform.backups.destinations.test","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"destination","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/backups\/runs","name":"api.v1.platform.backups.runs.store","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/backups\/runs\/{run}\/restore-test","name":"api.v1.platform.backups.runs.restore-test","audience":"platform","section":"backups","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/branches","name":"api.v1.platform.companies.branches.index","audience":"platform","section":"branches","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/branches","name":"api.v1.platform.companies.branches.store","audience":"platform","section":"branches","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Within the license's branch limit (platform.companies). Logos as multipart files.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/platform\/companies\/{company}\/branches\/{branch}","name":"api.v1.platform.companies.branches.update","audience":"platform","section":"branches","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/broadcasts\/preview","name":"api.v1.platform.broadcasts.preview","audience":"platform","section":"broadcasts","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"company_ids, roles, user_ids, branch_ids, install_ids, platform, version_state, version: how many people, phones and emails a send would reach.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/broadcasts","name":"api.v1.platform.broadcasts.index","audience":"platform","section":"broadcasts","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/broadcasts","name":"api.v1.platform.broadcasts.store","audience":"platform","section":"broadcasts","permissions":[],"modules":[],"rate_limit_per_minute":5,"summary":"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.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/broadcasts\/{broadcast}","name":"api.v1.platform.broadcasts.show","audience":"platform","section":"broadcasts","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"The send with a page of its people and what each channel answered; ?result=failed|no_device|\u2026 filters push results.","parameters":[{"name":"broadcast","type":"integer","pattern":null}],"fields":[{"name":"result","rules":"nullable|string|max:20","required":false},{"name":"per_page","rules":"nullable|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(200)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/broadcasts\/{broadcast}\/cancel","name":"api.v1.platform.broadcasts.cancel","audience":"platform","section":"broadcasts","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Cancels a send that hasn't started (scheduled or still waiting).","parameters":[{"name":"broadcast","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/buddy-punching","name":"api.v1.platform.buddy-punching.show","audience":"platform","section":"buddy-punching","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET buddy-punching: the platform default of each buddy-punching layer and who set their own (docs\/attendance-security.md \u00a719).","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/buddy-punching\/{layer}","name":"api.v1.platform.buddy-punching.update","audience":"platform","section":"buddy-punching","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"PUT buddy-punching\/{layer}: mode off|flag|refuse and the layer's own settings.","parameters":[{"name":"layer","type":"string","pattern":"bp_face|bp_device_key|bp_presence|bp_pattern"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/calculator-rule-sets","name":"api.v1.platform.calculator-rule-sets.index","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/calculator-rule-sets","name":"api.v1.platform.calculator-rule-sets.store","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[{"name":"country_code","rules":"required|string|size:2|fn($a, $v, $fail) => \\App\\Support\\Countries::exists($v) ? null : $fail(__('Unkno...","required":true},{"name":"variant","rules":"nullable|string|max:40|regex:\/^[a-z0-9-]+$\/","required":false},{"name":"variant_label","rules":"nullable|array","required":false},{"name":"variant_label.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"variant_label.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(100)","required":false},{"name":"effective_from","rules":"required|date_format:Y-m-d","required":true},{"name":"copy_from","rules":"nullable|integer|exists:calculator_rule_sets,id","required":false},{"name":"notes","rules":"nullable|array","required":false},{"name":"allow_estimates","rules":"sometimes|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/calculator-rule-sets\/{ruleSet}","name":"api.v1.platform.calculator-rule-sets.show","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"ruleSet","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/calculator-rule-sets\/{ruleSet}","name":"api.v1.platform.calculator-rule-sets.update","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"ruleSet","type":"integer","pattern":null}],"fields":[{"name":"rules","rules":"sometimes|array","required":false},{"name":"notes","rules":"sometimes|nullable|array","required":false},{"name":"notes.en","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(3000)","required":false},{"name":"notes.ar","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(3000)","required":false},{"name":"allow_estimates","rules":"sometimes|boolean","required":false},{"name":"variant_label","rules":"sometimes|nullable|array","required":false},{"name":"effective_from","rules":"sometimes|date_format:Y-m-d","required":false},{"name":"position","rules":"sometimes|integer|min:0|max:100","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/calculator-rule-sets\/{ruleSet}\/verify","name":"api.v1.platform.calculator-rule-sets.verify","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"ruleSet","type":"integer","pattern":null}],"fields":[{"name":"keys","rules":"required|array|min:1","required":true},{"name":"keys.*","rules":"string","required":false},{"name":"verified","rules":"sometimes|boolean","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/calculator-rule-sets\/{ruleSet}\/publish","name":"api.v1.platform.calculator-rule-sets.publish","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"ruleSet","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/calculator-rule-sets\/{ruleSet}\/unpublish","name":"api.v1.platform.calculator-rule-sets.unpublish","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"ruleSet","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/calculator-rule-sets\/{ruleSet}\/restore\/{revision}","name":"api.v1.platform.calculator-rule-sets.restore","audience":"platform","section":"calculator-rule-sets","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"ruleSet","type":"integer","pattern":null},{"name":"revision","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/companies\/{company}","name":"api.v1.platform.companies.destroy","audience":"platform","section":"companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Body: confirm_name (the name or slug), confirm: true, force: true when it has payroll or attendance, reason.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies","name":"api.v1.platform.companies.index","audience":"platform","section":"companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies","name":"api.v1.platform.companies.store","audience":"platform","section":"companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Response includes the owner's temporary password once, when a new user was created.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}","name":"api.v1.platform.companies.show","audience":"platform","section":"companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/platform\/companies\/{company}","name":"api.v1.platform.companies.update","audience":"platform","section":"companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/company-availability","name":"api.v1.platform.company-availability","audience":"platform","section":"company-availability","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/deleted-companies","name":"api.v1.platform.deleted-companies.index","audience":"platform","section":"deleted-companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/deleted-companies\/{company}\/restore","name":"api.v1.platform.deleted-companies.restore","audience":"platform","section":"deleted-companies","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/deletion-preview","name":"api.v1.platform.companies.deletion-preview","audience":"platform","section":"deletion-preview","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"What a deletion would lose: the payroll runs and attendance that make it \"real\", employees and accounts.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/demo\/reset","name":"api.v1.platform.demo.reset","audience":"platform","section":"demo","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/device-data","name":"api.v1.platform.device-data.show","audience":"platform","section":"device-data","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET device-data: the platform defaults of location as a condition of using the app and of each category of phone details.","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/device-data","name":"api.v1.platform.device-data.update","audience":"platform","section":"device-data","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"PUT device-data: location_required {enabled, precise, reason_en, reason_ar}, categories {category: {enabled, retention_days}}.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/domains","name":"api.v1.platform.domains.index","audience":"platform","section":"domains","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/event-location","name":"api.v1.platform.event-location.show","audience":"platform","section":"event-location","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET event-location: the platform default for keeping the phone's GPS point with sign-ins and opens, and the companies with their own.","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/event-location","name":"api.v1.platform.event-location.update","audience":"platform","section":"event-location","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"PUT event-location: mode auto (companies with live location or the clock-in geofence) | on | off.","parameters":[],"fields":[{"name":"mode","rules":"required|Rule::in(self::MODES)","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/flash-messages","name":"api.v1.platform.flash-messages.show","audience":"platform","section":"flash-messages","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/flash-messages","name":"api.v1.platform.flash-messages.update","audience":"platform","section":"flash-messages","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"position, duration_seconds, auto_close: any of them; the rest keep their value.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/leads","name":"api.v1.platform.leads.index","audience":"platform","section":"leads","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/leads\/{lead}","name":"api.v1.platform.leads.show","audience":"platform","section":"leads","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"lead","type":"string","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/leads\/{lead}","name":"api.v1.platform.leads.update","audience":"platform","section":"leads","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"lead","type":"string","pattern":null}],"fields":[{"name":"status","rules":"sometimes|in:new,contacted,closed","required":false},{"name":"notes","rules":"sometimes|nullable|string|'max:' . \\App\\Support\\Limits::chars(5000)","required":false},{"name":"assigned_to","rules":"sometimes|nullable|integer|Rule::exists(\\App\\Models\\User::class, 'id')->where('is_admin', true)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/leads\/{lead}\/archive","name":"api.v1.platform.leads.archive","audience":"platform","section":"leads","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Archive (soft delete, restorable); messages are never deleted.","parameters":[{"name":"lead","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/leads\/{lead}\/restore","name":"api.v1.platform.leads.restore","audience":"platform","section":"leads","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"lead","type":"string","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/licenses","name":"api.v1.platform.companies.licenses.index","audience":"platform","section":"licenses","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/licenses","name":"api.v1.platform.companies.licenses.store","audience":"platform","section":"licenses","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/companies\/{company}\/licenses\/{license}","name":"api.v1.platform.companies.licenses.update","audience":"platform","section":"licenses","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Edits a license in place; fields left out keep their value (platform.companies).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"license","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/licenses\/{license}\/suspend","name":"api.v1.platform.companies.licenses.suspend","audience":"platform","section":"licenses","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"license","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/licenses\/{license}\/reactivate","name":"api.v1.platform.companies.licenses.reactivate","audience":"platform","section":"licenses","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"license","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/companies\/{company}\/licenses\/{license}","name":"api.v1.platform.companies.licenses.destroy","audience":"platform","section":"licenses","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Never the only license or the one in effect (422).","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"license","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/limits","name":"api.v1.platform.limits.show","audience":"platform","section":"limits","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/limits","name":"api.v1.platform.limits.update","audience":"platform","section":"limits","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"values: {key: number, or null for the built-in default}; sizes in KB. Only the keys sent change.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/login-designs","name":"api.v1.platform.login-designs.index","audience":"platform","section":"login-designs","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/login-designs\/areas","name":"api.v1.platform.login-designs.areas","audience":"platform","section":"login-designs","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/login-designs\/{design}","name":"api.v1.platform.login-designs.update","audience":"platform","section":"login-designs","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"design","type":"string","pattern":"[a-z]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/messaging\/{channel}","name":"api.v1.platform.messaging.show","audience":"platform","section":"messaging","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Secrets are never returned, only whether one is saved.","parameters":[{"name":"channel","type":"string","pattern":"mail|whatsapp"}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/messaging\/{channel}","name":"api.v1.platform.messaging.update","audience":"platform","section":"messaging","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"channel","type":"string","pattern":"mail|whatsapp"}],"fields":[{"name":"password","rules":"required","required":true},{"name":"access_token","rules":"required","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/messaging\/mail\/test","name":"api.v1.platform.messaging.mail.test","audience":"platform","section":"messaging","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"One test email through the saved settings; a failure is a 422 with the reason explained (docs\/mail.md).","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/messaging\/mail\/health","name":"api.v1.platform.messaging.mail.health","audience":"platform","section":"messaging","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Is email going anywhere: the sending method, last 24 hours, queued and failed (docs\/mail.md).","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/messaging\/mail\/deliveries","name":"api.v1.platform.messaging.mail.deliveries","audience":"platform","section":"messaging","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Email deliveries, newest first; ?status=sent|logged|queued|failed, ?q= address or subject.","parameters":[],"fields":[{"name":"status","rules":"nullable|in:sent,logged,queued,failed","required":false},{"name":"q","rules":"nullable|string|'max:' . \\App\\Support\\Limits::chars(190)","required":false},{"name":"per_page","rules":"nullable|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(100)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/messaging\/mail\/deliveries\/{delivery}\/retry","name":"api.v1.platform.messaging.mail.retry","audience":"platform","section":"messaging","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Puts a failed email back in the queue; it goes out within a minute.","parameters":[{"name":"delivery","type":"string","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/monitor\/overview","name":"api.v1.platform.monitor.overview","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Everything the live page shows, with the value of each alert metric.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/monitor\/history","name":"api.v1.platform.monitor.history","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"?range=24h|7d|30d: chart series averaged per slot.","parameters":[],"fields":[{"name":"range","rules":"nullable|in:24h,7d,30d","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/monitor\/alerts\/rules","name":"api.v1.platform.monitor.rules.index","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/monitor\/alerts\/rules\/{rule}","name":"api.v1.platform.monitor.rules.update","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"threshold, for_minutes, cooldown_minutes, enabled: any of them.","parameters":[{"name":"rule","type":"string","pattern":null}],"fields":[{"name":"threshold","rules":"sometimes|numeric|'min:' . $bounds['min']|'max:' . $bounds['max']","required":false},{"name":"for_minutes","rules":"sometimes|integer|min:1|max:1440","required":false},{"name":"cooldown_minutes","rules":"sometimes|integer|min:5|max:10080","required":false},{"name":"enabled","rules":"sometimes|boolean","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/monitor\/alerts\/recipients","name":"api.v1.platform.monitor.recipients.show","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/monitor\/alerts\/recipients","name":"api.v1.platform.monitor.recipients.update","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"recipients: a list of addresses (an empty list stops alert emails), language: en|ar.","parameters":[],"fields":[{"name":"recipients","rules":"present|array|max:20","required":false},{"name":"recipients.*","rules":"email:rfc|max:190","required":false},{"name":"language","rules":"sometimes|in:en,ar","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/monitor\/alerts\/events","name":"api.v1.platform.monitor.events.index","audience":"platform","section":"monitor","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"The alerts log, newest first; ?kind=fired|repeat|recovered, ?metric=.","parameters":[],"fields":[{"name":"kind","rules":"nullable|in:fired,repeat,recovered","required":false},{"name":"metric","rules":"nullable|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_hours","required":false},{"name":"per_page","rules":"nullable|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(100)","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/notification-log","name":"api.v1.platform.notification-log.index","audience":"platform","section":"notification-log","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET notification-log?tab=notices|broadcasts|emails&from=&to=&company=&category=&channel=&status=&kind=&q=&per_page=","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/notification-log\/export","name":"api.v1.platform.notification-log.export","audience":"platform","section":"notification-log","permissions":[],"modules":[],"rate_limit_per_minute":20,"summary":"GET notification-log\/export?tab=&format=csv|xlsx&\u2026filters, or send= one notice's recipients.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/notification-log\/{send}","name":"api.v1.platform.notification-log.show","audience":"platform","section":"notification-log","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET notification-log\/{send}: one company notice with every person and each channel's answer.","parameters":[{"name":"send","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/phone-sharing","name":"api.v1.platform.phone-sharing.show","audience":"platform","section":"phone-sharing","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET phone-sharing: the platform default for one account per phone (docs\/platform-control.md \u00ab\u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u00bb), and the companies with their own.","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/phone-sharing","name":"api.v1.platform.phone-sharing.update","audience":"platform","section":"phone-sharing","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"PUT phone-sharing: mode (allow|warn|block), max_accounts (1\u201310).","parameters":[],"fields":[{"name":"mode","rules":"required|Rule::in(self::MODES)","required":true},{"name":"max_accounts","rules":"required|integer|between:1,10","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/platform-admins","name":"api.v1.platform.platform-admins.index","audience":"platform","section":"platform-admins","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"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.","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/platform-admins","name":"api.v1.platform.platform-admins.store","audience":"platform","section":"platform-admins","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"name, email, permissions. The temporary password is in the answer once.","parameters":[],"fields":[{"name":"name","rules":"required|string|max:120","required":true},{"name":"email","rules":"required|email|max:190","required":true},{"name":"permissions","rules":"sometimes|nullable|array","required":false},{"name":"permissions.*","rules":"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_run","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/platform-admins\/{platform_admin}","name":"api.v1.platform.platform-admins.show","audience":"platform","section":"platform-admins","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"platform_admin","type":"string","pattern":null}],"fields":[]},{"methods":["PUT","PATCH"],"path":"\/api\/v1\/platform\/platform-admins\/{platform_admin}","name":"api.v1.platform.platform-admins.update","audience":"platform","section":"platform-admins","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"name; permissions (the whole list kept), or grant \/ revoke one.","parameters":[{"name":"platform_admin","type":"string","pattern":null}],"fields":[{"name":"name","rules":"sometimes|required|string|max:120","required":true},{"name":"permissions","rules":"sometimes|nullable|array","required":false},{"name":"permissions.*","rules":"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_run","required":false},{"name":"grant","rules":"sometimes|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_run","required":false},{"name":"revoke","rules":"sometimes|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_run","required":false}]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/platform-admins\/{platform_admin}","name":"api.v1.platform.platform-admins.destroy","audience":"platform","section":"platform-admins","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Removes the admin access: no panel, no permissions, platform API keys revoked, signed out.","parameters":[{"name":"platform_admin","type":"string","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/security","name":"api.v1.platform.security.show","audience":"platform","section":"security","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/security","name":"api.v1.platform.security.update","audience":"platform","section":"security","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/seo","name":"api.v1.platform.seo.show","audience":"platform","section":"seo","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/seo\/settings","name":"api.v1.platform.seo.settings.update","audience":"platform","section":"seo","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/seo\/robots","name":"api.v1.platform.seo.robots.update","audience":"platform","section":"seo","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/seo\/pages\/{key}","name":"api.v1.platform.seo.pages.show","audience":"platform","section":"seo","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"key","type":"string","pattern":"[a-z]+\\.[a-z-]+"}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/seo\/pages\/{key}","name":"api.v1.platform.seo.pages.update","audience":"platform","section":"seo","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"key","type":"string","pattern":"[a-z]+\\.[a-z-]+"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/server-switch","name":"api.v1.platform.server-switch.show","audience":"platform","section":"server-switch","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"GET server-switch: the app's live\/dev switch {on, until, by, at} (docs\/mobile-server-switch.md).","parameters":[],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/server-switch","name":"api.v1.platform.server-switch.update","audience":"platform","section":"server-switch","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"PUT server-switch: on (boolean); hours (1\u2013168, default 24; null = no end) for how long it stays on.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/sign-in-options","name":"api.v1.platform.sign-in-options.show","audience":"platform","section":"sign-in-options","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"The sign-in screen switches {forgot_password, sso, privacy}, with meta.last_change {by, at} (null = defaults).","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/sign-in-options","name":"api.v1.platform.sign-in-options.update","audience":"platform","section":"sign-in-options","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"forgot_password, sso, privacy (booleans): any of them; the rest keep their value.","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/settings","name":"api.v1.platform.site.settings","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/site\/settings","name":"api.v1.platform.site.settings.update","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/calculators","name":"api.v1.platform.site.calculators","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"A country's rates in force (Iraq by default, ?country= and ?variant= for another).","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/site\/calculators","name":"api.v1.platform.site.calculators.update","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/plans","name":"api.v1.platform.site.plans","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/site\/plans","name":"api.v1.platform.site.plans.store","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/site\/plans\/{plan}","name":"api.v1.platform.site.plans.update","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"plan","type":"string","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/site\/plans\/{plan}","name":"api.v1.platform.site.plans.destroy","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"plan","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/site\/plans\/{plan}\/move\/{direction}","name":"api.v1.platform.site.plans.move","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"plan","type":"string","pattern":null},{"name":"direction","type":"string","pattern":"up|down"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/section-types","name":"api.v1.platform.site.section-types","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/pages\/{page}\/sections","name":"api.v1.platform.site.sections","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"page","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/site\/pages\/{page}\/sections","name":"api.v1.platform.site.sections.store","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"page","type":"string","pattern":null}],"fields":[{"name":"type","rules":"required|string","required":true}]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/site\/sections\/{section}","name":"api.v1.platform.site.sections.update","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"section","type":"string","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/site\/sections\/{section}","name":"api.v1.platform.site.sections.destroy","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"section","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/site\/sections\/{section}\/move\/{direction}","name":"api.v1.platform.site.sections.move","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"section","type":"string","pattern":null},{"name":"direction","type":"string","pattern":"up|down"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/offices","name":"api.v1.platform.site.offices","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/site\/offices","name":"api.v1.platform.site.offices.store","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/site\/offices\/{office}","name":"api.v1.platform.site.offices.update","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"office","type":"string","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/site\/offices\/{office}","name":"api.v1.platform.site.offices.destroy","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"office","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/site\/offices\/{office}\/move\/{direction}","name":"api.v1.platform.site.offices.move","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"office","type":"string","pattern":null},{"name":"direction","type":"string","pattern":"up|down"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/site\/contact-settings","name":"api.v1.platform.site.contact-settings","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/site\/contact-settings","name":"api.v1.platform.site.contact-settings.update","audience":"platform","section":"site","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/support-sessions","name":"api.v1.platform.companies.support-sessions.index","audience":"platform","section":"support-sessions","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/support-sessions","name":"api.v1.platform.companies.support-sessions.store","audience":"platform","section":"support-sessions","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"reason","rules":"required|string|min:5|'max:' . \\App\\Support\\Limits::chars(500)","required":true}]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/support-sessions\/{supportSession}","name":"api.v1.platform.support-sessions.destroy","audience":"platform","section":"support-sessions","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"supportSession","type":"string","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/system-announcements","name":"api.v1.platform.system-announcements.index","audience":"platform","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"?state=live|scheduled|ended|off","parameters":[],"fields":[{"name":"state","rules":"nullable|in:live,scheduled,ended,off","required":false},{"name":"per_page","rules":"nullable|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(100)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/system-announcements","name":"api.v1.platform.system-announcements.store","audience":"platform","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/system-announcements\/{announcement}","name":"api.v1.platform.system-announcements.show","audience":"platform","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/system-announcements\/{announcement}","name":"api.v1.platform.system-announcements.update","audience":"platform","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["DELETE"],"path":"\/api\/v1\/platform\/system-announcements\/{announcement}","name":"api.v1.platform.system-announcements.destroy","audience":"platform","section":"system-announcements","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Only one nobody has seen yet (422 otherwise: switch it off with is_active false instead).","parameters":[{"name":"announcement","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/users","name":"api.v1.platform.companies.users.index","audience":"platform","section":"users","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"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.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/users\/{user}\/reset-password","name":"api.v1.platform.companies.users.reset-password","audience":"platform","section":"users","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"string","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/companies\/{company}\/users\/{user}\/contact","name":"api.v1.platform.companies.users.contact","audience":"platform","section":"users","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/users\/{user}\/unlock","name":"api.v1.platform.companies.users.unlock","audience":"platform","section":"users","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"string","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/users\/{user}\/two-factor\/reset","name":"api.v1.platform.companies.users.two-factor.reset","audience":"platform","section":"users","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"string","pattern":null}],"fields":[]},{"methods":["PATCH"],"path":"\/api\/v1\/platform\/companies\/{company}\/users\/{user}\/access","name":"api.v1.platform.companies.users.access","audience":"platform","section":"users","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Switches the account on or off (is_active) and makes it a company admin or not (is_owner); platform.companies.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"user","type":"string","pattern":null}],"fields":[{"name":"is_active","rules":"sometimes|boolean","required":false},{"name":"is_owner","rules":"sometimes|boolean","required":false}]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/zenhr-sync\/emergency-stop","name":"api.v1.platform.zenhr-sync.emergency","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"Stops every company's sync, or lifts that.","parameters":[],"fields":[{"name":"on","rules":"required|boolean","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync","name":"api.v1.platform.companies.zenhr-sync.show","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/switch","name":"api.v1.platform.companies.zenhr-sync.switch","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"On or off for this company (\"off\" when the move to Mihnaro is final). A run in progress stops at its next safe place.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"enabled","rules":"required|boolean","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/health","name":"api.v1.platform.companies.zenhr-sync.health","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/runs","name":"api.v1.platform.companies.zenhr-sync.runs.index","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"sometimes|string","required":false},{"name":"trigger","rules":"sometimes|string","required":false},{"name":"per_page","rules":"sometimes|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(100)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/runs","name":"api.v1.platform.companies.zenhr-sync.runs.store","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":6,"summary":"Queues a run for the runner (it can take minutes); one at a time, whoever started it.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"source","rules":"sometimes|in:api,extraction","required":false},{"name":"dry_run","rules":"sometimes|boolean","required":false},{"name":"data_types","rules":"sometimes|array","required":false},{"name":"branch_ids","rules":"sometimes|array","required":false},{"name":"since","rules":"sometimes|nullable|date","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/runs\/{run}","name":"api.v1.platform.companies.zenhr-sync.runs.show","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/runs\/{run}\/items","name":"api.v1.platform.companies.zenhr-sync.runs.items","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"The records a run touched: table, reference and column names, never values.","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"sometimes|in:inserted,updated,flagged","required":false},{"name":"per_page","rules":"sometimes|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(200)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/runs\/{run}\/stop","name":"api.v1.platform.companies.zenhr-sync.runs.stop","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/runs\/{run}\/resume","name":"api.v1.platform.companies.zenhr-sync.runs.resume","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"run","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/conflicts","name":"api.v1.platform.companies.zenhr-sync.conflicts.index","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"status","rules":"sometimes|in:open,applied,kept,all","required":false},{"name":"limit","rules":"sometimes|integer|min:1|'max:' . \\App\\Support\\Limits::cap(200)","required":false},{"name":"offset","rules":"sometimes|integer|min:0","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/conflicts\/{conflict}\/{action}","name":"api.v1.platform.companies.zenhr-sync.conflicts.resolve","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"conflict","type":"integer","pattern":null},{"name":"action","type":"string","pattern":"apply|keep"}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/connection","name":"api.v1.platform.companies.zenhr-sync.connection.show","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/connection","name":"api.v1.platform.companies.zenhr-sync.connection.update","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":20,"summary":"Takes the keys as the screen does, and never returns them.","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/connection\/authorize","name":"api.v1.platform.companies.zenhr-sync.connection.authorize","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":10,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"code","rules":"required|string|max:2000","required":true}]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/connection\/test","name":"api.v1.platform.companies.zenhr-sync.connection.test","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":6,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/branches\/{branch}\/link","name":"api.v1.platform.companies.zenhr-sync.branches.link","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/branches\/{branch}\/switch","name":"api.v1.platform.companies.zenhr-sync.branches.switch","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"branch","type":"integer","pattern":null}],"fields":[{"name":"enabled","rules":"required|boolean","required":true}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/data-types","name":"api.v1.platform.companies.zenhr-sync.data-types.index","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["PUT"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/data-types\/{type}","name":"api.v1.platform.companies.zenhr-sync.data-types.update","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null},{"name":"type","type":"string","pattern":null}],"fields":[{"name":"branch_id","rules":"sometimes|nullable|integer","required":false},{"name":"enabled","rules":"sometimes|boolean","required":false},{"name":"frequency","rules":"sometimes|nullable|string","required":false},{"name":"starting_from","rules":"sometimes|nullable|date","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/totals","name":"api.v1.platform.companies.zenhr-sync.totals","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/payroll-compare","name":"api.v1.platform.companies.zenhr-sync.payroll-compare.show","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[]},{"methods":["POST"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/payroll-compare","name":"api.v1.platform.companies.zenhr-sync.payroll-compare.store","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":6,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"months","rules":"sometimes|integer|min:1|max:12","required":false}]},{"methods":["GET"],"path":"\/api\/v1\/platform\/companies\/{company}\/zenhr-sync\/audit","name":"api.v1.platform.companies.zenhr-sync.audit","audience":"platform","section":"zenhr-sync","permissions":[],"modules":[],"rate_limit_per_minute":120,"summary":"","parameters":[{"name":"company","type":"integer","pattern":null}],"fields":[{"name":"action","rules":"sometimes|string|max:40","required":false},{"name":"per_page","rules":"sometimes|integer|min:1|'max:' . \\App\\Support\\Limits::pageMax(100)","required":false}]},{"methods":["POST"],"path":"\/api\/v1\/biometric\/punches","name":"api.v1.biometric.punches","audience":"device","section":"biometric","permissions":[],"modules":[],"rate_limit_per_minute":600,"summary":"POST {\"punches\":[{\"pin\":\"12\",\"time\":\"2026-10-19 08:03:00\"}]} with the header X-Device-Token.","parameters":[],"fields":[{"name":"punches","rules":"required|array|max:2000","required":true},{"name":"punches.*.pin","rules":"required|string|max:32","required":true},{"name":"punches.*.time","rules":"required|date","required":true},{"name":"punches.*.status","rules":"nullable|string|max:8","required":false}]}],"mcp":{"app":{"url":"https:\/\/api.mihnaro.com\/mcp\/app","path":"\/mcp\/app","tools":[{"name":"access_control","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["time_zones","levels","assignments"],"description":""},{"name":"action","type":"string","required":true,"enum":["list","save","delete"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"account_deletion","description":"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.","arguments":[{"name":"action","type":"string","required":true,"enum":["status","request"],"description":"status: my requests; request: ask for deletion"},{"name":"reason","type":"string","required":false,"enum":[],"description":"Optional: why"}],"read_only":false,"destructive":false},{"name":"act_on_attendance_recommendations","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["refresh","ignore","notify","apply"],"description":""},{"name":"ids","type":"array","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":"Apply: the leave type absences are recorded as"}],"read_only":false,"destructive":false},{"name":"add_org_level","description":"Add a missing organization level (department, section, work location\u2026) 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"type","type":"string","required":true,"enum":["work_location","department","section","project","hierarchy_group","business_unit","division","segment"],"description":""},{"name":"name","type":"object","required":true,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"parent_id","type":"integer","required":false,"enum":[],"description":"For a section: its department."},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":"The employee being edited (their branch decides); leave out for a new hire."}],"read_only":false,"destructive":false},{"name":"app_dashboard","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["read","save"],"description":""},{"name":"period","type":"string","required":false,"enum":[],"description":"read: this_month, last_month, last_30, this_quarter or this_year"},{"name":"from","type":"string","required":false,"enum":[],"description":"read: Y-m-d"},{"name":"to","type":"string","required":false,"enum":[],"description":"read: Y-m-d"},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"read: narrow to this branch, inside what you reach"},{"name":"department_id","type":"integer","required":false,"enum":[],"description":"read: narrow to this department, inside what you reach"},{"name":"order","type":"array","required":false,"enum":[],"description":"save: widget keys in order"},{"name":"show","type":"array","required":false,"enum":[],"description":"save: the widget keys to show; the others are hidden"},{"name":"reset","type":"boolean","required":false,"enum":[],"description":"save: go back to following the web's layout"}],"read_only":false,"destructive":false},{"name":"app_reminders","description":"People not on the Mihnaro app yet (docs\/platform-control.md \u00ab\u0644\u0645 \u064a\u062f\u062e\u0644\u0648\u0627 \u0627\u0644\u062a\u0637\u0628\u064a\u0642 \u0628\u0639\u062f\u00bb): 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","send"],"description":""},{"name":"channel","type":"string","required":false,"enum":["email","whatsapp"],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""},{"name":"all","type":"boolean","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"archive_employee","description":"\"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":"The internal id; or give employee_number."},{"name":"employee_number","type":"string","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"With employee_number, when numbers repeat across branches."},{"name":"reason","type":"string","required":false,"enum":[],"description":"Why it is archived (optional, up to 500 characters)."}],"read_only":false,"destructive":false},{"name":"assign_role","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"role_id","type":"integer","required":true,"enum":[],"description":""},{"name":"scope","type":"string","required":true,"enum":["company","branch","department","work_location","section","project","hierarchy_group","business_unit","division","segment","reports","team","reports_of"],"description":""},{"name":"scope_id","type":"integer","required":false,"enum":[],"description":"The branch, unit or employee, for those scopes."}],"read_only":false,"destructive":false},{"name":"assign_to_project","description":"Assign an employee to a project, or change their assignment: job role (position), contribution percentage, staff code, dates.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"project_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"position_id","type":"integer","required":false,"enum":[],"description":"Job role on the project"},{"name":"contribution_percent","type":"number","required":false,"enum":[],"description":"0-100, default what the employee has left (an employee's projects add up to 100% at most)"},{"name":"staff_code","type":"string","required":false,"enum":[],"description":""},{"name":"start_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"end_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"}],"read_only":false,"destructive":false},{"name":"biometric_templates","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"view","type":"string","required":false,"enum":["templates","compatibility","conflicts","duplicates"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device_id","type":"integer","required":false,"enum":[],"description":""},{"name":"include_data","type":"boolean","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"buddy_punching_review","description":"HR's review of buddy punching (docs\/attendance-security.md \u00a719). 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\/*.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["people","signals","presence","decide_signal","review_presence","export"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"failed","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"buddy_punching_settings","description":"The four layers against one employee clocking in for another (attendance.buddy.manage, docs\/attendance-security.md \u00a719). 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\u20134, respond_minutes 2\u201360, percent 1\u2013100; 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}.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"layer","type":"string","required":false,"enum":["bp_face","bp_device_key","bp_presence","bp_pattern"],"description":""},{"name":"inherit","type":"boolean","required":false,"enum":[],"description":""},{"name":"mode","type":"string","required":false,"enum":["off","flag","refuse"],"description":""},{"name":"weak_action","type":"string","required":false,"enum":[],"description":""},{"name":"refused_action","type":"string","required":false,"enum":[],"description":""},{"name":"enrol_required","type":"boolean","required":false,"enum":[],"description":""},{"name":"enrol_approval","type":"boolean","required":false,"enum":[],"description":""},{"name":"enrol_remind_days","type":"integer","required":false,"enum":[],"description":""},{"name":"enrol_photo_days","type":"integer","required":false,"enum":[],"description":""},{"name":"blink_required","type":"boolean","required":false,"enum":[],"description":""},{"name":"per_shift","type":"integer","required":false,"enum":[],"description":""},{"name":"respond_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"percent","type":"integer","required":false,"enum":[],"description":""},{"name":"tandem_seconds","type":"integer","required":false,"enum":[],"description":""},{"name":"tandem_min","type":"integer","required":false,"enum":[],"description":""},{"name":"stay_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"dual_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"window_days","type":"integer","required":false,"enum":[],"description":""},{"name":"notify_score","type":"integer","required":false,"enum":[],"description":""},{"name":"rules","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"calculate_hr","description":"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\u201312, 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}.","arguments":[{"name":"tool","type":"string","required":true,"enum":["end-of-service","net-salary","gross-salary","overtime","leave","cost-to-company"],"description":""},{"name":"inputs","type":"object","required":true,"enum":[],"description":"The tool's inputs, e.g. {\"basic\": 1500000, \"allowances\": 300000}."},{"name":"country","type":"string","required":false,"enum":[],"description":"ISO country code, e.g. \"SA\". Default IQ."},{"name":"variant","type":"string","required":false,"enum":[],"description":"The country's rule variant when it has more than one (e.g. \"saudi\", \"non-saudi\"); default its first."},{"name":"date","type":"string","required":false,"enum":[],"description":"Use the rules in force on this day (Y-m-d); default today."}],"read_only":true,"destructive":false},{"name":"cancel_request","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["cancel","decide","list"],"description":""},{"name":"kind","type":"string","required":false,"enum":["requests","leaves"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":["approved","rejected"],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"clock","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["in","out","scan"],"description":""},{"name":"qr_token","type":"string","required":false,"enum":[],"description":""},{"name":"t","type":"integer","required":false,"enum":[],"description":""},{"name":"s","type":"string","required":false,"enum":[],"description":""},{"name":"lat","type":"number","required":false,"enum":[],"description":""},{"name":"lng","type":"number","required":false,"enum":[],"description":""},{"name":"attendance_function_id","type":"integer","required":false,"enum":[],"description":""},{"name":"occurred_at","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"clocking_devices","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","approve","block","reset","rename","share","reset_employee"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["phone","browser"],"description":""},{"name":"status","type":"string","required":false,"enum":["pending","approved","blocked","retired"],"description":""},{"name":"device","type":"string","required":false,"enum":[],"description":""},{"name":"label","type":"string","required":false,"enum":[],"description":""},{"name":"shared","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"company_connected_apps","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["list","revoke"],"description":""},{"name":"grant_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"company_limits","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["read","update"],"description":"read by default."},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"One branch's own values, not the main branch."},{"name":"values","type":"object","required":false,"enum":[],"description":"For update: {key: number or null}."}],"read_only":false,"destructive":false},{"name":"decide_leave","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"leave_id","type":"integer","required":true,"enum":[],"description":""},{"name":"decision","type":"string","required":true,"enum":["approved","rejected"],"description":""},{"name":"decision_note","type":"string","required":false,"enum":[],"description":""},{"name":"non_deduct","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"decide_request","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["decide","override","withdraw"],"description":""},{"name":"items","type":"array","required":true,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":["approved","rejected"],"description":""},{"name":"decision_note","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"delete_document","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"document_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_employee_file_record","description":"Remove a contract, bank account, family member or document from an employee's file (its files are deleted too).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["contracts","bank_accounts","family","documents"],"description":""},{"name":"record_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_org_unit","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"unit_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"delete_permission_group","description":"Delete a group: its people lose what its seats gave them. As DELETE permission-groups\/{id}. Needs roles.manage.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"group_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"delete_permission_override","description":"Take off one person's exception. As DELETE permission-overrides\/{id}. Needs roles.manage.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"override_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"delete_role","description":"Delete a role; everyone who had it loses it.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"role_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_time_setup_item","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["shifts","overtime_types","holidays","geolocations","biometric_devices"],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"describe_section","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["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"],"description":""}],"read_only":true,"destructive":false},{"name":"device_action","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["sync","pull","pull_logs","info","check","reboot","clear_log","open_door","close_door","set_time","duplicate_check","settings","recompute","retry","cancel"],"description":""},{"name":"device_id","type":"integer","required":false,"enum":[],"description":""},{"name":"command_id","type":"integer","required":false,"enum":[],"description":""},{"name":"pins","type":"array","required":false,"enum":[],"description":"remove_users: device numbers to take off this device (people who left, unknown numbers; list_devices view users shows reason)"},{"name":"door","type":"integer","required":false,"enum":[],"description":""},{"name":"seconds","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"pull_logs: first day (Y-m-d); recompute: the date to pair punches again from"},{"name":"to","type":"string","required":false,"enum":[],"description":"pull_logs: last day (Y-m-d), default today"},{"name":"access_mode","type":"string","required":false,"enum":["attendance","access","both"],"description":""},{"name":"sync_enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"strict_users","type":"boolean","required":false,"enum":[],"description":""},{"name":"family","type":"string","required":false,"enum":["terminal","panel"],"description":""},{"name":"lock_count","type":"integer","required":false,"enum":[],"description":""},{"name":"all_branches","type":"boolean","required":false,"enum":[],"description":""},{"name":"branch_ids","type":"array","required":false,"enum":[],"description":""},{"name":"punch_mode","type":"string","required":false,"enum":["first_last","all","function"],"description":""},{"name":"pair_breaks","type":"boolean","required":false,"enum":[],"description":""},{"name":"break_function_id","type":"integer","required":false,"enum":[],"description":""},{"name":"debounce_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"punch_in_window_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"punch_out_grace_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"recompute_from","type":"string","required":false,"enum":[],"description":""},{"name":"allowed_ips","type":"string","required":false,"enum":[],"description":"settings: addresses or CIDR ranges the device may report from, comma-separated; empty = anywhere"},{"name":"confirm_ip","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"door_events","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["list","acknowledge"],"description":""},{"name":"event_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device","type":"integer","required":false,"enum":[],"description":""},{"name":"result","type":"string","required":false,"enum":["granted","denied","alarm","state","info"],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"pin","type":"string","required":false,"enum":[],"description":""},{"name":"door","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"alerts","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"download_letter_pdf","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["letter","signature"],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"lang","type":"string","required":false,"enum":["en","ar"],"description":""}],"read_only":false,"destructive":false},{"name":"download_payslip_pdf","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"payslip_id","type":"integer","required":true,"enum":[],"description":""},{"name":"lang","type":"string","required":false,"enum":["en","ar"],"description":""}],"read_only":false,"destructive":false},{"name":"download_salaries_excel","description":"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\u2026). saved_id starts from saved options. lang en or ar (default: my language). Returns filename, mime, size and the file as base64.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"saved_id","type":"integer","required":false,"enum":[],"description":""},{"name":"lang","type":"string","required":false,"enum":["en","ar"],"description":""},{"name":"colored","type":"boolean","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"download_workflow_pdf","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"lang","type":"string","required":false,"enum":["en","ar"],"description":""}],"read_only":true,"destructive":false},{"name":"earned_wage","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["available","settings","update_settings"],"description":""},{"name":"ewa_enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"ewa_percent","type":"number","required":false,"enum":[],"description":""},{"name":"ewa_max_requests","type":"integer","required":false,"enum":[],"description":""},{"name":"ewa_min_amount","type":"number","required":false,"enum":[],"description":""},{"name":"ewa_fee","type":"number","required":false,"enum":[],"description":""},{"name":"ewa_last_day","type":"integer","required":false,"enum":[],"description":""},{"name":"ewa_include_allowances","type":"boolean","required":false,"enum":[],"description":""},{"name":"ewa_min_service_days","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"edit_letter_template","description":"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}, \u2026 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","placeholders","upload_image","preview","preview_pdf"],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"body","type":"string","required":false,"enum":[],"description":"HTML or plain text with {placeholders}"},{"name":"language","type":"string","required":false,"enum":["ar","en"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"addressed_to","type":"string","required":false,"enum":[],"description":""},{"name":"effective_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"data","type":"string","required":false,"enum":[],"description":"data:image\/png;base64,\u2026 or base64"},{"name":"name","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"employee_accounts","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["existing_users","temporary_password","unlock"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"temporary_password","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"employee_clocking_from","description":"Where one employee clocks from (attendance.clocking_from.manage, docs\/branch-settings.md \u00a72.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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"clocking_from","type":"string","required":false,"enum":["both","web","mobile","device","follow"],"description":""}],"read_only":false,"destructive":false},{"name":"employee_groups","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","get","save","delete","add_members","remove_members"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"explain_access","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"permission","type":"string","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"export_notification_log","description":"The notifications log as a file (notifications.log.view, docs\/notifications.md \"\u0633\u062c\u0644 \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062a\"), 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"format","type":"string","required":false,"enum":["csv","xlsx"],"description":""},{"name":"send","type":"integer","required":false,"enum":[],"description":"One notice's recipients instead of the list."},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":[],"description":""},{"name":"channel","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"person","type":"integer","required":false,"enum":[],"description":""},{"name":"branch","type":"integer","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":[],"description":""},{"name":"actor","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"face_templates","description":"Face templates (attendance.face.manage, docs\/attendance-security.md \u00a719). 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","missing","consents","approve","reset"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"review","type":"string","required":false,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"field_dispatch","description":"The field dispatch board (docs\/field-proof.md \u00a712), 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["board","candidates","reassign","bulk_cancel","events"],"description":""},{"name":"date","type":"string","required":false,"enum":[],"description":"Y-m-d, for board"},{"name":"filters","type":"object","required":false,"enum":[],"description":"branch_id, status, q"},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"job_ids","type":"array","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"field_overtime","description":"Overtime from field proof (docs\/field-proof.md \u00a718), as the field\/overtime API. action summary (field.overtime.view): job_id \u2192 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 \u2192 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) \u2192 the employee (or HR over them) sends the draft into the normal approval chain. action discard: request_id \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["summary","draft","mine","submit","discard","queue","decide"],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"request_id","type":"integer","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"overtime_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":["approved","rejected"],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"field_proof_settings","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"values","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"file_request","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"type","type":"string","required":true,"enum":[],"description":""},{"name":"fields","type":"object","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"geocode_address","description":"Street addresses from Mihnaro's own geocoder (docs\/field-proof.md \u00a721), as GET field\/geocode\/search and field\/geocode\/reverse. action search: q (2\u2013200 characters, Arabic or English), lang (en or ar), optional lat and lng to prefer results near them, limit (1\u201310); 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["search","reverse"],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"lang","type":"string","required":false,"enum":["en","ar"],"description":""},{"name":"lat","type":"number","required":false,"enum":[],"description":""},{"name":"lng","type":"number","required":false,"enum":[],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"get_activity_log","description":"The company's activity log (activity.view, docs\/activity-log.md), newest first, 40 a page. tab changes: record changes with old \u2192 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 \u2022\u2022\u2022. 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"tab","type":"string","required":false,"enum":["changes","requests","sign_ins"],"description":""},{"name":"scope","type":"string","required":false,"enum":["employee","time","payroll","organization","company","system"],"description":""},{"name":"area","type":"string","required":false,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["created","updated","deleted","purged"],"description":""},{"name":"level","type":"string","required":false,"enum":["user","employee","branch","company"],"description":""},{"name":"user","type":"integer","required":false,"enum":[],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"branch","type":"integer","required":false,"enum":[],"description":""},{"name":"channel","type":"string","required":false,"enum":["web","api","mcp"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"new_only","type":"boolean","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_announcement","description":"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\".","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"announcement_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_app_brand","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_app_branding","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_app_colors","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"One branch's own colors; none: the company's."}],"read_only":true,"destructive":false},{"name":"get_app_navigation","description":"The mobile app's menu for you: the web menu filtered by license and permission, each item opening an engine section or one of the app's own screens. pending counts the menu items the app has no screen for yet.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_appearance","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_approval_cycle","description":"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\u2026) or leaves (time off), id. Whoever may see the request: the employee, HR over them, or an approver.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["requests","leaves"],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_branch_context","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_calculator_country","description":"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}.","arguments":[{"name":"country","type":"string","required":true,"enum":[],"description":"ISO code (\"JO\") or the site's address part (\"jordan\")."}],"read_only":true,"destructive":false},{"name":"get_clock_button_scope","description":"\"Hide the clock button outside the work location\" (attendance_setup.manage, docs\/attendance-security.md \u00a717): whether the mobile app shows the clock in\/out button only inside a work location, and for whom: scope all, or chosen branch_ids, department_ids and employee_ids (any of them reaches the employee). branch_id reads a branch's own value (empty: the company's). choices lists what that level may name: a branch's own value only that branch, its departments and its employees.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_clocking_security","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_company_context","description":"For one company of the signed-in user: the modules its license includes, the license dates, and the branches this user can work in.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_company_settings","description":"System preferences \u2192 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_dashboard","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["hr","attendance","payroll","assets","performance"],"description":""},{"name":"widgets","type":"array","required":false,"enum":[],"description":""},{"name":"period","type":"string","required":false,"enum":["this_month","last_month","last_30","this_quarter","this_year","custom"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_e_signature_image","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_employee","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":"The internal id; or give employee_number."},{"name":"employee_number","type":"string","required":false,"enum":[],"description":"The employee number, e.g. 1101."},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"With employee_number, when numbers repeat across branches."}],"read_only":true,"destructive":false},{"name":"get_employee_history","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_employee_numbering","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_help","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_help_article","description":"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`.","arguments":[{"name":"category","type":"string","required":true,"enum":[],"description":""},{"name":"slug","type":"string","required":true,"enum":[],"description":""},{"name":"locale","type":"string","required":false,"enum":["en","ar"],"description":""}],"read_only":true,"destructive":false},{"name":"get_holiday_calendar","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"}],"read_only":true,"destructive":false},{"name":"get_log_retention","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_map_tiles","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_my_access","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_my_attendance","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"}],"read_only":true,"destructive":false},{"name":"get_my_leaves","description":"Your leave balances for a year (this year by default) and your leave requests with their status.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"year","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_my_performance","description":"My performance: my evaluations (scores hidden until complete), the evaluations waiting for my review, my goals, the 360\u00b0 feedback requests I owe and my feedback forms.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_my_permissions","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_my_profile","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_my_schedule","description":"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}.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"}],"read_only":true,"destructive":false},{"name":"get_my_timesheet","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"week","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"}],"read_only":true,"destructive":false},{"name":"get_my_two_factor","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_org_chart","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"department","type":"integer","required":false,"enum":[],"description":"Department id"},{"name":"branch","type":"integer","required":false,"enum":[],"description":"Branch id"},{"name":"job_role","type":"integer","required":false,"enum":[],"description":""},{"name":"work_location","type":"integer","required":false,"enum":[],"description":""},{"name":"section","type":"integer","required":false,"enum":[],"description":""},{"name":"project","type":"integer","required":false,"enum":[],"description":""},{"name":"hierarchy_group","type":"integer","required":false,"enum":[],"description":""},{"name":"business_unit","type":"integer","required":false,"enum":[],"description":""},{"name":"division","type":"integer","required":false,"enum":[],"description":""},{"name":"segment","type":"integer","required":false,"enum":[],"description":""},{"name":"work_type","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":"Name or employee number"}],"read_only":true,"destructive":false},{"name":"get_performance_kpis","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"cycle_id","type":"integer","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_person_access","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"about_employee_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_person_app_devices","description":"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 \u00ab\u062e\u0631\u064a\u0637\u0629 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): [{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 \u00ab\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_person_device_context","description":"The phone details the Mihnaro app sent for a person in this company (app_devices.context, docs\/platform-control.md \u00ab\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0647\u0627\u062a\u0641\u00bb), 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 (\u2264500). 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"install_id","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":["device","network","battery","permissions","security","time","locale","health"],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_regional_settings","description":"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 \u2026\/regional-settings.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"mine","type":"boolean","required":false,"enum":[],"description":"true: only my effective formats."}],"read_only":true,"destructive":false},{"name":"get_sign_in_settings","description":"System preferences \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_sso_audit_log","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":"1-200, default 50."},{"name":"event","type":"string","required":false,"enum":["sign_in","sign_in_failed","password_blocked","settings_changed"],"description":""}],"read_only":true,"destructive":false},{"name":"get_team_attendance_today","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD; today by default"}],"read_only":true,"destructive":false},{"name":"get_team_calendar","description":"The team calendar for a month (YYYY-MM, this month by default): leaves \u2014 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 \u2014 plus holidays {date: name} and the company events.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"}],"read_only":true,"destructive":false},{"name":"get_termination_check","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_time_settings","description":"Attendance setup (clocking rules and missing punches) or Timesheets setup: section attendance or timesheets. Needs attendance_setup.manage.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["attendance","timesheets"],"description":""}],"read_only":true,"destructive":false},{"name":"global_search","description":"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. \"\u0637\u0644\u0628\u0627\u062a \u0625\u062c\u0627\u0632\u0629 \u0645\u0639\u0644\u0642\u0629 \u0628\u0641\u0631\u0639 Ltd\", \"\u0645\u0648\u0638\u0641\u064a\u0646 \u0642\u0633\u0645 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a\", \"\u0639\u0642\u0648\u062f \u062a\u0646\u062a\u0647\u064a \u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631\", \"pending overtime requests\", \"\u0631\u0648\u0627\u062a\u0628 \u0623\u0643\u062a\u0648\u0628\u0631\", 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":"What to look for: a name, employee number, request number (e.g. LV-000012), document title, page or setting"},{"name":"groups","type":"array","required":false,"enum":[],"description":"Only these groups; all when left out"},{"name":"limit","type":"integer","required":false,"enum":[],"description":"Results per group, 1-20 (6 by default)"},{"name":"without","type":"array","required":false,"enum":[],"description":"Filters read from the words to ignore (the chips removed): type, kind, status, branch, department, period, mine"},{"name":"filters","type":"object","required":false,"enum":[],"description":"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)"},{"name":"branch","type":"string","required":false,"enum":[],"description":"Branch id or \"all\" for this call; the user's chosen branch when left out"}],"read_only":true,"destructive":false},{"name":"import_rows","description":"Import data from rows: each row is an object of field \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"type","type":"string","required":true,"enum":[],"description":"employees, employees-quick, family-members, contracts, bank-accounts or custom-fields"},{"name":"rows","type":"array","required":true,"enum":[],"description":"[{\"employee_no\": \"EMP-1\", \"name_en\": \"...\", ...}]"},{"name":"mode","type":"string","required":false,"enum":["create","update"],"description":"update: change employees that already exist (by employee number)"},{"name":"commit","type":"boolean","required":false,"enum":[],"description":"false (default) only checks"},{"name":"options","type":"object","required":false,"enum":[],"description":"Batch-wide choices from list_importers (e.g. overtime: {\"overtime_type_id\": 3, \"transaction_type_id\": 7}), overriding the rows"}],"read_only":false,"destructive":false},{"name":"invite_employees","description":"Invite current employees without a sign-in account to the app (employees.manage, docs\/attendance.md \u00a713), 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"channel","type":"string","required":true,"enum":["email","whatsapp"],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"send","type":"boolean","required":false,"enum":[],"description":"true to send; leave out to preview."},{"name":"expected","type":"integer","required":false,"enum":[],"description":"With send: the eligible count from the preview."}],"read_only":false,"destructive":false},{"name":"issue_letter","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["issue","generate","confirm","decide"],"description":""},{"name":"letter_template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"addressed_to","type":"string","required":false,"enum":[],"description":""},{"name":"effective_date","type":"string","required":false,"enum":[],"description":"Y-m-d, defaults to today"},{"name":"letter_id","type":"integer","required":false,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":["approved","rejected"],"description":""}],"read_only":false,"destructive":false},{"name":"list_accounting","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["providers","connection","catalog","mappings","preview","postings","posting"],"description":""},{"name":"provider","type":"string","required":false,"enum":["odoo","quickbooks","xero","netsuite","business_central","sap_b1","sap_s4hana","dynamics_fo"],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"A branch's own connection (when the ledger is set per branch); empty = the company's."},{"name":"run_id","type":"integer","required":false,"enum":[],"description":""},{"name":"posting_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["pending","posted","failed","reversed"],"description":""}],"read_only":true,"destructive":false},{"name":"list_air_ticket_policies","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":"One policy with the employees it was given to."}],"read_only":true,"destructive":false},{"name":"list_air_tickets","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["transactions","balances"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"policy","type":"integer","required":false,"enum":[],"description":"Air ticket policy id."},{"name":"status","type":"string","required":false,"enum":["paid","unpaid"],"description":""},{"name":"payment","type":"string","required":false,"enum":["cash_out","booked"],"description":""},{"name":"payroll","type":"string","required":false,"enum":["in_payroll","off_cycle"],"description":""},{"name":"request_status","type":"string","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"paid_from","type":"string","required":false,"enum":[],"description":""},{"name":"paid_to","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_announcements","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"show","type":"string","required":false,"enum":["pinned","current","expired"],"description":""}],"read_only":true,"destructive":false},{"name":"list_app_device_activity","description":"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 \u00ab\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":false,"enum":[],"description":""},{"name":"install_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device_id","type":"string","required":false,"enum":[],"description":""},{"name":"event","type":"string","required":false,"enum":["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_off"],"description":""},{"name":"result","type":"string","required":false,"enum":["ok","failed","blocked"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_app_devices","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"platform","type":"string","required":false,"enum":["android","ios"],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""},{"name":"state","type":"string","required":false,"enum":["below_min","outdated","latest","newer","store_unknown","unknown"],"description":""},{"name":"push","type":"string","required":false,"enum":["active","failing","none"],"description":""},{"name":"signed_in","type":"boolean","required":false,"enum":[],"description":""},{"name":"shared","type":"boolean","required":false,"enum":[],"description":""},{"name":"seen_days","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_approvals","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"tab","type":"string","required":false,"enum":["approvals","my","team","override"],"description":""},{"name":"status","type":"string","required":false,"enum":["all","pending","approved","rejected","withdrawn","cancelled"],"description":""},{"name":"type","type":"string","required":false,"enum":[],"description":""},{"name":"request_id","type":"integer","required":false,"enum":[],"description":""},{"name":"my_action","type":"string","required":false,"enum":["waiting","pending","approved","rejected","withdrawn","approved_non_deduct","added_by_hr","delegated","skipped","cancelled","cancel_requested","none"],"description":""},{"name":"action_type","type":"string","required":false,"enum":["approval","cancellation"],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"sort","type":"string","required":false,"enum":["employee","serial","requested","received","my_action"],"description":""},{"name":"dir","type":"string","required":false,"enum":["asc","desc"],"description":""}],"read_only":false,"destructive":false},{"name":"list_assessments","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["summary","mine","categories","questions","question","tests","test","templates","invitations","attempt","grading","results","export"],"description":""},{"name":"question_id","type":"integer","required":false,"enum":[],"description":""},{"name":"test_id","type":"integer","required":false,"enum":[],"description":""},{"name":"attempt_id","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"integer","required":false,"enum":[],"description":""},{"name":"type","type":"string","required":false,"enum":["single","multiple","true_false","short_text","long_text","ordering","matching","numeric","file_upload"],"description":""},{"name":"difficulty","type":"string","required":false,"enum":["easy","medium","hard"],"description":""},{"name":"active","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"purpose","type":"string","required":false,"enum":["pre_employment","post_employment"],"description":""},{"name":"test","type":"integer","required":false,"enum":[],"description":""},{"name":"candidate","type":"integer","required":false,"enum":[],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_assets","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["assets","types"],"description":""},{"name":"asset_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["available","assigned","damaged","under_repair","archived"],"description":""},{"name":"type","type":"integer","required":false,"enum":[],"description":""},{"name":"owner","type":"string","required":false,"enum":[],"description":""},{"name":"holder","type":"integer","required":false,"enum":[],"description":""},{"name":"expiry_from","type":"string","required":false,"enum":[],"description":""},{"name":"expiry_to","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_attendance_recommendations","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["pending","applied","ignored"],"description":""},{"name":"kind","type":"string","required":false,"enum":["absence","lateness","early_out","incomplete","overtime","leave"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_attendance_records","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"shift_id","type":"integer","required":false,"enum":[],"description":""},{"name":"state","type":"string","required":false,"enum":["incomplete","complete","trusted"],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_attendance_sheets","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"machine_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["completed","with_errors","failed"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"template_machine_id","type":"integer","required":false,"enum":[],"description":"Return this machine's blank sheet template instead of the list"},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_business_travel","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["setup","policies","policy"],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_calculator_countries","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"list_company_branches","description":"The company's branches with their logos, the license's max_branches and whether another can be added.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_company_users","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"role","type":"integer","required":false,"enum":[],"description":""},{"name":"position","type":"integer","required":false,"enum":[],"description":"Job role (position) id."},{"name":"status","type":"string","required":false,"enum":["active","inactive"],"description":""}],"read_only":true,"destructive":false},{"name":"list_connected_accounts","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_devices","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"view","type":"string","required":false,"enum":["list","detail","commands","users","plan","audit","sync_report"],"description":""},{"name":"device_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["queued","sent","done","failed","cancelled"],"description":""}],"read_only":true,"destructive":false},{"name":"list_directory","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":"Name, job title or email"},{"name":"department","type":"integer","required":false,"enum":[],"description":"Department id"},{"name":"branch","type":"integer","required":false,"enum":[],"description":"Branch id"},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_discipline","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["actions","suspensions","setup"],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":"Optional filters for the kind, e.g. {\"status\": \"draft\"}."}],"read_only":true,"destructive":false},{"name":"list_documents","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"tab","type":"string","required":false,"enum":["all","my","employees","company"],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"integer","required":false,"enum":[],"description":"Document type id"},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_employee_file","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["contracts","bank_accounts","family","documents"],"description":""}],"read_only":true,"destructive":false},{"name":"list_employee_settings","description":"The lists behind the employee file: contract_types, job_grades, document_types, custom_fields, org_levels or field_rules.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["contract_types","job_grades","document_types","custom_fields","org_levels","field_rules","e_signatures","banks"],"description":""}],"read_only":true,"destructive":false},{"name":"list_employees","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["current","active","suspended","terminated","all","archived"],"description":""},{"name":"employee_number","type":"string","required":false,"enum":[],"description":"Exact employee number."},{"name":"salary_status","type":"string","required":false,"enum":["running","stopped"],"description":"Salary running or stopped (Stop employee salary)."},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"search","type":"string","required":false,"enum":[],"description":"Number, name or email."},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_eos_policies","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""},{"name":"name","type":"string","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":[],"description":""},{"name":"contract_type","type":"string","required":false,"enum":["limited","unlimited"],"description":""},{"name":"defaults_only","type":"boolean","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_evaluations","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"evaluation_id","type":"integer","required":false,"enum":[],"description":""},{"name":"cycle_id","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"branch","type":"integer","required":false,"enum":[],"description":""},{"name":"position","type":"integer","required":false,"enum":[],"description":""},{"name":"work_location","type":"integer","required":false,"enum":[],"description":""},{"name":"department","type":"integer","required":false,"enum":[],"description":""},{"name":"section","type":"integer","required":false,"enum":[],"description":""},{"name":"project","type":"integer","required":false,"enum":[],"description":""},{"name":"hierarchy_group","type":"integer","required":false,"enum":[],"description":""},{"name":"stage","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":[],"description":""},{"name":"okrs","type":"string","required":false,"enum":[],"description":""},{"name":"missing","type":"string","required":false,"enum":[],"description":""},{"name":"employee_status","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_events","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_field_jobs","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["jobs","summary","sites","mine","flags"],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_hr_calculators","description":"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=.","arguments":[{"name":"country","type":"string","required":false,"enum":[],"description":"ISO country code, e.g. \"AE\". Default IQ."},{"name":"variant","type":"string","required":false,"enum":[],"description":""},{"name":"date","type":"string","required":false,"enum":[],"description":"Y-m-d; default today."}],"read_only":true,"destructive":false},{"name":"list_importers","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"type","type":"string","required":false,"enum":[],"description":""},{"name":"language","type":"string","required":false,"enum":["en","ar"],"description":""},{"name":"existing","type":"boolean","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_insurance","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""},{"name":"active","type":"boolean","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_integrations","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["keys","webhooks","deliveries","delivery","events","marketplace"],"description":""},{"name":"category","type":"string","required":false,"enum":[],"description":""},{"name":"active","type":"string","required":false,"enum":["all","active","inactive"],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"webhook_id","type":"integer","required":false,"enum":[],"description":""},{"name":"delivery_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["delivered","failed"],"description":""}],"read_only":true,"destructive":false},{"name":"list_leave_adjustments","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["adjustments","moved"],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"year","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_leave_types","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":["annual","casual","hourly","sick"],"description":""}],"read_only":true,"destructive":false},{"name":"list_legal_rules","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_letters","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["letters","templates","signatures"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"template","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"integer","required":false,"enum":[],"description":""},{"name":"classification","type":"string","required":false,"enum":["positive","neutral","negative"],"description":""},{"name":"effective_from","type":"string","required":false,"enum":[],"description":""},{"name":"effective_to","type":"string","required":false,"enum":[],"description":""},{"name":"confirmation","type":"string","required":false,"enum":["required","not_required","confirmed","unconfirmed"],"description":""},{"name":"creator","type":"integer","required":false,"enum":[],"description":""},{"name":"created_from","type":"string","required":false,"enum":[],"description":""},{"name":"created_to","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_machine_users","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"device_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_missing_punches","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["pending","approved","rejected","cancelled","withdrawn"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_status","type":"string","required":false,"enum":["active","suspended","terminated"],"description":"Active or inactive employees only (ZenHR: Active \/ Inactive \/ Both)"},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_my_connected_apps","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"list_my_notifications","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"unread","type":"boolean","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":["requests","payroll","attendance","performance","tasks","field","recruitment","documents","announcements","people","greetings","security","admin","general"],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"after_id","type":"integer","required":false,"enum":[],"description":"Only notices newer than this id (what the live bell asks for)."}],"read_only":true,"destructive":false},{"name":"list_my_payslips","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"payslip_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_notification_events","description":"Which events notify whom (notifications.manage, docs\/notifications.md \u00a713): 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["request","record","setup","security","action","scheduled"],"description":""},{"name":"category","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_notification_log","description":"The company's notifications log (notifications.log.view, docs\/notifications.md \"\u0633\u062c\u0644 \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062a\"), 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"category","type":"string","required":false,"enum":["requests","payroll","attendance","performance","tasks","field","recruitment","documents","announcements","people","greetings","security","admin","general"],"description":""},{"name":"channel","type":"string","required":false,"enum":["bell","push","email","whatsapp"],"description":""},{"name":"status","type":"string","required":false,"enum":["delivered","failed","logged","queued","held","skipped","no_device","read","unread"],"description":""},{"name":"person","type":"integer","required":false,"enum":[],"description":""},{"name":"branch","type":"integer","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["system","person","announcement"],"description":""},{"name":"actor","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":"1-100, default 30."}],"read_only":true,"destructive":false},{"name":"list_org_units","description":"The organization structure: work locations, departments, sections (with their department as parent_id), projects and hierarchy groups. branch_id null means all branches.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"type","type":"string","required":false,"enum":["work_location","department","section","project","hierarchy_group","business_unit","division","segment"],"description":""}],"read_only":true,"destructive":false},{"name":"list_payroll","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["runs","run","payslip","transactions","transaction","loans","packages","templates"],"description":""},{"name":"run_id","type":"integer","required":false,"enum":[],"description":""},{"name":"payslip_id","type":"integer","required":false,"enum":[],"description":""},{"name":"transaction_id","type":"integer","required":false,"enum":[],"description":""},{"name":"transaction_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"kind_filter","type":"string","required":false,"enum":["regular","off_cycle"],"description":"For kind runs: the run kind."},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"type","type":"string","required":false,"enum":["earning","deduction"],"description":""},{"name":"off_cycle","type":"boolean","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_payroll_costs","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["exchange_rates","cost_center_groups","cost_allocations","part_time","salaries","salary_batches","calculate_options"],"description":""},{"name":"currency","type":"string","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":"A branch id; for exchange_rates also \"company\"."},{"name":"code","type":"string","required":false,"enum":[],"description":""},{"name":"center","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["active","inactive","upcoming"],"description":""},{"name":"group","type":"integer","required":false,"enum":[],"description":""},{"name":"type","type":"integer","required":false,"enum":[],"description":""},{"name":"effective","type":"string","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"year","type":"integer","required":false,"enum":[],"description":""},{"name":"month","type":"integer","required":false,"enum":[],"description":""},{"name":"salary_type","type":"string","required":false,"enum":["regular","off_cycle"],"description":""},{"name":"slip_type","type":"string","required":false,"enum":["payroll","in_payroll_settlement","off_cycle_settlement"],"description":"For kind salaries: ZenHR's salary slip type."},{"name":"run_status","type":"string","required":false,"enum":["draft","pending","rejected","approved","sent"],"description":""},{"name":"date_from","type":"string","required":false,"enum":[],"description":""},{"name":"date_to","type":"string","required":false,"enum":[],"description":""},{"name":"in_advance","type":"string","required":false,"enum":["yes","no"],"description":""},{"name":"in_advance_paid","type":"string","required":false,"enum":["yes","no"],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"department","type":"integer","required":false,"enum":[],"description":""},{"name":"salary_month","type":"string","required":false,"enum":[],"description":"For kind calculate_options: YYYY-MM."},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_payroll_setup","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["settings","rules"],"description":""},{"name":"section","type":"string","required":true,"enum":["payroll_setup","in_advance","extra_salaries","tax_setup","journal","provision_setup","social-security","tax","extra-salaries","bank-accounts","bank-templates","slip-templates"],"description":"Settings sections for kind settings, list sections for kind rules."},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"For bank-accounts: only this branch's accounts."}],"read_only":true,"destructive":false},{"name":"list_pending_biometrics","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_permission_groups","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_permission_overrides","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_positions","description":"The company's job titles (positions).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_projects","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_provisions","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["rows","months"],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"stb_types","type":"array","required":false,"enum":[],"description":""},{"name":"contract_type","type":"string","required":false,"enum":["limited","unlimited"],"description":""},{"name":"employee_status","type":"string","required":false,"enum":["active","inactive"],"description":""},{"name":"kind_filter","type":"string","required":false,"enum":[],"description":"Employee kind."}],"read_only":true,"destructive":false},{"name":"list_punch_log","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"channel","type":"string","required":false,"enum":["web","mobile","mcp"],"description":""},{"name":"device","type":"string","required":false,"enum":[],"description":""},{"name":"ip","type":"string","required":false,"enum":[],"description":""},{"name":"flagged","type":"boolean","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["accepted","flagged","held","blocked"],"description":""},{"name":"review","type":"string","required":false,"enum":["pending","approved","rejected"],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_recruitment","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["summary","jobs","job","candidates","candidate","interviews"],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"candidate_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"type","type":"string","required":false,"enum":["full_time","part_time","contract","internship"],"description":""},{"name":"department","type":"integer","required":false,"enum":[],"description":""},{"name":"branch","type":"integer","required":false,"enum":[],"description":""},{"name":"job","type":"integer","required":false,"enum":[],"description":""},{"name":"stage","type":"string","required":false,"enum":["applied","screening","interview","offer","hired","rejected"],"description":""},{"name":"source","type":"string","required":false,"enum":["careers_page","referral","linkedin","job_board","other"],"description":""},{"name":"candidate","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_recruitment_ats","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["pipeline","dashboard","pool","offers","offer","availability","templates","assessments","stage_assessments","settings"],"description":""},{"name":"candidate_id","type":"integer","required":false,"enum":[],"description":""},{"name":"offer_id","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"job","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"tag","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["draft","pending_approval","approved","rejected","sent","accepted","declined","expired","withdrawn"],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_reports","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"report","type":"string","required":false,"enum":[],"description":"A report key, for its filters, columns and switches"}],"read_only":true,"destructive":false},{"name":"list_request_types","description":"The request types the company offers (expense, overtime, missing punch, general, vacation resumption, vacation encashment, HR letter\u2026): 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 \u2192 value and label).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_role_assignments","description":"Who has which role in which scope. Filter by user_id or role_id.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":false,"enum":[],"description":""},{"name":"role_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_roles","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_salary_scales","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["scales","scale","job_grades","placement"],"description":""},{"name":"scale_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["active","inactive","draft"],"description":""}],"read_only":true,"destructive":false},{"name":"list_setup_form","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"entity","type":"string","required":true,"enum":["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"],"description":""}],"read_only":true,"destructive":false},{"name":"list_shared_phones","description":"Phones used by more than one account (app_devices.view, docs\/platform-control.md \u00ab\u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u00bb), for the people the permission's scope covers: each phone row as list_app_devices plus shared {accounts (how many accounts used this phone, any company), others (how many of them you can't see: other companies or outside your scope, never named), list [{user, order (1 = first on the phone), first_used_at, last_used_at, first_sign_in_at, last_sign_in_at, sign_ins, allowed (an HR exception), this_phone_row}]}, the summary, and the company's policy {mode allow|warn|block, max_accounts, inherit (the Mihnaro default)}. Filters as list_app_devices; page, per_page.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"platform","type":"string","required":false,"enum":[],"description":""},{"name":"signed_in","type":"boolean","required":false,"enum":[],"description":""},{"name":"seen_days","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_stb_encashments","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["list","available","settings"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_tasks","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"task_id","type":"integer","required":false,"enum":[],"description":""},{"name":"kind_list","type":"string","required":false,"enum":["tasks","templates"],"description":""},{"name":"tab","type":"string","required":false,"enum":["mine","assigned","employees"],"description":""},{"name":"show","type":"string","required":false,"enum":["pending","past_due","completed","all"],"description":""},{"name":"status","type":"string","required":false,"enum":["todo","in_progress","awaiting_confirmation","done","cancelled"],"description":""},{"name":"kind","type":"string","required":false,"enum":["custom","document_upload","document_download","give_asset","take_asset","add_bank_account","add_family_member","complete_profile"],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"template","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_team_leaves","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["days","hours"],"description":""},{"name":"status","type":"string","required":false,"enum":["pending","approved","rejected","withdrawn","all"],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_time_setup","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["shifts","overtime_types","holidays","geolocations","biometric_devices","detected_devices"],"description":""},{"name":"year","type":"integer","required":false,"enum":[],"description":"For holidays"}],"read_only":true,"destructive":false},{"name":"list_workflows","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["mine","workflows","workflow","templates","template"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_zenhr_history","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["days","punches","balances"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["present","absent","partial"],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"year","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"live_location","description":"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\u201310, rules; no include rule = everyone; docs\/platform-control.md \u00ab\u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u00bb); 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 \u00ab\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb); 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 \u00ab\u0627\u0644\u0645\u0648\u0642\u0639 \u0634\u0631\u0637 \u0644\u0641\u062a\u062d \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u00bb); 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\u2013730, rules; docs\/platform-control.md \u00ab\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0647\u0627\u062a\u0641\u00bb).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get_policy","set_policy","positions","trail","export","get_rule","set_rule"],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":"set_policy: the policy fields and rules"},{"name":"filters","type":"object","required":false,"enum":[],"description":"positions: branch, department, group, status, q"},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"policy","type":"string","required":false,"enum":["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"],"description":"get_rule \/ set_rule"},{"name":"date","type":"string","required":false,"enum":[],"description":"trail: Y-m-d, default today"}],"read_only":false,"destructive":false},{"name":"log_timesheet","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["add","delete","submit"],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_date","type":"string","required":false,"enum":[],"description":""},{"name":"hours","type":"number","required":false,"enum":[],"description":""},{"name":"description","type":"string","required":false,"enum":[],"description":""},{"name":"entry_id","type":"integer","required":false,"enum":[],"description":""},{"name":"week","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_accounting","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","oauth_url","test","refresh","disconnect","map","auto_match","post","retry","reverse","repost","sync_employees"],"description":""},{"name":"provider","type":"string","required":false,"enum":["odoo","quickbooks","xero","netsuite","business_central","sap_b1","sap_s4hana","dynamics_fo"],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"A branch's own connection (when the ledger is set per branch); empty = the company's."},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"items","type":"array","required":false,"enum":[],"description":""},{"name":"run_id","type":"integer","required":false,"enum":[],"description":""},{"name":"posting_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_air_ticket_policies","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","update","delete","assign","unassign"],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_air_tickets","description":"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 \u00d7 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["add","mark_paid","delete","bulk_delete"],"description":""},{"name":"transaction_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_announcement","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","delete"],"description":""},{"name":"announcement_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_announcement_media","description":"An announcement's pictures and files, uploaded into Mihnaro (announcements.manage; docs\/communication.md \u00a75\u062c). 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["upload","gallery_add","gallery_move","gallery_caption","gallery_remove","attachment_add","attachment_rename","attachment_remove"],"description":""},{"name":"announcement_id","type":"integer","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["image","file"],"description":""},{"name":"data","type":"string","required":false,"enum":[],"description":"data:<type>;base64,\u2026 or base64"},{"name":"name","type":"string","required":false,"enum":[],"description":""},{"name":"caption","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"index","type":"integer","required":false,"enum":[],"description":""},{"name":"to","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_api_key","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","update","revoke"],"description":""},{"name":"api_key_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_approval_delegation","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["list","delegate","delete"],"description":""},{"name":"delegate_id","type":"integer","required":false,"enum":[],"description":""},{"name":"starts_on","type":"string","required":false,"enum":[],"description":"Y-m-d"},{"name":"ends_on","type":"string","required":false,"enum":[],"description":"Y-m-d, empty = until ended"},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_approval_setup","description":"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 \u2014 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","approvers","save_chains","save_template","delete_template"],"description":""},{"name":"chains","type":"object","required":false,"enum":[],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_assessments","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save_category","delete_category","save_question","delete_question","save_test","delete_test","invite","resend_invitation","cancel_invitation","grade","install_template"],"description":""},{"name":"category_id","type":"integer","required":false,"enum":[],"description":""},{"name":"question_id","type":"integer","required":false,"enum":[],"description":""},{"name":"test_id","type":"integer","required":false,"enum":[],"description":""},{"name":"invitation_id","type":"integer","required":false,"enum":[],"description":""},{"name":"answer_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_asset","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","assign","release","status","delete","save_type","delete_type"],"description":""},{"name":"asset_id","type":"integer","required":false,"enum":[],"description":""},{"name":"asset_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_business_travel","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["update_setup","create","update","delete"],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_calibration","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["board","history","move"],"description":""},{"name":"cycle_id","type":"integer","required":false,"enum":[],"description":""},{"name":"evaluation_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_checklist","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["overview","show","add","toggle","delete"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"item_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_connected_account","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["mode","save","authorize_url","test","disconnect"],"description":""},{"name":"provider","type":"string","required":true,"enum":["zoom","google","microsoft","linkedin","odoo","quickbooks","xero","netsuite","business_central","sap_b1","sap_s4hana","dynamics_fo"],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"The branch's own connection; empty = the whole company's."},{"name":"mode","type":"string","required":false,"enum":["company","branch"],"description":""},{"name":"app","type":"string","required":false,"enum":["own","platform"],"description":""},{"name":"client_id","type":"string","required":false,"enum":[],"description":""},{"name":"client_secret","type":"string","required":false,"enum":[],"description":"Write-only: never returned."},{"name":"tenant","type":"string","required":false,"enum":[],"description":""},{"name":"organization","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_cost_allocations","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["add","delete"],"description":""},{"name":"allocation_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_cost_center_groups","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","delete"],"description":""},{"name":"group_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_custom_report","description":"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\", \u2026] in order, shared_branch_ids (ZenHR's \"Choose the branches\u2026\": 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["sources","save","delete"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_device_people","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","get","enroll","rules","exclude","delete_rule","unenroll","profile","remove","pull_templates"],"description":""},{"name":"device_id","type":"integer","required":false,"enum":[],"description":""},{"name":"rule_id","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"department","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"group_id","type":"integer","required":false,"enum":[],"description":""},{"name":"by","type":"string","required":false,"enum":["employees","department","branch","position","group","all"],"description":""},{"name":"ids","type":"array","required":false,"enum":[],"description":""},{"name":"device_ids","type":"array","required":false,"enum":[],"description":""},{"name":"card","type":"string","required":false,"enum":[],"description":""},{"name":"password","type":"string","required":false,"enum":[],"description":""},{"name":"privilege","type":"integer","required":false,"enum":[],"description":""},{"name":"verify_mode","type":"string","required":false,"enum":["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","palm"],"description":""},{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"push_photo","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_discipline","description":"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}).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["suggest","record","approve","delete","generate","save_action_type","delete_action_type","save_rule","delete_rule","save_time_off"],"description":""},{"name":"action_id","type":"integer","required":false,"enum":[],"description":"The disciplinary action (approve, delete)."},{"name":"id","type":"integer","required":false,"enum":[],"description":"The action type or rule (save to change, delete), or the time-off type (save_time_off)."},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_eos_policies","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","update","delete"],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_evaluation_cycle","description":"Evaluation cycles (performance.manage). action create: fields evaluation_template_id, name, branch_ids, year, evaluation_part (Y, H1\u2013H2, Q1\u2013Q4 or M1\u2013M12 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","launch","close","dates","add_employees","delete","task_holders","evaluation_dates","remove"],"description":""},{"name":"cycle_id","type":"integer","required":false,"enum":[],"description":""},{"name":"evaluation_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_event","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","delete"],"description":""},{"name":"event_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_exchange_rates","description":"Exchange rates (payroll_setup.manage). action save: fields from_currency, to_currency (ISO codes, different), rate (> 0), effective_date, optional reverse_rate (else 1 \u00f7 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","copy","toggle","delete"],"description":""},{"name":"rate_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_feedback","description":"360\u00b0 feedback and feedback forms. For everyone: submit (request_id; fields scores {criterion id: 1\u20135}, comment; on a survey cycle fields answers {question index: 1\u2013max 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\u201310, 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["submit","open_form","answer_form","results","list_cycles","create_cycle","show_cycle","launch","close","delete_cycle","list_forms","create_form","show_form","delete_form"],"description":""},{"name":"cycle_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"request_id","type":"integer","required":false,"enum":[],"description":""},{"name":"assignment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"form_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_field_customers","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","get","save","delete"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_field_jobs","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save_job","decide","submit_without_departure","delete_job","save_site","delete_site"],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"site_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_finance","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["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_salary"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"transaction_id","type":"integer","required":false,"enum":[],"description":""},{"name":"loan_id","type":"integer","required":false,"enum":[],"description":""},{"name":"installment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"package_id","type":"integer","required":false,"enum":[],"description":""},{"name":"ids","type":"array","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_goals","description":"Goals. action add: fields title, description, due_date, and employee_ids (performance.manage over them; default: myself). action update: goal_id, fields progress 0\u2013100, status open|achieved|missed (the owner or HR). action delete: goal_id (whoever set it, or HR).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["add","update","delete"],"description":""},{"name":"goal_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_insurance","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create_policy","update_policy","delete_policy","add_member","remove_member"],"description":""},{"name":"policy_id","type":"integer","required":false,"enum":[],"description":""},{"name":"member_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_inventory","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["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","return"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_leave_balances","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"to_leave_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["balances","balance_breakdown","encashments","add_leave","adjust","delete_adjustment","move","set_setup","apply_type","encash","cancel_encashment","cancel_future","deactivate_move"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"year","type":"integer","required":false,"enum":[],"description":""},{"name":"as_of","type":"string","required":false,"enum":[],"description":""},{"name":"days","type":"number","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"max_days","type":"number","required":false,"enum":[],"description":""},{"name":"start_date","type":"string","required":false,"enum":[],"description":""},{"name":"end_date","type":"string","required":false,"enum":[],"description":""},{"name":"start_time","type":"string","required":false,"enum":[],"description":""},{"name":"end_time","type":"string","required":false,"enum":[],"description":""},{"name":"entitlement_days","type":"number","required":false,"enum":[],"description":""},{"name":"open_balance","type":"number","required":false,"enum":[],"description":""},{"name":"carry_balance","type":"number","required":false,"enum":[],"description":""},{"name":"balance_year","type":"integer","required":false,"enum":[],"description":""},{"name":"active","type":"boolean","required":false,"enum":[],"description":""},{"name":"reset","type":"boolean","required":false,"enum":[],"description":""},{"name":"notes","type":"string","required":false,"enum":[],"description":""},{"name":"adjustment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"encashment_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_miscellaneous_requests","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["list","update","delete"],"description":""},{"name":"request_id","type":"integer","required":false,"enum":[],"description":""},{"name":"miscellaneous_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["pending","approved","rejected","cancelled"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"active","type":"string","required":false,"enum":["active","inactive","all"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""},{"name":"end_date","type":"string","required":false,"enum":[],"description":""},{"name":"subject","type":"string","required":false,"enum":[],"description":""},{"name":"effective_date","type":"string","required":false,"enum":[],"description":""},{"name":"details","type":"string","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_my_connected_app","description":"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.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["oauth","token"],"description":""}],"read_only":false,"destructive":true},{"name":"manage_my_dashboards","description":"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\u20134 (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\u20136 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\u20134}, 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["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_widgets"],"description":""},{"name":"dashboard_id","type":"integer","required":false,"enum":[],"description":""},{"name":"widget_id","type":"integer","required":false,"enum":[],"description":""},{"name":"name","type":"object","required":false,"enum":[],"description":""},{"name":"metric","type":"string","required":false,"enum":["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","report"],"description":""},{"name":"title","type":"object","required":false,"enum":[],"description":""},{"name":"chart","type":"string","required":false,"enum":[],"description":""},{"name":"width","type":"integer","required":false,"enum":[],"description":""},{"name":"ids","type":"array","required":false,"enum":[],"description":""},{"name":"report_type","type":"string","required":false,"enum":["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_pay"],"description":""},{"name":"breakdown","type":"string","required":false,"enum":["none","age_group","gender","nationality","service_period","work_type"],"description":""},{"name":"level","type":"string","required":false,"enum":["company","branch","work_location","department","section","group","project","job_role"],"description":""},{"name":"unit_ids","type":"array","required":false,"enum":[],"description":""},{"name":"interval","type":"integer","required":false,"enum":[],"description":""},{"name":"upcoming","type":"boolean","required":false,"enum":[],"description":""},{"name":"options","type":"object","required":false,"enum":[],"description":""},{"name":"show","type":"array","required":false,"enum":[],"description":""},{"name":"order","type":"array","required":false,"enum":[],"description":""},{"name":"widths","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_my_list_columns","description":"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).","arguments":[{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"list","type":"string","required":false,"enum":[],"description":"A list key, e.g. salaries or requests.leave."},{"name":"hidden","type":"array","required":false,"enum":[],"description":"Column keys to hide (action set)."}],"read_only":false,"destructive":false},{"name":"manage_my_notifications","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["read","read_all","preferences","save_preferences"],"description":""},{"name":"notice_id","type":"integer","required":false,"enum":[],"description":""},{"name":"unread","type":"boolean","required":false,"enum":[],"description":""},{"name":"categories","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_my_push_tokens","description":"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.","arguments":[{"name":"action","type":"string","required":true,"enum":["list","register","forget"],"description":""},{"name":"token","type":"string","required":false,"enum":[],"description":""},{"name":"platform","type":"string","required":false,"enum":["ios","android"],"description":""},{"name":"provider","type":"string","required":false,"enum":["fcm","apns"],"description":""},{"name":"device_name","type":"string","required":false,"enum":[],"description":""},{"name":"apns_environment","type":"string","required":false,"enum":["production","sandbox"],"description":""}],"read_only":false,"destructive":false},{"name":"manage_my_system_announcements","description":"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.","arguments":[{"name":"action","type":"string","required":true,"enum":["list","dismiss","acknowledge"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"channel","type":"string","required":false,"enum":["web","app"],"description":""}],"read_only":false,"destructive":false},{"name":"manage_nine_box","description":"The 9-box grid (performance \u00d7 potential, docs\/succession.md). action grid (performance.view or .manage, their scope): filters cycle_id, branch_id, department_id, position_id, box (1\u20139; 1 low\/low, 9 high\/high) \u2192 each box with its employees, and those not placed yet. action history: employee_id \u2192 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\u20135}, notes, evaluation_cycle_id, assessed_on. action delete_assessment: assessment_id.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["grid","history","assess","delete_assessment"],"description":""},{"name":"cycle_id","type":"integer","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"box","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"assessment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_notification_setup","description":"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\u2013365, null = not told); minutes punch_alert_employee, punch_alert_manager, punch_alert_hr (0\u20132880).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"save","type":"boolean","required":false,"enum":[],"description":""},{"name":"categories_off","type":"array","required":false,"enum":[],"description":""},{"name":"receiver_emails","type":"array","required":false,"enum":[],"description":""},{"name":"reminders","type":"object","required":false,"enum":[],"description":""},{"name":"document_notice","type":"object","required":false,"enum":[],"description":"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)."},{"name":"email_everyone","type":"boolean","required":false,"enum":[],"description":"Also send every notice by email to everyone who has an email."}],"read_only":false,"destructive":false},{"name":"manage_okrs","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save_objective","delete_objective","publish","mass_assign"],"description":""},{"name":"evaluation_id","type":"integer","required":false,"enum":[],"description":""},{"name":"objective_id","type":"integer","required":false,"enum":[],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_overtimes","description":"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 \u00d7 the employee's overtime rate as an earning in the open payroll month. GET \/overtimes on the API lists them.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["add","update","convert_to_time_off","batch_as_income"],"description":""},{"name":"overtime_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_part_time","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["add","update","delete"],"description":""},{"name":"assignment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_payroll_run","description":"Payroll runs (payroll.manage). action calculate: Manage salaries \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["calculate","run","off_cycle","recalculate","approve","paid","delete","adjust","remove_employee","revert_check","revert","settlement_candidates","off_cycle_settlement"],"description":""},{"name":"run_id","type":"integer","required":false,"enum":[],"description":""},{"name":"payslip_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_payroll_setup","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["update_settings","add_rule","update_rule","delete_rule","update_ss_salaries"],"description":""},{"name":"section","type":"string","required":false,"enum":["payroll_setup","in_advance","extra_salaries","tax_setup","journal","provision_setup","social-security","tax","extra-salaries","bank-accounts","bank-templates","slip-templates"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_performance_setup","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":[],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"index","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_project_contributions","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"projects","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_provisions","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["calculate","delete_month","bulk_delete"],"description":""},{"name":"month","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"from","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"to","type":"string","required":false,"enum":[],"description":"YYYY-MM"},{"name":"work_type","type":"string","required":false,"enum":["full_time","part_time","freelance","internship","contractor"],"description":""},{"name":"contract_type","type":"string","required":false,"enum":["limited","unlimited"],"description":""},{"name":"ids","type":"array","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""},{"name":"job_role_ids","type":"array","required":false,"enum":[],"description":""},{"name":"work_location_ids","type":"array","required":false,"enum":[],"description":""},{"name":"department_ids","type":"array","required":false,"enum":[],"description":""},{"name":"section_ids","type":"array","required":false,"enum":[],"description":""},{"name":"project_ids","type":"array","required":false,"enum":[],"description":""},{"name":"hierarchy_group_ids","type":"array","required":false,"enum":[],"description":""},{"name":"business_unit_ids","type":"array","required":false,"enum":[],"description":""},{"name":"division_ids","type":"array","required":false,"enum":[],"description":""},{"name":"segment_ids","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_recruitment","description":"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\u20135. 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save_job","delete_job","add_candidate","update_candidate","delete_candidate","add_note","schedule_interview","update_interview","hire","careers"],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"candidate_id","type":"integer","required":false,"enum":[],"description":""},{"name":"interview_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_recruitment_ats","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["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","settings"],"description":""},{"name":"candidate_id","type":"integer","required":false,"enum":[],"description":""},{"name":"job_id","type":"integer","required":false,"enum":[],"description":""},{"name":"offer_id","type":"integer","required":false,"enum":[],"description":""},{"name":"interview_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"stage","type":"string","required":false,"enum":["applied","screening","interview","offer","hired","rejected","assessment"],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_salary_package_templates","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","update","delete","add_item","remove_item"],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"item_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_salary_scales","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["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_employee"],"description":""},{"name":"scale_id","type":"integer","required":false,"enum":[],"description":""},{"name":"layer","type":"string","required":false,"enum":["grade","band","level"],"description":""},{"name":"layer_id","type":"integer","required":false,"enum":[],"description":""},{"name":"grade_id","type":"integer","required":false,"enum":[],"description":"A job grade (job grades screen)."},{"name":"level_id","type":"integer","required":false,"enum":[],"description":"A job grade level."},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_saved_report","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","delete"],"description":""},{"name":"report","type":"string","required":false,"enum":[],"description":""},{"name":"name","type":"string","required":false,"enum":[],"description":""},{"name":"options","type":"object","required":false,"enum":[],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_slack","description":"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\/\u2026; 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["show","save"],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_stb_encashments","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","delete","settings"],"description":""},{"name":"encashment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_succession","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","save","delete","add_successor","remove_successor"],"description":""},{"name":"key_position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"successor_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_suspension","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","decide","withdraw","resume","decide_resumption","withdraw_resumption","cancel","decide_cancel","cancel_resumption","decide_cancel_resumption","delete"],"description":""},{"name":"suspension_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_task","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["assign","status","complete","confirm_receipt","delete","bulk_delete","save_template","delete_template","settings"],"description":""},{"name":"task_id","type":"integer","required":false,"enum":[],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"values","type":"object","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_technicians","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","get","export","save","delete"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_tv","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","save_channel","delete_channel","save_device","rotate_device","delete_device","save_item","delete_item"],"description":""},{"name":"channel_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device_id","type":"integer","required":false,"enum":[],"description":""},{"name":"item_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_vehicles","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","get","alerts","list_log","export","save","delete","save_log","delete_log"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"row_id","type":"integer","required":false,"enum":[],"description":""},{"name":"log","type":"string","required":false,"enum":["documents","maintenance","fuel"],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"manage_webhook","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["create","update","delete","rotate_secret","test","resend"],"description":""},{"name":"webhook_id","type":"integer","required":false,"enum":[],"description":""},{"name":"delivery_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"manage_workflow","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["send","mass_onboard","cancel","save_template","copy_template","delete_template"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"mark_announcement_read","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"announcement_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"my_face_consent","description":"The employee's own face consent and presence check (self.face, docs\/attendance-security.md \u00a719). 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","withdraw"],"description":""}],"read_only":false,"destructive":false},{"name":"payroll_lists","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["requests","screening","package","add_amortized"],"description":""},{"name":"list","type":"string","required":false,"enum":["air-tickets","business-trips","expenses","missing-punches"],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"package_id","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"phone_biometric_keys","description":"Phone keys bound to the faces and fingers on the phone (docs\/attendance-security.md \u00a719). 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","approve","reset"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"publish_biometrics","description":"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 \u2192 queued\/sent\/done\/failed per device. action matrix: employee_id's slots \u00d7 devices.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["decide","publish_all_pending","auto_publish","publish_slot","publish_missing","remove_slot","update_all","progress","matrix"],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device_ids","type":"array","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""},{"name":"on","type":"boolean","required":false,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":["publish","source_only","reject"],"description":""},{"name":"confirm","type":"boolean","required":false,"enum":[],"description":""},{"name":"batch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"queue_report","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["queue","list","show"],"description":""},{"name":"report","type":"string","required":false,"enum":[],"description":""},{"name":"format","type":"string","required":false,"enum":["xlsx","csv"],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"saved_id","type":"integer","required":false,"enum":[],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"read_section","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["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"],"description":""},{"name":"part","type":"string","required":true,"enum":["records","record","form","options","blocks","export","file"],"description":""},{"name":"record_id","type":"integer","required":false,"enum":[],"description":""},{"name":"parent","type":"integer","required":false,"enum":[],"description":"The parent record, for a section under a record (an employee, for employee_documents)."},{"name":"field","type":"string","required":false,"enum":[],"description":"For options and file."},{"name":"search","type":"string","required":false,"enum":[],"description":""},{"name":"sort","type":"string","required":false,"enum":[],"description":""},{"name":"direction","type":"string","required":false,"enum":["asc","desc"],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"rehire_employee","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":"The ended record"},{"name":"hire_date","type":"string","required":true,"enum":[],"description":"YYYY-MM-DD"},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_number","type":"string","required":false,"enum":[],"description":""},{"name":"position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_location_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"section_id","type":"integer","required":false,"enum":[],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":""},{"name":"manager_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_type","type":"string","required":false,"enum":["full_time","part_time","freelance","internship","contractor"],"description":""},{"name":"contract_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"contract_end_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"probation_end_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"copy_bank_accounts","type":"boolean","required":false,"enum":[],"description":""},{"name":"copy_family","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"remove_project_assignment","description":"Take an employee off a project (by assignment id from list_projects).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"assignment_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"remove_role_assignment","description":"Take a role away from someone (by assignment id from list_role_assignments).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"assignment_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"request_comments","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["requests","leaves"],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["list","add"],"description":""},{"name":"body","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"request_field_upload","description":"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 \u00a712), 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"job_id","type":"integer","required":true,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"request_leave","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["request","withdraw"],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"start_date","type":"string","required":false,"enum":[],"description":""},{"name":"end_date","type":"string","required":false,"enum":[],"description":""},{"name":"start_time","type":"string","required":false,"enum":[],"description":""},{"name":"end_time","type":"string","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"half_day","type":"boolean","required":false,"enum":[],"description":""},{"name":"leave_id","type":"integer","required":false,"enum":[],"description":"To withdraw"}],"read_only":false,"destructive":false},{"name":"reset_user_two_factor","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"resolve_app_link","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"url","type":"string","required":false,"enum":[],"description":"The link, as a notification or a search result gives it"}],"read_only":true,"destructive":false},{"name":"resolve_template_conflict","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"template_id","type":"integer","required":true,"enum":[],"description":""},{"name":"version_id","type":"integer","required":false,"enum":[],"description":""},{"name":"re_enroll_device_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"resolve_termination","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["substitute","withdraw_requests","take_asset","expire_insurance","pay_loans","deduct_loans","cancel_termination"],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"restore_employee","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":"The internal id; or give employee_number."},{"name":"employee_number","type":"string","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"With employee_number, when numbers repeat across branches."}],"read_only":false,"destructive":false},{"name":"review_evaluation","description":"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\u20135}, 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\u2013100, final_notes, notify_people.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"evaluation_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["self","review","notes","final"],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"review_field_evidence","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","show","void","c2pa","c2pa_download","devices","revoke_key"],"description":""},{"name":"evidence_id","type":"integer","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"key_id","type":"string","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"branch","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"review_payroll_run","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"run_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"review_punch","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"decision","type":"string","required":true,"enum":["approve","reject"],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"approve_device","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"review_timesheets","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"week","type":"string","required":false,"enum":[],"description":""},{"name":"decision","type":"string","required":false,"enum":["approved","rejected"],"description":""}],"read_only":false,"destructive":false},{"name":"role_matrix","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"role_id","type":"integer","required":true,"enum":[],"description":""},{"name":"actions","type":"object","required":false,"enum":[],"description":"Rows to change: {\"setup.positions.view\": {\"web\": true, \"app\": true}}"},{"name":"fields","type":"object","required":false,"enum":[],"description":"Rows to change: {\"setup_positions.code\": {\"web\": \"edit\", \"app\": \"view\"}}"}],"read_only":false,"destructive":false},{"name":"run_mass_action","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":["run","history"],"description":""},{"name":"tab","type":"string","required":false,"enum":["personal","professional","financial"],"description":""},{"name":"changes","type":"object","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""},{"name":"dry_run","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"run_report","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"report","type":"string","required":false,"enum":[],"description":""},{"name":"filters","type":"object","required":false,"enum":[],"description":""},{"name":"saved_id","type":"integer","required":false,"enum":[],"description":""},{"name":"custom_report_id","type":"integer","required":false,"enum":[],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"run_section_action","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["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"],"description":""},{"name":"action","type":"string","required":true,"enum":[],"description":""},{"name":"record_id","type":"integer","required":false,"enum":[],"description":""},{"name":"ids","type":"array","required":false,"enum":[],"description":""},{"name":"parent","type":"integer","required":false,"enum":[],"description":""},{"name":"input","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_attendance_record","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"clock_in","type":"string","required":false,"enum":[],"description":"HH:MM"},{"name":"clock_out","type":"string","required":false,"enum":[],"description":"HH:MM"},{"name":"replace","type":"boolean","required":false,"enum":[],"description":""},{"name":"record_id","type":"integer","required":false,"enum":[],"description":"To trust or untrust a record"}],"read_only":false,"destructive":false},{"name":"save_branch","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"Leave out to add a branch."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}; en is required for a new branch."},{"name":"code","type":"string","required":false,"enum":[],"description":""},{"name":"country","type":"string","required":false,"enum":[],"description":"ISO code from the supported list, e.g. IQ, SA, AE."},{"name":"currency","type":"string","required":false,"enum":[],"description":"3 letters; defaults to the country's."},{"name":"timezone","type":"string","required":false,"enum":[],"description":"e.g. Asia\/Baghdad; defaults to the country's."},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":"The main branch can't be turned off."}],"read_only":false,"destructive":false},{"name":"save_clock_button_scope","description":"Changes \"Hide the clock button outside the work location\" (attendance_setup.manage, docs\/attendance-security.md \u00a717); send only what changes. clock_hide_outside_location (off by default), scope: all or chosen, branch_ids, department_ids, employee_ids (lists replace the saved ones). branch_id saves a branch's own value, which can name only that branch, its departments and its employees; without it, the company's value, which only someone working across every branch may change. Only hides the button in the app: the punch check is \"Clock-in must be at a work location\" (clock_geofence).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"clock_hide_outside_location","type":"boolean","required":false,"enum":[],"description":""},{"name":"scope","type":"string","required":false,"enum":["all","chosen"],"description":""},{"name":"branch_ids","type":"array","required":false,"enum":[],"description":""},{"name":"department_ids","type":"array","required":false,"enum":[],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_clocking_security","description":"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\u2013168, 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"checks","type":"object","required":false,"enum":[],"description":"check \u2192 off, flag, hold, block or on"},{"name":"clock_sec_shared_window_hours","type":"integer","required":false,"enum":[],"description":""},{"name":"clock_sec_desktop_accuracy_m","type":"integer","required":false,"enum":[],"description":""},{"name":"clock_sec_travel_kmh","type":"integer","required":false,"enum":[],"description":""},{"name":"clock_sec_ip_distance_m","type":"integer","required":false,"enum":[],"description":""},{"name":"clock_sec_geoip_distance_km","type":"integer","required":false,"enum":[],"description":""},{"name":"clock_sec_office_ips","type":"string","required":false,"enum":[],"description":""},{"name":"clock_sec_datacenter_ips","type":"string","required":false,"enum":[],"description":""},{"name":"clock_sec_alert_email","type":"boolean","required":false,"enum":[],"description":""},{"name":"clock_offline_enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"clock_offline_hours","type":"integer","required":false,"enum":[],"description":""},{"name":"add_wifi","type":"object","required":false,"enum":[],"description":"bssid (aa:bb:cc:dd:ee:ff), ssid, label, branch_id, work_location_id"},{"name":"remove_wifi_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_company_settings","description":"Change System preferences \u2192 Account setup. Send only what changes; the rest stays. The logo is uploaded on the screen or the API, not here (remove_logo works).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"company_name_en","type":"string","required":false,"enum":[],"description":""},{"name":"company_name_ar","type":"string","required":false,"enum":[],"description":""},{"name":"company_address","type":"string","required":false,"enum":[],"description":""},{"name":"company_phone","type":"string","required":false,"enum":[],"description":""},{"name":"company_email","type":"string","required":false,"enum":[],"description":""},{"name":"currency","type":"string","required":false,"enum":[],"description":""},{"name":"work_start","type":"string","required":false,"enum":[],"description":"HH:MM"},{"name":"work_end","type":"string","required":false,"enum":[],"description":"HH:MM"},{"name":"late_grace_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"weekend_days","type":"array","required":false,"enum":[],"description":"0 = Sunday \u2026 6 = Saturday"},{"name":"eos_days_per_year","type":"number","required":false,"enum":[],"description":""},{"name":"eos_min_years","type":"number","required":false,"enum":[],"description":""},{"name":"org_level_type","type":"string","required":false,"enum":["company","branch"],"description":""},{"name":"hide_org_chart","type":"boolean","required":false,"enum":[],"description":""},{"name":"secure_documents","type":"boolean","required":false,"enum":[],"description":"The mobile app's file viewer is kept out of screenshots and recordings"},{"name":"remove_logo","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_employee","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":"Leave out to add an employee."},{"name":"employee_number","type":"string","required":false,"enum":[],"description":"Leave out for the next number (E0001...)."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}; en required for a new employee."},{"name":"email","type":"string","required":false,"enum":[],"description":"Work email; the sign-in account uses it."},{"name":"personal_email","type":"string","required":false,"enum":[],"description":""},{"name":"phone","type":"string","required":false,"enum":[],"description":"Digits, optional +, e.g. +9647701234567."},{"name":"hire_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD; required for a new employee."},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"Required for a new employee."},{"name":"status","type":"string","required":false,"enum":["active","suspended"],"description":""},{"name":"position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_location_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"section_id","type":"integer","required":false,"enum":[],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":""},{"name":"manager_id","type":"integer","required":false,"enum":[],"description":""},{"name":"create_login","type":"boolean","required":false,"enum":[],"description":""},{"name":"name_parts","type":"object","required":false,"enum":[],"description":"Four-part names: {\"en\": [first, second, third, last], \"ar\": [...]}; builds the full name."},{"name":"gender","type":"string","required":false,"enum":["male","female"],"description":""},{"name":"birth_date","type":"string","required":false,"enum":[],"description":""},{"name":"marital_status","type":"string","required":false,"enum":["single","married","divorced","widowed"],"description":""},{"name":"nationality","type":"string","required":false,"enum":[],"description":"Two-letter country code."},{"name":"national_id","type":"string","required":false,"enum":[],"description":"Needs employees.view_sensitive, like the passport and permit fields."},{"name":"passport_number","type":"string","required":false,"enum":[],"description":""},{"name":"job_title","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"work_type","type":"string","required":false,"enum":["full_time","part_time","freelance","internship","contractor"],"description":""},{"name":"job_grade_id","type":"integer","required":false,"enum":[],"description":""},{"name":"contract_type_id","type":"integer","required":false,"enum":[],"description":""},{"name":"supervisor_id","type":"integer","required":false,"enum":[],"description":""},{"name":"probation_end_date","type":"string","required":false,"enum":[],"description":""},{"name":"change_effective_date","type":"string","required":false,"enum":[],"description":"The date written in the job history for these changes."},{"name":"custom_fields","type":"object","required":false,"enum":[],"description":"{\"custom field id\": \"value\"}; list fields take the choice number."}],"read_only":false,"destructive":false},{"name":"save_employee_file_record","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["contracts","bank_accounts","family"],"description":""},{"name":"record_id","type":"integer","required":false,"enum":[],"description":"Leave out to add."},{"name":"fields","type":"object","required":false,"enum":[],"description":"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."}],"read_only":false,"destructive":false},{"name":"save_employee_numbering","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"A branch's own numbering instead of the company's."},{"name":"custom","type":"boolean","required":false,"enum":[],"description":"With branch_id: true gives the branch its own prefix, padding and counter; false returns it to the company's."},{"name":"prefix","type":"string","required":false,"enum":[],"description":"Optional letters, digits, - or _, up to 20; empty for none."},{"name":"padding","type":"integer","required":false,"enum":[],"description":"Pad the digits with zeros to this width (0 = none, up to 12)."},{"name":"next_number","type":"integer","required":false,"enum":[],"description":"Where new numbers start; numbers already used are skipped."},{"name":"scope","type":"string","required":false,"enum":["company","branch"],"description":"Without branch_id: numbers unique across the company or per branch."},{"name":"allow_reuse","type":"boolean","required":false,"enum":[],"description":"Without branch_id: let HR give out the numbers of archived and ended employees again."}],"read_only":false,"destructive":false},{"name":"save_employee_setting","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["contract_types","job_grades","document_types","custom_fields","org_levels","field_rules","e_signatures","banks"],"description":""},{"name":"record_id","type":"integer","required":false,"enum":[],"description":"Leave out to add."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"} (not for field_rules)."},{"name":"field","type":"string","required":false,"enum":[],"description":"field_rules only: one of the ZenHR field configuration keys (list_employee_settings kind=field_rules shows them)."},{"name":"applies_to","type":"string","required":false,"enum":["employees","company","both"],"description":"document_types only."},{"name":"notify_before","type":"string","required":false,"enum":["week","2_weeks","month","2_months","3_months","6_months"],"description":"document_types only: how long before expiry HR is told."},{"name":"group_name","type":"object","required":false,"enum":[],"description":"custom_fields only: the Additional Info group."},{"name":"image_base64","type":"string","required":false,"enum":[],"description":"e_signatures only: data:image\/png;base64,..."},{"name":"country","type":"string","required":false,"enum":[],"description":"banks only: ISO country code, e.g. IQ."},{"name":"branches","type":"array","required":false,"enum":[],"description":"banks only: the branches, [{\"en\": \"...\", \"ar\": \"...\"}]."},{"name":"external_ref","type":"string","required":false,"enum":[],"description":"The id this entry had in ZenHR (import)."}],"read_only":false,"destructive":false},{"name":"save_leave_type","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":["annual","casual","hourly","sick"],"description":""},{"name":"leave_type_id","type":"integer","required":false,"enum":[],"description":"To change or delete one"},{"name":"fields","type":"object","required":false,"enum":[],"description":""},{"name":"delete","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_letter_template","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["save","duplicate","favorite"],"description":""},{"name":"template_id","type":"integer","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_org_unit","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"unit_id","type":"integer","required":false,"enum":[],"description":"Leave out to add a unit."},{"name":"type","type":"string","required":false,"enum":["work_location","department","section","project","hierarchy_group","business_unit","division","segment"],"description":"Required for a new unit; can't change."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"code","type":"string","required":false,"enum":[],"description":""},{"name":"establishment_number","type":"string","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"Null for all branches."},{"name":"parent_id","type":"integer","required":false,"enum":[],"description":"For a section: its department."},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":""},{"name":"subsidiary_id","type":"string","required":false,"enum":[],"description":""},{"name":"establishment_name","type":"string","required":false,"enum":[],"description":"Governmental info (ZenHR), with governance_location, ss_number, tax_number, address and po_box."},{"name":"governance_location","type":"string","required":false,"enum":[],"description":""},{"name":"ss_number","type":"string","required":false,"enum":[],"description":""},{"name":"tax_number","type":"string","required":false,"enum":[],"description":""},{"name":"address","type":"string","required":false,"enum":[],"description":""},{"name":"po_box","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_permission_group","description":"Add (without group_id) or change a group. Members: branch_ids narrow it, unit_rules ({\"department\": [ids], \"work_location\": [ids]\u2026}) 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"group_id","type":"integer","required":false,"enum":[],"description":"Leave out to add a group."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"description","type":"object","required":false,"enum":[],"description":""},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":""},{"name":"branch_ids","type":"array","required":false,"enum":[],"description":""},{"name":"unit_rules","type":"object","required":false,"enum":[],"description":"{\"department\": [ids], \"work_location\": [ids], \"section\": [ids], \"project\": [ids]\u2026}"},{"name":"people","type":"array","required":false,"enum":[],"description":"Employee ids."},{"name":"manager_role_id","type":"integer","required":false,"enum":[],"description":""},{"name":"team_leader_role_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_role_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_permission_override","description":"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\u2026), web and app are hidden, view, edit or null. Both null takes it off. As POST permission-overrides. Needs roles.manage.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["action","field"],"description":""},{"name":"subject","type":"string","required":true,"enum":[],"description":""},{"name":"web","type":"string","required":false,"enum":["open","closed","hidden","view","edit"],"description":""},{"name":"app","type":"string","required":false,"enum":["open","closed","hidden","view","edit"],"description":""},{"name":"scope","type":"string","required":false,"enum":[],"description":"Where an opened action applies (company by default): a scope from list_roles."},{"name":"scope_id","type":"integer","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_position","description":"Add (without position_id) or change a job title (job role): name, code, active, type (regular or hazardous), available across all branches, job description.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"position_id","type":"integer","required":false,"enum":[],"description":"Leave out to add a position."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"code","type":"string","required":false,"enum":[],"description":""},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":""},{"name":"job_role_type","type":"string","required":false,"enum":["regular","hazardous"],"description":""},{"name":"company_level","type":"boolean","required":false,"enum":[],"description":"Available across all branches"},{"name":"job_description","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_professional_data","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"cancel_record_id","type":"integer","required":false,"enum":[],"description":""},{"name":"update_record_id","type":"integer","required":false,"enum":[],"description":""},{"name":"delete_record_id","type":"integer","required":false,"enum":[],"description":""},{"name":"notes","type":"string","required":false,"enum":[],"description":""},{"name":"effective_on","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"expires_on","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"notify_employee","type":"boolean","required":false,"enum":[],"description":""},{"name":"position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_location_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"section_id","type":"integer","required":false,"enum":[],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":""},{"name":"hierarchy_group_id","type":"integer","required":false,"enum":[],"description":""},{"name":"business_unit_id","type":"integer","required":false,"enum":[],"description":""},{"name":"division_id","type":"integer","required":false,"enum":[],"description":""},{"name":"segment_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_type","type":"string","required":false,"enum":[],"description":""},{"name":"manager_id","type":"integer","required":false,"enum":[],"description":""},{"name":"supervisor_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_kind","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_project","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":"To edit"},{"name":"code","type":"string","required":false,"enum":[],"description":""},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"client","type":"string","required":false,"enum":[],"description":""},{"name":"group_name","type":"string","required":false,"enum":[],"description":""},{"name":"group_code","type":"string","required":false,"enum":[],"description":""},{"name":"entity_code","type":"string","required":false,"enum":[],"description":""},{"name":"manager_id","type":"integer","required":false,"enum":[],"description":"Employee id"},{"name":"start_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"end_date","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"budget_hours","type":"number","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["active","closed"],"description":""}],"read_only":false,"destructive":false},{"name":"save_regional_settings","description":"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 \u2192 company \u2192 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 \u2026 friday; calendar gregorian | gregorian_hijri; month_names levant (\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a\u2026 \u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a) | gulf (\u064a\u0646\u0627\u064a\u0631\u2026 \u0646\u0648\u0641\u0645\u0628\u0631); 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"Leave out to change the company defaults."},{"name":"date_format","type":"string|null","required":false,"enum":[],"description":"Platform default: j M Y"},{"name":"time_format","type":"string|null","required":false,"enum":[],"description":"Platform default: 24"},{"name":"week_start","type":"string|null","required":false,"enum":[],"description":"Platform default: sunday"},{"name":"calendar","type":"string|null","required":false,"enum":[],"description":"Platform default: gregorian"},{"name":"month_names","type":"string|null","required":false,"enum":[],"description":"Platform default: levant"},{"name":"numerals","type":"string|null","required":false,"enum":[],"description":"Platform default: latn"},{"name":"thousands_separator","type":"string|null","required":false,"enum":[],"description":"Platform default: comma"},{"name":"decimal_separator","type":"string|null","required":false,"enum":[],"description":"Platform default: dot"},{"name":"currency_display","type":"string|null","required":false,"enum":[],"description":"Platform default: name"},{"name":"currency_position","type":"string|null","required":false,"enum":[],"description":"Platform default: after"},{"name":"country","type":"string","required":false,"enum":[],"description":"Branch only: ISO code, e.g. IQ."},{"name":"timezone","type":"string","required":false,"enum":[],"description":"Branch only: e.g. Asia\/Baghdad."}],"read_only":false,"destructive":false},{"name":"save_role","description":"Add (without role_id) or change a role. permissions are keys from list_roles, module permissions or sub-module ones (leaves.adjustments.manage\u2026); 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"role_id","type":"integer","required":false,"enum":[],"description":"Leave out to add a role."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"description","type":"object","required":false,"enum":[],"description":""},{"name":"permissions","type":"array","required":false,"enum":[],"description":""},{"name":"channels","type":"object","required":false,"enum":[],"description":"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."},{"name":"fields","type":"object","required":false,"enum":[],"description":"Per field from list_roles meta (employee.basic_salary\u2026): {\"web\": \"hidden|view|edit\", \"app\": \"hidden|view|edit\"}. A field with no setting follows the permissions it always followed."},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":""},{"name":"preset","type":"string","required":false,"enum":["hr_manager","branch_manager","line_manager","recruiter","finance"],"description":""}],"read_only":false,"destructive":false},{"name":"save_section_record","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["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"],"description":""},{"name":"record_id","type":"integer","required":false,"enum":[],"description":""},{"name":"parent","type":"integer","required":false,"enum":[],"description":"The parent record, for a section under a record."},{"name":"values","type":"object","required":true,"enum":[],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_setup_form_item","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"entity","type":"string","required":true,"enum":["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"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"delete","type":"boolean","required":false,"enum":[],"description":""},{"name":"level_type","type":"string","required":false,"enum":[],"description":""},{"name":"parent_id","type":"integer","required":false,"enum":[],"description":""},{"name":"rank","type":"integer","required":false,"enum":[],"description":""},{"name":"subsidiary_id","type":"string","required":false,"enum":[],"description":""},{"name":"key_staff","type":"array","required":false,"enum":[],"description":"[{\"employee_id\": 1, \"role\": \"approvals|evaluation|financial\"}]"},{"name":"country","type":"string","required":false,"enum":[],"description":"cities: the ISO country code (JO, IQ\u2026)"},{"name":"active","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_time_settings","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"section","type":"string","required":true,"enum":["attendance","timesheets"],"description":""},{"name":"values","type":"object","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_time_setup_item","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"kind","type":"string","required":true,"enum":["shifts","overtime_types","holidays","geolocations","biometric_devices"],"description":""},{"name":"id","type":"integer","required":false,"enum":[],"description":"To change one"},{"name":"fields","type":"object","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"schedule_employees","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","week","regular","assign_shift","plan","publish","set_locations","replace_location","location_for_everyone","reprocess_punches"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"employees","type":"array","required":false,"enum":[],"description":""},{"name":"shift_id","type":"string","required":false,"enum":[],"description":"A shift id, or off"},{"name":"start_date","type":"string","required":false,"enum":[],"description":""},{"name":"end_date","type":"string","required":false,"enum":[],"description":""},{"name":"conflict","type":"string","required":false,"enum":["replace","keep"],"description":""},{"name":"shift_ids","type":"array","required":false,"enum":[],"description":""},{"name":"max_in_a_row","type":"integer","required":false,"enum":[],"description":""},{"name":"days_off_a_week","type":"integer","required":false,"enum":[],"description":""},{"name":"max_weekly_hours","type":"number","required":false,"enum":[],"description":""},{"name":"fair_nights","type":"boolean","required":false,"enum":[],"description":""},{"name":"notify","type":"boolean","required":false,"enum":[],"description":""},{"name":"week","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"department","type":"integer","required":false,"enum":[],"description":""},{"name":"job_role","type":"integer","required":false,"enum":[],"description":""},{"name":"manager","type":"integer","required":false,"enum":[],"description":""},{"name":"gender","type":"string","required":false,"enum":["male","female"],"description":""},{"name":"schedule","type":"string","required":false,"enum":["with","without"],"description":""},{"name":"from_location","type":"integer","required":false,"enum":[],"description":""},{"name":"to_location","type":"integer","required":false,"enum":[],"description":""},{"name":"location_id","type":"integer","required":false,"enum":[],"description":""},{"name":"locations","type":"array","required":false,"enum":[],"description":""},{"name":"mode","type":"string","required":false,"enum":["assign","unassign","replace"],"description":""}],"read_only":false,"destructive":false},{"name":"search_help_center","description":"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.","arguments":[{"name":"query","type":"string","required":false,"enum":[],"description":"Words to search for, e.g. \"leave balance\"."},{"name":"category","type":"string","required":false,"enum":["getting-started","employees","payroll","leaves","attendance","documents","performance","recruitment","reports","settings","api"],"description":""},{"name":"locale","type":"string","required":false,"enum":["en","ar"],"description":""}],"read_only":true,"destructive":false},{"name":"send_company_test_email","description":"Settings \u2192 Email server \u2192 \"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\u2026). Only send when the person asked for a test.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"to","type":"string","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"send_for_signature","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["send","decline"],"description":""},{"name":"employee_ids","type":"array","required":false,"enum":[],"description":""},{"name":"title","type":"string","required":false,"enum":[],"description":""},{"name":"body","type":"string","required":false,"enum":[],"description":""},{"name":"letter_id","type":"integer","required":false,"enum":[],"description":""},{"name":"signature_id","type":"integer","required":false,"enum":[],"description":""},{"name":"decline_reason","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"send_phone_test_push","description":"One test notification to one phone of a person in your scope (docs\/notifications.md \u00ab\u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a\u00bb): 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"install_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_employee_emails","description":"Settings \u2192 Email server \u2192 \"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"on","type":"boolean","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_legal_validation","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"rule","type":"string","required":true,"enum":["overtime_to_leave","rest_day_overtime","holiday_overtime","loan_settlement_deduction","eos_formula","tax_scale","day_divisor"],"description":""},{"name":"action","type":"string","required":true,"enum":["record","withdraw"],"description":""},{"name":"validated_by","type":"string","required":false,"enum":[],"description":""},{"name":"reference","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_line_manager_access","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"lm_rate_competencies","type":"boolean","required":false,"enum":[],"description":"Rate the competencies of their direct reports"},{"name":"lm_assess_potential","type":"boolean","required":false,"enum":[],"description":"Assess the potential (9-box) of their direct reports"},{"name":"lm_salary_adjustments","type":"boolean","required":false,"enum":[],"description":"File salary adjustment requests for the people who report to them"},{"name":"lm_team_suspensions","type":"boolean","required":false,"enum":[],"description":"See the suspensions of their direct reports"}],"read_only":false,"destructive":false},{"name":"set_main_branch","description":"Make an active branch the company's main one (owners land on it).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_user_status","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":true,"enum":["active","inactive"],"description":""}],"read_only":false,"destructive":false},{"name":"shared_phone_allowances","description":"HR exceptions to one account per phone (docs\/platform-control.md \u00ab\u0627\u0644\u0627\u0633\u062a\u062b\u0646\u0627\u0621\u00bb): let one more account use a phone another account already uses (a shared tablet at reception). action list (app_devices.view; phone_key optional, active_only): the exceptions for the people in scope. action allow (app_devices.allow_shared): user_id, install_id (a phone row from list_shared_phones or list_app_devices) or phone_key, reason (3\u2013500 chars); logged on the phone's timeline and told to the person. action revoke (app_devices.allow_shared): allowance_id. Same as \/api\/v1\/app\/companies\/{id}\/app-devices\/allowances.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","allow","revoke"],"description":""},{"name":"user_id","type":"integer","required":false,"enum":[],"description":""},{"name":"install_id","type":"integer","required":false,"enum":[],"description":""},{"name":"phone_key","type":"string","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"allowance_id","type":"integer","required":false,"enum":[],"description":""},{"name":"active_only","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"shift_setup","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["get","copy_to_roster","sync","get_overtime_limit","set_overtime_limit"],"description":""},{"name":"shift_id","type":"integer","required":false,"enum":[],"description":""},{"name":"ot_limit_scope","type":"string","required":false,"enum":["per_type","total"],"description":""},{"name":"ot_total_limit_hours","type":"number","required":false,"enum":[],"description":""},{"name":"ot_total_limit_period","type":"string","required":false,"enum":["day","week","month"],"description":""}],"read_only":false,"destructive":false},{"name":"show_notification_log","description":"One notice of the notifications log in full (notifications.log.view, docs\/notifications.md \"\u0633\u062c\u0644 \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062a\"), 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"id","type":"integer","required":true,"enum":[],"description":"The notice (send) id from list_notification_log."}],"read_only":true,"destructive":false},{"name":"succession_intelligence","description":"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 \u2192 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 \u2192 why (rule-based, or the AI provider's text when it is set). action successor: successor_id \u2192 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\u2013100, competency_id, notes. action delete_action: action_id. Readiness itself is set with manage_succession add_successor.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["coverage","suggestions","explain","successor","draft_plan","save_action","delete_action"],"description":""},{"name":"key_position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":false,"enum":[],"description":""},{"name":"successor_id","type":"integer","required":false,"enum":[],"description":""},{"name":"action_id","type":"integer","required":false,"enum":[],"description":""},{"name":"exposure","type":"string","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":""},{"name":"apply","type":"boolean","required":false,"enum":[],"description":""},{"name":"fields","type":"object","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"switch_branch","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch","type":"string","required":true,"enum":[],"description":"A branch id, or \"all\"."}],"read_only":false,"destructive":false},{"name":"task_proof","description":"Signed proof photos on tasks (docs\/field-proof.md \u00a723), 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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["own","list","show","void","request_upload","waive","settings"],"description":""},{"name":"task_id","type":"integer","required":false,"enum":[],"description":""},{"name":"evidence_id","type":"integer","required":false,"enum":[],"description":""},{"name":"reason","type":"string","required":false,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"values","type":"object","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"show","type":"string","required":false,"enum":["open","flagged","done","all"],"description":""},{"name":"employee","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"team_schedule","description":"Work shifts HR shares with managers (docs\/attendance.md \u00ab\u0645\u0634\u0627\u0631\u0643\u0629 \u062c\u062f\u0627\u0648\u0644 \u0627\u0644\u062f\u0648\u0627\u0645\u00bb). 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["list","shares","share","assign","clear","plan","copy","publish","update_shift"],"description":""},{"name":"shift_id","type":"string","required":false,"enum":[],"description":"A shift id, or off when assigning a day off"},{"name":"targets","type":"array","required":false,"enum":[],"description":""},{"name":"employees","type":"array","required":false,"enum":[],"description":""},{"name":"start_date","type":"string","required":false,"enum":[],"description":""},{"name":"end_date","type":"string","required":false,"enum":[],"description":""},{"name":"conflict","type":"string","required":false,"enum":["replace","keep"],"description":""},{"name":"draft","type":"boolean","required":false,"enum":[],"description":""},{"name":"shift_ids","type":"array","required":false,"enum":[],"description":"plan: the shared shifts to use"},{"name":"source_from","type":"string","required":false,"enum":[],"description":""},{"name":"source_to","type":"string","required":false,"enum":[],"description":""},{"name":"target_from","type":"string","required":false,"enum":[],"description":""},{"name":"target_to","type":"string","required":false,"enum":[],"description":""},{"name":"max_in_a_row","type":"integer","required":false,"enum":[],"description":""},{"name":"days_off_a_week","type":"integer","required":false,"enum":[],"description":""},{"name":"max_weekly_hours","type":"number","required":false,"enum":[],"description":""},{"name":"fair_nights","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"terminate_employee","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"terminated_on","type":"string","required":true,"enum":[],"description":"Last working day, YYYY-MM-DD."},{"name":"termination_type","type":"string","required":true,"enum":["resignation","dismissal","end_of_contract","other","retirement","transfer"],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""},{"name":"termination_reason_id","type":"integer","required":false,"enum":[],"description":"A specific reason (setup list termination-reasons); it decides the termination type."},{"name":"custom_fields","type":"object","required":false,"enum":[],"description":"Custom fields shown at end of service: {\"field id\": \"value\"} (a list field takes its option index)."}],"read_only":false,"destructive":true},{"name":"transfer_employee","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"employee_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":true,"enum":[],"description":""},{"name":"effective_date","type":"string","required":true,"enum":[],"description":"YYYY-MM-DD"},{"name":"position_id","type":"integer","required":false,"enum":[],"description":""},{"name":"work_location_id","type":"integer","required":false,"enum":[],"description":""},{"name":"department_id","type":"integer","required":false,"enum":[],"description":""},{"name":"section_id","type":"integer","required":false,"enum":[],"description":""},{"name":"project_id","type":"integer","required":false,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_app_colors","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"One branch's own colors; none: the company's. The main branch uses the company's."},{"name":"primary","type":"string","required":false,"enum":[],"description":"#RRGGBB for buttons, active tabs and links. Empty: follow the level above."},{"name":"secondary","type":"string","required":false,"enum":[],"description":"#RRGGBB for the header and titles. Empty: follow the level above."},{"name":"reset","type":"boolean","required":false,"enum":[],"description":"Clear both colors at this level."}],"read_only":false,"destructive":false},{"name":"update_company_appearance","description":"System preferences \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"allow_user_override","type":"boolean","required":false,"enum":[],"description":""},{"name":"mode","type":"string","required":false,"enum":["","light","dark","system"],"description":"Empty: follow the level above."},{"name":"layout","type":"string","required":false,"enum":["","default","mini","detached","modern","transparent","horizontal","horizontal-single","horizontal-overlay","horizontal-box","horizontal-fullwidth","horizontal-sidemenu","twocolumn","stacked"],"description":"Empty: follow the level above."},{"name":"color","type":"string","required":false,"enum":["","primary","brightblue","lunargreen","lavendar","magenta","chromeyellow","lavared"],"description":"Empty: follow the level above."},{"name":"sidebar","type":"string","required":false,"enum":["","light","brand","darkgreen","darkgray","royalblue","indigo"],"description":"Empty: follow the level above."},{"name":"topbar","type":"string","required":false,"enum":["","white","darkaqua","whiterock","rockblue","bluehaze","orangegradient","purplegradient","bluegradient","maroongradient"],"description":"Empty: follow the level above."},{"name":"topbarcolor","type":"string","required":false,"enum":["","white","primary","blackpearl","maroon","bluegem","firefly"],"description":"Empty: follow the level above."},{"name":"card","type":"string","required":false,"enum":["","bordered","borderless","shadow"],"description":"Empty: follow the level above."},{"name":"size","type":"string","required":false,"enum":["","default","compact"],"description":"Empty: follow the level above."},{"name":"width","type":"string","required":false,"enum":["","fluid","box"],"description":"Empty: follow the level above."},{"name":"loader","type":"string","required":false,"enum":["","enable","disable"],"description":"Empty: follow the level above."}],"read_only":false,"destructive":false},{"name":"update_log_retention","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"retention","type":"string","required":true,"enum":["6","12","24","forever"],"description":""}],"read_only":false,"destructive":false},{"name":"update_my_appearance","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"mode","type":"string","required":false,"enum":["","light","dark","system"],"description":"Empty: follow the level above."},{"name":"layout","type":"string","required":false,"enum":["","default","mini","detached","modern","transparent","horizontal","horizontal-single","horizontal-overlay","horizontal-box","horizontal-fullwidth","horizontal-sidemenu","twocolumn","stacked"],"description":"Empty: follow the level above."},{"name":"color","type":"string","required":false,"enum":["","primary","brightblue","lunargreen","lavendar","magenta","chromeyellow","lavared"],"description":"Empty: follow the level above."},{"name":"sidebar","type":"string","required":false,"enum":["","light","brand","darkgreen","darkgray","royalblue","indigo"],"description":"Empty: follow the level above."},{"name":"topbar","type":"string","required":false,"enum":["","white","darkaqua","whiterock","rockblue","bluehaze","orangegradient","purplegradient","bluegradient","maroongradient"],"description":"Empty: follow the level above."},{"name":"topbarcolor","type":"string","required":false,"enum":["","white","primary","blackpearl","maroon","bluegem","firefly"],"description":"Empty: follow the level above."},{"name":"card","type":"string","required":false,"enum":["","bordered","borderless","shadow"],"description":"Empty: follow the level above."},{"name":"size","type":"string","required":false,"enum":["","default","compact"],"description":"Empty: follow the level above."},{"name":"width","type":"string","required":false,"enum":["","fluid","box"],"description":"Empty: follow the level above."},{"name":"loader","type":"string","required":false,"enum":["","enable","disable"],"description":"Empty: follow the level above."}],"read_only":false,"destructive":false},{"name":"update_my_preferences","description":"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.","arguments":[{"name":"locale","type":"string","required":false,"enum":["en","ar"],"description":"Interface language."},{"name":"theme","type":"string","required":false,"enum":["light","dark","system"],"description":"system follows the device setting."}],"read_only":false,"destructive":false},{"name":"update_sign_in_settings","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"two_factor_required","type":"boolean","required":false,"enum":[],"description":""},{"name":"sso_enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"sso_name","type":"string","required":false,"enum":[],"description":""},{"name":"sso_issuer","type":"string","required":false,"enum":[],"description":""},{"name":"sso_client_id","type":"string","required":false,"enum":[],"description":""},{"name":"sso_protocol","type":"string","required":false,"enum":["oidc","saml"],"description":""},{"name":"sso_only","type":"boolean","required":false,"enum":[],"description":"No password sign-in for this company, except the exempt users. Needs single sign-on on."},{"name":"sso_exempt_user_ids","type":"array","required":false,"enum":[],"description":"The whole list of user ids still allowed a password (replaces it)."},{"name":"saml_idp_entity_id","type":"string","required":false,"enum":[],"description":""},{"name":"saml_idp_sso_url","type":"string","required":false,"enum":[],"description":"The provider's HTTP-Redirect sign-in URL (https)."},{"name":"saml_email_attribute","type":"string","required":false,"enum":[],"description":"The attribute holding the email; empty = the usual ones, then the NameID."},{"name":"pw_min_length","type":"integer","required":false,"enum":[],"description":"6-64."},{"name":"pw_upper","type":"boolean","required":false,"enum":[],"description":""},{"name":"pw_lower","type":"boolean","required":false,"enum":[],"description":""},{"name":"pw_numbers","type":"boolean","required":false,"enum":[],"description":""},{"name":"pw_special","type":"boolean","required":false,"enum":[],"description":""},{"name":"pw_max_age_days","type":"integer","required":false,"enum":[],"description":"0 = never expire, up to 365."},{"name":"pw_reuse","type":"integer","required":false,"enum":[],"description":"The last N passwords can't be reused, 0-24."},{"name":"pw_max_attempts","type":"integer","required":false,"enum":[],"description":"Failed sign-ins before the account locks, 3-20; 0 = Mihnaro's."},{"name":"pw_lock_minutes","type":"integer","required":false,"enum":[],"description":"Lock length in minutes, up to 1440; 0 = Mihnaro's."}],"read_only":false,"destructive":false},{"name":"whoami","description":"The signed-in company user and the companies they belong to, with whether each can be accessed now.","arguments":[],"read_only":true,"destructive":false}]},"platform":{"url":"https:\/\/api.mihnaro.com\/mcp\/platform","path":"\/mcp\/platform","tools":[{"name":"add_backup_folder_destination","description":"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.","arguments":[{"name":"name","type":"string","required":true,"enum":[],"description":""},{"name":"path","type":"string","required":true,"enum":[],"description":"A full path, for example \/var\/backups\/mihnaro."},{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"keep_daily","type":"integer","required":false,"enum":[],"description":""},{"name":"keep_weekly","type":"integer","required":false,"enum":[],"description":""},{"name":"keep_monthly","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"add_license","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"modules","type":"array","required":true,"enum":[],"description":""},{"name":"max_employees","type":"integer","required":true,"enum":[],"description":"Maximum active employees across all branches."},{"name":"max_branches","type":"integer","required":true,"enum":[],"description":""},{"name":"starts_on","type":"string","required":true,"enum":[],"description":"YYYY-MM-DD"},{"name":"ends_on","type":"string","required":true,"enum":[],"description":"YYYY-MM-DD"},{"name":"notes","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"archive_lead","description":"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.","arguments":[{"name":"lead_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["archive","restore"],"description":""}],"read_only":false,"destructive":false},{"name":"buddy_punching_defaults","description":"The platform default of each buddy-punching layer, which every company has until it sets its own (platform.app_control, docs\/attendance-security.md \u00a719). 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}.","arguments":[{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"layer","type":"string","required":false,"enum":["bp_face","bp_device_key","bp_presence","bp_pattern"],"description":""},{"name":"mode","type":"string","required":false,"enum":["off","flag","refuse"],"description":""}],"read_only":false,"destructive":false},{"name":"calculate_hr","description":"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\u201312, 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}.","arguments":[{"name":"tool","type":"string","required":true,"enum":["end-of-service","net-salary","gross-salary","overtime","leave","cost-to-company"],"description":""},{"name":"inputs","type":"object","required":true,"enum":[],"description":"The tool's inputs, e.g. {\"basic\": 1500000, \"allowances\": 300000}."},{"name":"country","type":"string","required":false,"enum":[],"description":"ISO country code, e.g. \"SA\". Default IQ."},{"name":"variant","type":"string","required":false,"enum":[],"description":"The country's rule variant when it has more than one (e.g. \"saudi\", \"non-saudi\"); default its first."},{"name":"date","type":"string","required":false,"enum":[],"description":"Use the rules in force on this day (Y-m-d); default today."}],"read_only":true,"destructive":false},{"name":"cancel_broadcast","description":"Cancel a platform broadcast that hasn't started yet: a scheduled one, or one still waiting for the queue (docs\/platform-control.md).","arguments":[{"name":"broadcast_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"check_company_field_availability","description":"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\u2026 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.","arguments":[{"name":"field","type":"string","required":true,"enum":["name_en","name_ar","slug","owner_email","personal_email","phone","tax_number","company_email"],"description":""},{"name":"value","type":"string","required":true,"enum":[],"description":""},{"name":"company_id","type":"integer","required":false,"enum":[],"description":"The company being edited."},{"name":"user_id","type":"integer","required":false,"enum":[],"description":"The account being edited."}],"read_only":true,"destructive":false},{"name":"choose_login_design","description":"Set which sign-in design each area uses; only the areas given change. Live immediately. Same as PATCH \/api\/v1\/platform\/login-designs\/areas.","arguments":[{"name":"app","type":"string","required":false,"enum":["classic","illustration","minimal","command","card"],"description":"app.mihnaro.com sign-in pages"},{"name":"admin","type":"string","required":false,"enum":["classic","illustration","minimal","command","card"],"description":"admin.mihnaro.com sign-in"},{"name":"demo","type":"string","required":false,"enum":["classic","illustration","minimal","command","card"],"description":"demo.mihnaro.com entry page"}],"read_only":false,"destructive":false},{"name":"company_deletion_preview","description":"What deleting a company would lose: its payroll runs, attendance records, employees and accounts; real: true means delete_company needs force. Needs platform.companies.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"create_calculator_rule_set","description":"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.","arguments":[{"name":"country_code","type":"string","required":true,"enum":[],"description":""},{"name":"effective_from","type":"string","required":true,"enum":[],"description":"Y-m-d"},{"name":"variant","type":"string","required":false,"enum":[],"description":""},{"name":"variant_label","type":"object","required":false,"enum":[],"description":""},{"name":"copy_from","type":"integer","required":false,"enum":[],"description":""},{"name":"rules","type":"object","required":false,"enum":[],"description":""},{"name":"sources","type":"object","required":false,"enum":[],"description":""},{"name":"notes","type":"object","required":false,"enum":[],"description":""},{"name":"requires_confirmation","type":"array","required":false,"enum":[],"description":"What is not confirmed yet: [{rules: [rule keys or group names], reason {en, ar}, needed {en, ar}}]; [] or null for none"}],"read_only":false,"destructive":false},{"name":"create_company","description":"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.","arguments":[{"name":"name","type":"object","required":true,"enum":[],"description":""},{"name":"slug","type":"string","required":true,"enum":[],"description":"Unique URL-safe id, e.g. \"alfaris-trading\"."},{"name":"country","type":"string","required":true,"enum":["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","ZW"],"description":"ISO country code of the company."},{"name":"timezone","type":"string","required":false,"enum":[],"description":"IANA timezone. Defaults to the country's."},{"name":"notes","type":"string","required":false,"enum":[],"description":"Internal notes."},{"name":"license","type":"object","required":true,"enum":[],"description":""},{"name":"main_branch","type":"object","required":true,"enum":[],"description":""},{"name":"owner","type":"object","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"create_platform_admin","description":"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.","arguments":[{"name":"name","type":"string","required":true,"enum":[],"description":""},{"name":"email","type":"string","required":true,"enum":[],"description":""},{"name":"permissions","type":"array","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"delete_backup_destination","description":"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.","arguments":[{"name":"destination_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"delete_company","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"confirm_name","type":"string","required":true,"enum":[],"description":"The company's English or Arabic name, or its slug, typed exactly."},{"name":"confirm","type":"boolean","required":true,"enum":[],"description":"The second confirmation: true."},{"name":"force","type":"boolean","required":false,"enum":[],"description":"Delete although it has payroll runs or attendance."},{"name":"reason","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_license","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"license_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_office","description":"Delete an office from the contact page. To hide it for now, use save_office with is_visible false instead.","arguments":[{"name":"office_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_plan","description":"Delete a pricing plan. To take it off the site for now, use save_plan with is_active false instead.","arguments":[{"name":"plan_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_section","description":"Delete a page section. To hide it for now, use save_section with is_visible false.","arguments":[{"name":"section_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"delete_system_announcement","description":"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.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"device_data_defaults","description":"The platform defaults every company has until it sets its own in Mobile app rules (platform.app_control, docs\/platform-control.md \u00ab\u0627\u0644\u0645\u0648\u0642\u0639 \u0634\u0631\u0637 \u0644\u0641\u062a\u062d \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u00bb and \u00ab\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0647\u0627\u062a\u0641\u00bb). 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\u2013730}}, 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.","arguments":[{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"location_required","type":"object","required":false,"enum":[],"description":"{enabled, precise, reason_en, reason_ar}"},{"name":"categories","type":"object","required":false,"enum":[],"description":"{category: {enabled, retention_days}}"}],"read_only":false,"destructive":false},{"name":"end_support_session","description":"End a support session now; the admin is taken out of the company on their next click.","arguments":[{"name":"support_session_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"event_location_default","description":"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 \u00ab\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): 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.","arguments":[{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"mode","type":"string","required":false,"enum":["auto","on","off"],"description":""}],"read_only":false,"destructive":false},{"name":"export_platform_notification_log","description":"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.","arguments":[{"name":"tab","type":"string","required":false,"enum":["notices","broadcasts","emails"],"description":""},{"name":"format","type":"string","required":false,"enum":["csv","xlsx"],"description":""},{"name":"send","type":"integer","required":false,"enum":[],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"company","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":[],"description":""},{"name":"channel","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_ai_settings","description":"The platform AI provider, model and on\/off switch (docs\/ai.md), and whether a key is saved. The key itself is never returned.","arguments":[],"read_only":true,"destructive":false},{"name":"get_app_debug_report","description":"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.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":"The report id."}],"read_only":true,"destructive":false},{"name":"get_app_person_activity","description":"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 \u00ab\u062e\u0631\u064a\u0637\u0629 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): [{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 \u00ab\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): 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.","arguments":[{"name":"user_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_app_person_context","description":"A person's phone details from the Mihnaro app across companies (platform.app_control, docs\/platform-control.md \u00ab\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0647\u0627\u062a\u0641\u00bb): 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.","arguments":[{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"install_id","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":["device","network","battery","permissions","security","time","locale","health"],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_app_releases","description":"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.","arguments":[{"name":"platform","type":"string","required":false,"enum":["android","ios"],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""},{"name":"company_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_app_update_impact","description":"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.","arguments":[{"name":"platform","type":"string","required":true,"enum":["android","ios"],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_backup_connect_link","description":"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.","arguments":[{"name":"destination_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"get_backup_run","description":"One backup in full (docs\/backups.md): its parts and checksums, each copy, the row count of every table, and its restore tests.","arguments":[{"name":"run_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_backup_status","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_broadcast_preview","description":"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.","arguments":[{"name":"company_ids","type":"array","required":false,"enum":[],"description":""},{"name":"roles","type":"array","required":false,"enum":[],"description":""},{"name":"user_ids","type":"array","required":false,"enum":[],"description":""},{"name":"branch_ids","type":"array","required":false,"enum":[],"description":""},{"name":"install_ids","type":"array","required":false,"enum":[],"description":""},{"name":"platform","type":"string","required":false,"enum":["android","ios"],"description":""},{"name":"version_state","type":"string","required":false,"enum":["below_min","outdated","latest","newer","store_unknown","unknown"],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_calculator_country","description":"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}.","arguments":[{"name":"country","type":"string","required":true,"enum":[],"description":"ISO code (\"JO\") or the site's address part (\"jordan\")."}],"read_only":true,"destructive":false},{"name":"get_calculator_rates","description":"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.","arguments":[{"name":"country","type":"string","required":false,"enum":[],"description":"ISO code; default IQ."},{"name":"variant","type":"string","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_calculator_rule_set","description":"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}.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_company","description":"Get one company with its current license, full license history, branches and owners.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":"The company id."}],"read_only":true,"destructive":false},{"name":"get_contact_settings","description":"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).","arguments":[],"read_only":true,"destructive":false},{"name":"get_domains","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_flash_messages","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_lead","description":"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).","arguments":[{"name":"lead_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_login_designs","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_mail_health","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_messaging_status","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_platform_appearance","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_platform_limits","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_security_policy","description":"Read the security policy: lockout, password rules and expiry, reset links, sessions and \"Remember me\".","arguments":[],"read_only":true,"destructive":false},{"name":"get_seo","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_server_history","description":"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.","arguments":[{"name":"range","type":"string","required":false,"enum":["24h","7d","30d"],"description":"Default 24h."}],"read_only":true,"destructive":false},{"name":"get_server_overview","description":"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.","arguments":[{"name":"section","type":"string","required":false,"enum":["system","services","processes","database","app","sites","mail","push","alert_values"],"description":"Only this part of the overview."}],"read_only":true,"destructive":false},{"name":"get_server_switch","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"get_sign_in_options","description":"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).","arguments":[],"read_only":true,"destructive":false},{"name":"get_site_settings","description":"Read mihnaro.com settings: site name, tagline, footer, colors, fonts, currency, emails, page titles, menu and header button. Texts are {\"en\",\"ar\"}.","arguments":[],"read_only":true,"destructive":false},{"name":"get_zenhr_connection","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"get_zenhr_health","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"get_zenhr_payroll_compare","description":"The last payroll comparison: ZenHR's figures against Mihnaro's engine, totals only.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"get_zenhr_run","description":"One run: counts per type, progress while running, and the records it touched (table, reference, column names; never values).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"run_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["inserted","updated","flagged"],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"get_zenhr_sync","description":"The ZenHR \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"get_zenhr_totals","description":"ZenHR and Mihnaro totals per branch and list: records read through the API against the rows they became. Counts only.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_ai_models","description":"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.","arguments":[{"name":"fresh","type":"boolean","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_app_activity","description":"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 \u00ab\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u062d\u062f\u0627\u062b\u00bb): 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).","arguments":[{"name":"user_id","type":"integer","required":false,"enum":[],"description":""},{"name":"install_id","type":"integer","required":false,"enum":[],"description":""},{"name":"device_id","type":"string","required":false,"enum":[],"description":""},{"name":"event","type":"string","required":false,"enum":["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_off"],"description":""},{"name":"result","type":"string","required":false,"enum":["ok","failed","blocked"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_app_debug_reports","description":"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.","arguments":[{"name":"user_id","type":"integer","required":false,"enum":[],"description":"Only this account's reports."},{"name":"install_id","type":"string","required":false,"enum":[],"description":"Only this phone's reports."},{"name":"build","type":"string","required":false,"enum":[],"description":"Only this build number."}],"read_only":true,"destructive":false},{"name":"list_app_phones","description":"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).","arguments":[{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"company_id","type":"integer","required":false,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"platform","type":"string","required":false,"enum":["android","ios"],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""},{"name":"state","type":"string","required":false,"enum":["below_min","outdated","latest","newer","store_unknown","unknown"],"description":""},{"name":"push","type":"string","required":false,"enum":["active","failing","none"],"description":""},{"name":"signed_in","type":"boolean","required":false,"enum":[],"description":""},{"name":"shared","type":"boolean","required":false,"enum":[],"description":""},{"name":"seen_days","type":"integer","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_backup_restore_tests","description":"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.","arguments":[{"name":"limit","type":"integer","required":false,"enum":[],"description":"How many, 1 to 100. Default 25."}],"read_only":true,"destructive":false},{"name":"list_backup_runs","description":"The backup history, newest first (docs\/backups.md): status, size, duration, checksums, copies at each destination, and any error.","arguments":[{"name":"limit","type":"integer","required":false,"enum":[],"description":"How many, 1 to 100. Default 25."}],"read_only":true,"destructive":false},{"name":"list_branches","description":"List a company's branches with country, currency, timezone, main\/active flags and logo URLs, plus how many more the license allows.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_broadcasts","description":"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).","arguments":[{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"result","type":"string","required":false,"enum":["accepted","failed","no_device","not_configured","disabled","sent_to_expo"],"description":""}],"read_only":true,"destructive":false},{"name":"list_calculator_countries","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"list_calculator_rule_sets","description":"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.","arguments":[{"name":"country","type":"string","required":false,"enum":[],"description":"ISO code."},{"name":"status","type":"string","required":false,"enum":["draft","published"],"description":""}],"read_only":true,"destructive":false},{"name":"list_companies","description":"List customer companies with their current license status, modules, limits and owners. Search by name or slug, filter by status.","arguments":[{"name":"search","type":"string","required":false,"enum":[],"description":"Part of the company name (English or Arabic) or slug."},{"name":"status","type":"string","required":false,"enum":["active","suspended"],"description":"Only companies with this status."},{"name":"page","type":"integer","required":false,"enum":[],"description":"Page number, 25 companies per page. Default 1."}],"read_only":true,"destructive":false},{"name":"list_company_users","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":"Part of a name or email."},{"name":"role","type":"string","required":false,"enum":["admin","user"],"description":""},{"name":"status","type":"string","required":false,"enum":["active","temporary","disabled"],"description":""},{"name":"sort","type":"string","required":false,"enum":["name","email","role","status","joined"],"description":""},{"name":"dir","type":"string","required":false,"enum":["asc","desc"],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[10,25,50,100],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_deleted_companies","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"list_hr_calculators","description":"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=.","arguments":[{"name":"country","type":"string","required":false,"enum":[],"description":"ISO country code, e.g. \"AE\". Default IQ."},{"name":"variant","type":"string","required":false,"enum":[],"description":""},{"name":"date","type":"string","required":false,"enum":[],"description":"Y-m-d; default today."}],"read_only":true,"destructive":false},{"name":"list_leads","description":"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.","arguments":[{"name":"status","type":"string","required":false,"enum":["new","contacted","closed"],"description":""},{"name":"interest","type":"string","required":false,"enum":[],"description":""},{"name":"assigned_to","type":"integer","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"archived","type":"boolean","required":false,"enum":[],"description":"true: only archived messages."},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_mail_deliveries","description":"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.","arguments":[{"name":"status","type":"string","required":false,"enum":["sent","logged","queued","failed"],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":"Part of the recipient address or the subject."},{"name":"limit","type":"integer","required":false,"enum":[],"description":"1-100, default 30."}],"read_only":true,"destructive":false},{"name":"list_monitor_alert_events","description":"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).","arguments":[{"name":"kind","type":"string","required":false,"enum":["fired","repeat","recovered"],"description":""},{"name":"metric","type":"string","required":false,"enum":["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_hours"],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":"1-100, default 30."}],"read_only":true,"destructive":false},{"name":"list_monitor_alert_rules","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"list_offices","description":"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.","arguments":[],"read_only":true,"destructive":false},{"name":"list_plans","description":"List the pricing plans on mihnaro.com in order, including hidden ones.","arguments":[],"read_only":true,"destructive":false},{"name":"list_platform_admins","description":"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.","arguments":[{"name":"search","type":"string","required":false,"enum":[],"description":""},{"name":"permission","type":"string","required":false,"enum":["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"],"description":""}],"read_only":true,"destructive":false},{"name":"list_platform_notification_log","description":"The platform notifications log (platform.notifications, docs\/notifications.md \"\u0633\u062c\u0644 \u0625\u0634\u0639\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0646\u0635\u0629\"), 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.","arguments":[{"name":"tab","type":"string","required":false,"enum":["notices","broadcasts","emails"],"description":""},{"name":"from","type":"string","required":false,"enum":[],"description":""},{"name":"to","type":"string","required":false,"enum":[],"description":""},{"name":"company","type":"integer","required":false,"enum":[],"description":""},{"name":"category","type":"string","required":false,"enum":[],"description":""},{"name":"channel","type":"string","required":false,"enum":["bell","push","email","whatsapp"],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"kind","type":"string","required":false,"enum":[],"description":""},{"name":"q","type":"string","required":false,"enum":[],"description":""},{"name":"page","type":"integer","required":false,"enum":[],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":"1-100, default 30."}],"read_only":true,"destructive":false},{"name":"list_sections","description":"List the sections of a mihnaro.com page in order, with their content. Also returns the section types and their fields.","arguments":[{"name":"page","type":"string","required":true,"enum":["home","pricing","contact","tools","end-of-service","net-salary","gross-salary","overtime","leave","cost-to-company","salary-guide","privacy","terms","account-deletion"],"description":""}],"read_only":true,"destructive":false},{"name":"list_support_sessions","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"list_system_announcements","description":"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.","arguments":[{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"state","type":"string","required":false,"enum":["live","scheduled","ended","off"],"description":""}],"read_only":true,"destructive":false},{"name":"list_zenhr_audit","description":"The sync's audit log: who changed what, when and from where. Secrets are never recorded.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_zenhr_data_types","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_zenhr_runs","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":[],"description":""},{"name":"trigger","type":"string","required":false,"enum":[],"description":""},{"name":"per_page","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"list_zenhr_sync_conflicts","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["open","applied","kept","all"],"description":""},{"name":"limit","type":"integer","required":false,"enum":[],"description":""},{"name":"offset","type":"integer","required":false,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"move_section","description":"Move a page section one place up or down. Returns the sections of the page in their new order.","arguments":[{"name":"section_id","type":"integer","required":true,"enum":[],"description":""},{"name":"direction","type":"string","required":true,"enum":["up","down"],"description":""}],"read_only":false,"destructive":false},{"name":"phone_sharing_default","description":"One account per phone, the platform default (platform.app_control, docs\/platform-control.md \u00ab\u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u00bb): 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\u201310. Demo and store-reviewer accounts are never stopped. Shared phones themselves: list_app_phones with shared=true.","arguments":[{"name":"action","type":"string","required":true,"enum":["get","set"],"description":""},{"name":"mode","type":"string","required":false,"enum":["allow","warn","block"],"description":""},{"name":"max_accounts","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"publish_calculator_rule_set","description":"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.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":false,"enum":["publish","unpublish"],"description":""}],"read_only":false,"destructive":false},{"name":"remove_platform_admin","description":"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.","arguments":[{"name":"admin_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"reset_company_user_password","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":"A user of that company (see get_company owners)."}],"read_only":false,"destructive":true},{"name":"reset_demo","description":"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.","arguments":[],"read_only":false,"destructive":true},{"name":"reset_user_two_factor","description":"Turn off a company user's two-step verification (lost phone), so they set it up again. Their recovery codes stop working.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":true},{"name":"resolve_zenhr_sync_conflict","description":"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).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"conflict_id","type":"integer","required":true,"enum":[],"description":""},{"name":"action","type":"string","required":true,"enum":["apply","keep"],"description":""}],"read_only":false,"destructive":true},{"name":"restore_calculator_rule_set","description":"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}.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"revision_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"restore_company","description":"Restore a deleted company within its restore window: it shows again and its people can sign in. Needs platform.companies.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"resume_zenhr_run","description":"Starts a new run with what a stopped or failed run was given. What it finished is not done twice.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"run_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"retry_mail_delivery","description":"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.","arguments":[{"name":"delivery_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"run_backup","description":"Start a backup now (docs\/backups.md). It starts within a minute and never overlaps another; read get_backup_run for its result.","arguments":[],"read_only":false,"destructive":false},{"name":"run_backup_restore_test","description":"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.","arguments":[{"name":"run_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"run_zenhr_payroll_compare","description":"Queues a payroll comparison of the last months: recalculated and rolled back, so it changes nothing. Takes the sync's lock.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"months","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"run_zenhr_sync","description":"Queue a ZenHR \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"source","type":"string","required":false,"enum":["api","extraction"],"description":""},{"name":"dry_run","type":"boolean","required":false,"enum":[],"description":""},{"name":"data_types","type":"array","required":false,"enum":[],"description":""},{"name":"branch_ids","type":"array","required":false,"enum":[],"description":""},{"name":"since","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"}],"read_only":false,"destructive":false},{"name":"save_company_branch","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":"Leave out to add a new branch."},{"name":"name","type":"object","required":false,"enum":[],"description":"Required for a new branch."},{"name":"legal_name","type":"object","required":false,"enum":[],"description":""},{"name":"code","type":"string","required":false,"enum":[],"description":""},{"name":"country","type":"string","required":false,"enum":[],"description":"ISO code, e.g. IQ. Sets the currency and timezone unless they are given."},{"name":"currency","type":"string","required":false,"enum":[],"description":"ISO code, e.g. IQD"},{"name":"timezone","type":"string","required":false,"enum":[],"description":"e.g. Asia\/Baghdad"},{"name":"city","type":"string","required":false,"enum":[],"description":""},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":"The main branch stays on."},{"name":"is_main","type":"boolean","required":false,"enum":[],"description":"true makes it the main branch."},{"name":"establishment_number","type":"string","required":false,"enum":[],"description":""},{"name":"establishment_name","type":"string","required":false,"enum":[],"description":""},{"name":"governance_location","type":"string","required":false,"enum":[],"description":""},{"name":"ss_number","type":"string","required":false,"enum":[],"description":""},{"name":"ss_governance_location","type":"string","required":false,"enum":[],"description":""},{"name":"tax_number","type":"string","required":false,"enum":[],"description":""},{"name":"address","type":"string","required":false,"enum":[],"description":""},{"name":"po_box","type":"string","required":false,"enum":[],"description":""},{"name":"zip_code","type":"string","required":false,"enum":[],"description":""},{"name":"mol_number","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_office","description":"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.","arguments":[{"name":"office_id","type":"integer","required":false,"enum":[],"description":"Omit to add a new office."},{"name":"name","type":"object","required":false,"enum":[],"description":""},{"name":"address","type":"object","required":false,"enum":[],"description":""},{"name":"city","type":"object","required":false,"enum":[],"description":""},{"name":"country","type":"object","required":false,"enum":[],"description":""},{"name":"country_code","type":"string","required":false,"enum":[],"description":""},{"name":"postal_code","type":"string","required":false,"enum":[],"description":""},{"name":"phones","type":"array","required":false,"enum":[],"description":""},{"name":"whatsapp","type":"string","required":false,"enum":[],"description":""},{"name":"email","type":"string","required":false,"enum":[],"description":""},{"name":"hours","type":"array","required":false,"enum":[],"description":""},{"name":"hours_note","type":"object","required":false,"enum":[],"description":""},{"name":"timezone","type":"string","required":false,"enum":[],"description":""},{"name":"latitude","type":"number","required":false,"enum":[],"description":""},{"name":"longitude","type":"number","required":false,"enum":[],"description":""},{"name":"map_zoom","type":"integer","required":false,"enum":[],"description":""},{"name":"is_primary","type":"boolean","required":false,"enum":[],"description":""},{"name":"is_visible","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_plan","description":"Create a plan (no plan_id) or update one (with plan_id; only fields given change). A null price shows as \"Coming soon\".","arguments":[{"name":"plan_id","type":"integer","required":false,"enum":[],"description":"Omit to create a plan."},{"name":"slug","type":"string","required":false,"enum":[],"description":"Required when creating, e.g. \"hrm\"."},{"name":"name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}; en required when creating."},{"name":"summary","type":"object","required":false,"enum":[],"description":""},{"name":"unit","type":"object","required":false,"enum":[],"description":"e.g. {\"en\": \"per employee \/ month\"}"},{"name":"price_monthly","type":"number","required":false,"enum":[],"description":""},{"name":"price_yearly","type":"number","required":false,"enum":[],"description":"Monthly price when billed yearly."},{"name":"features","type":"object","required":false,"enum":[],"description":"{\"en\": [\"...\", \"...\"], \"ar\": [...]}"},{"name":"is_featured","type":"boolean","required":false,"enum":[],"description":""},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":"false hides it from the site."}],"read_only":false,"destructive":false},{"name":"save_section","description":"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\".","arguments":[{"name":"section_id","type":"integer","required":false,"enum":[],"description":"Omit to add a new section."},{"name":"page","type":"string","required":false,"enum":["home","pricing","contact","tools","end-of-service","net-salary","gross-salary","overtime","leave","cost-to-company","salary-guide","privacy","terms","account-deletion"],"description":"Required when adding."},{"name":"type","type":"string","required":false,"enum":["hero","modules","features","plans_preview","plans","faq","cta","page_header","contact","contact_form","offices","social","calculator","tools_grid","salary_guide","text"],"description":"Required when adding."},{"name":"content","type":"object","required":true,"enum":[],"description":"The fields of the section."},{"name":"is_visible","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"save_system_announcement","description":"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.","arguments":[{"name":"id","type":"integer","required":false,"enum":[],"description":""},{"name":"title_en","type":"string","required":false,"enum":[],"description":""},{"name":"title_ar","type":"string","required":false,"enum":[],"description":""},{"name":"body_en","type":"string","required":false,"enum":[],"description":""},{"name":"body_ar","type":"string","required":false,"enum":[],"description":""},{"name":"severity","type":"string","required":false,"enum":["info","warning","critical"],"description":""},{"name":"starts_at","type":"string","required":false,"enum":[],"description":""},{"name":"ends_at","type":"string","required":false,"enum":[],"description":""},{"name":"company_ids","type":"array","required":false,"enum":[],"description":""},{"name":"roles","type":"array","required":false,"enum":[],"description":""},{"name":"channel","type":"string","required":false,"enum":["web","app","both"],"description":""},{"name":"display","type":"string","required":false,"enum":["dismissible","acknowledge"],"description":""},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":""},{"name":"existing_only","type":"boolean","required":false,"enum":[],"description":"Only accounts made before it starts: for news about a change, so a new employee doesn't see it."}],"read_only":false,"destructive":false},{"name":"send_app_update_reminder","description":"\"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.","arguments":[{"name":"platform","type":"string","required":true,"enum":["android","ios"],"description":""},{"name":"version_state","type":"string","required":false,"enum":["outdated","below_min"],"description":""}],"read_only":false,"destructive":false},{"name":"send_broadcast","description":"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).","arguments":[{"name":"title_en","type":"string","required":true,"enum":[],"description":""},{"name":"title_ar","type":"string","required":true,"enum":[],"description":""},{"name":"body_en","type":"string","required":true,"enum":[],"description":""},{"name":"body_ar","type":"string","required":true,"enum":[],"description":""},{"name":"url","type":"string","required":false,"enum":[],"description":""},{"name":"push","type":"boolean","required":false,"enum":[],"description":""},{"name":"email","type":"boolean","required":false,"enum":[],"description":""},{"name":"scheduled_at","type":"string","required":false,"enum":[],"description":""},{"name":"test","type":"boolean","required":false,"enum":[],"description":""},{"name":"company_ids","type":"array","required":false,"enum":[],"description":""},{"name":"roles","type":"array","required":false,"enum":[],"description":""},{"name":"user_ids","type":"array","required":false,"enum":[],"description":""},{"name":"branch_ids","type":"array","required":false,"enum":[],"description":""},{"name":"install_ids","type":"array","required":false,"enum":[],"description":""},{"name":"platform","type":"string","required":false,"enum":["android","ios"],"description":""},{"name":"version_state","type":"string","required":false,"enum":["below_min","outdated","latest","newer","store_unknown","unknown"],"description":""},{"name":"version","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"send_phone_test_push","description":"One test notification to one phone (docs\/notifications.md \u00ab\u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a\u00bb): 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.","arguments":[{"name":"install_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"send_test_email","description":"Send one test email through the platform email settings saved in Admin \u2192 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\u2026). 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.","arguments":[{"name":"to","type":"string","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_company_app_rule","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"mode","type":"string","required":true,"enum":["stricter","exempt","none"],"description":""},{"name":"min_android","type":"string","required":false,"enum":[],"description":""},{"name":"min_ios","type":"string","required":false,"enum":[],"description":""},{"name":"note","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_company_user_access","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"is_active","type":"boolean","required":false,"enum":[],"description":""},{"name":"is_owner","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"set_monitor_alert_recipients","description":"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).","arguments":[{"name":"recipients","type":"array","required":true,"enum":[],"description":""},{"name":"language","type":"string","required":false,"enum":["en","ar"],"description":""}],"read_only":false,"destructive":false},{"name":"set_zenhr_emergency_stop","description":"The emergency stop: on stops every company's sync at once, a run in progress included; off lifts it.","arguments":[{"name":"on","type":"boolean","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"show_platform_notification_log","description":"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.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""}],"read_only":true,"destructive":false},{"name":"start_support_session","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"reason","type":"string","required":true,"enum":[],"description":"Why support is entering, e.g. a ticket number (5-500 characters)."}],"read_only":false,"destructive":false},{"name":"stop_zenhr_run","description":"Stops a queued or running run. A running one stops at its next safe place; what finished stays.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"run_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"submit_contact_lead","description":"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.","arguments":[{"name":"name","type":"string","required":true,"enum":[],"description":""},{"name":"email","type":"string","required":true,"enum":[],"description":""},{"name":"interest","type":"string","required":true,"enum":[],"description":""},{"name":"message","type":"string","required":true,"enum":[],"description":""},{"name":"consent","type":"boolean","required":true,"enum":[],"description":""},{"name":"company","type":"string","required":false,"enum":[],"description":""},{"name":"phone_country","type":"string","required":false,"enum":[],"description":""},{"name":"phone","type":"string","required":false,"enum":[],"description":""},{"name":"company_size","type":"string","required":false,"enum":[],"description":""},{"name":"preferred_contact","type":"string","required":false,"enum":["email","phone","whatsapp"],"description":""},{"name":"locale","type":"string","required":false,"enum":["en","ar"],"description":"The language of the auto-reply."}],"read_only":false,"destructive":false},{"name":"suspend_license","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"license_id","type":"integer","required":true,"enum":[],"description":""},{"name":"suspended","type":"boolean","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"switch_zenhr_branch","description":"Pauses or resumes one branch's sync.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":true,"enum":[],"description":""},{"name":"enabled","type":"boolean","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"switch_zenhr_sync","description":"Turn a company's ZenHR \u2192 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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"enabled","type":"boolean","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"sync_app_stores","description":"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.","arguments":[],"read_only":false,"destructive":false},{"name":"test_backup_destination","description":"Writes, reads and removes a small file at a backup destination and says what it found (docs\/backups.md).","arguments":[{"name":"destination_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"test_zenhr_connection","description":"Makes one real read call to ZenHR to see the connection works. Refused while a sync runs. Ask a person before calling it.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"unlock_user","description":"Lift the lock on a company user after too many failed sign-ins.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_ai_settings","description":"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.","arguments":[{"name":"provider","type":"string","required":false,"enum":["anthropic","openai","none"],"description":""},{"name":"model","type":"string","required":false,"enum":[],"description":""},{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_app_debug_account","description":"Turn the app's debug mode on or off for one account (docs\/mobile-debug.md). user_id or email; on (boolean); hours (1\u2013168, 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.","arguments":[{"name":"user_id","type":"integer","required":false,"enum":[],"description":"The account."},{"name":"email","type":"string","required":false,"enum":[],"description":"The account, by email, instead of user_id."},{"name":"on","type":"boolean","required":true,"enum":[],"description":"On or off."},{"name":"hours","type":"integer|null","required":false,"enum":[],"description":"Hours until it turns itself off (1\u2013168). Default 24; null for no end."},{"name":"send","type":"boolean","required":false,"enum":[],"description":"Ask the phone for a report at its next open."}],"read_only":false,"destructive":false},{"name":"update_app_release","description":"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.","arguments":[{"name":"platform","type":"string","required":true,"enum":["android","ios"],"description":""},{"name":"min_version","type":"string","required":false,"enum":[],"description":"One of known_versions from get_app_releases."},{"name":"update_mode","type":"string","required":false,"enum":["none","suggest","force"],"description":""},{"name":"message_en","type":"string","required":false,"enum":[],"description":""},{"name":"message_ar","type":"string","required":false,"enum":[],"description":""},{"name":"release_notes_en","type":"string","required":false,"enum":[],"description":""},{"name":"release_notes_ar","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_backup_destination","description":"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.","arguments":[{"name":"destination_id","type":"integer","required":true,"enum":[],"description":""},{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"keep_daily","type":"integer","required":false,"enum":[],"description":"1 to 365."},{"name":"keep_weekly","type":"integer","required":false,"enum":[],"description":"0 to 104."},{"name":"keep_monthly","type":"integer","required":false,"enum":[],"description":"0 to 120."}],"read_only":false,"destructive":false},{"name":"update_backup_settings","description":"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.","arguments":[{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"frequency","type":"string","required":false,"enum":["hours","daily","weekly"],"description":""},{"name":"every_hours","type":"integer","required":false,"enum":[],"description":"With frequency hours: 1, 2, 3, 4, 6, 8 or 12."},{"name":"time","type":"string","required":false,"enum":[],"description":"HH:MM in the chosen time zone."},{"name":"weekday","type":"integer","required":false,"enum":[],"description":"With frequency weekly: 0 is Sunday."},{"name":"timezone","type":"string","required":false,"enum":[],"description":"For example Asia\/Baghdad."},{"name":"include_database","type":"boolean","required":false,"enum":[],"description":""},{"name":"include_files","type":"boolean","required":false,"enum":[],"description":""},{"name":"include_secrets","type":"boolean","required":false,"enum":[],"description":".env and keys. Refused until a passphrase is set."},{"name":"restore_test","type":"string","required":false,"enum":["every_run","daily","weekly","monthly","off"],"description":""},{"name":"free_space_factor","type":"number","required":false,"enum":[],"description":"Free disk needed, as a multiple of the expected size."},{"name":"overdue_grace_hours","type":"integer","required":false,"enum":[],"description":""},{"name":"job_timeout_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"target_rto_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"notify_success","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_calculator_rates","description":"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).","arguments":[{"name":"ss_employee_percent","type":"number","required":false,"enum":[],"description":""},{"name":"ss_employer_percent","type":"number","required":false,"enum":[],"description":""},{"name":"ss_base","type":"string","required":false,"enum":["gross","basic"],"description":""},{"name":"ss_ceiling","type":"number","required":false,"enum":[],"description":""},{"name":"tax_period","type":"string","required":false,"enum":["annual","monthly"],"description":""},{"name":"tax_brackets","type":"array","required":false,"enum":[],"description":"[{\"min\": 0, \"max\": 250000, \"rate\": 3}, \u2026]"},{"name":"tax_exemption_single","type":"number","required":false,"enum":[],"description":""},{"name":"tax_exemption_married","type":"number","required":false,"enum":[],"description":""},{"name":"tax_allowances_exempt_percent","type":"number","required":false,"enum":[],"description":""},{"name":"tax_ss_deductible","type":"boolean","required":false,"enum":[],"description":""},{"name":"overtime_multiplier","type":"number","required":false,"enum":[],"description":""},{"name":"rest_day_multiplier","type":"number","required":false,"enum":[],"description":""},{"name":"holiday_multiplier","type":"number","required":false,"enum":[],"description":""},{"name":"day_base","type":"number","required":false,"enum":[],"description":""},{"name":"hours_per_day","type":"number","required":false,"enum":[],"description":""},{"name":"eos_days_per_year","type":"number","required":false,"enum":[],"description":""},{"name":"eos_min_years","type":"number","required":false,"enum":[],"description":""},{"name":"currency_code","type":"string","required":false,"enum":[],"description":""},{"name":"country","type":"string","required":false,"enum":[],"description":"ISO code; default IQ."},{"name":"variant","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_calculator_rule_set","description":"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\u00b7t + b)\u00b7t + c, t = (x \u2212 offset) \u00f7 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% \u00d7 (x \u2212 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) \u2014 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}.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"rules","type":"object","required":false,"enum":[],"description":""},{"name":"sources","type":"object","required":false,"enum":[],"description":""},{"name":"notes","type":"object","required":false,"enum":[],"description":""},{"name":"allow_estimates","type":"boolean","required":false,"enum":[],"description":"Let this set's calculators run on rules not verified yet (results marked \"estimate\"). Off by default; every change is logged."},{"name":"requires_confirmation","type":"array","required":false,"enum":[],"description":"What is not confirmed yet: [{rules: [rule keys or group names], reason {en, ar}, needed {en, ar}}]; [] or null for none"},{"name":"variant_label","type":"object","required":false,"enum":[],"description":""},{"name":"effective_from","type":"string","required":false,"enum":[],"description":""},{"name":"position","type":"integer","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_company","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"name","type":"object","required":false,"enum":[],"description":"Company name; give one or both languages."},{"name":"slug","type":"string","required":false,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["active","suspended"],"description":""},{"name":"country","type":"string","required":false,"enum":["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","ZW"],"description":""},{"name":"timezone","type":"string","required":false,"enum":[],"description":""},{"name":"notes","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_contact_settings","description":"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\": [\"a@x.com\"], ...}. 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.","arguments":[{"name":"interests","type":"array","required":false,"enum":[],"description":""},{"name":"company_sizes","type":"array","required":false,"enum":[],"description":""},{"name":"recipients","type":"object","required":false,"enum":[],"description":""},{"name":"default_country","type":"string","required":false,"enum":["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","PK"],"description":""},{"name":"auto_reply","type":"object","required":false,"enum":[],"description":""},{"name":"seo_title","type":"object","required":false,"enum":[],"description":""},{"name":"seo_description","type":"object","required":false,"enum":[],"description":""},{"name":"turnstile_site_key","type":"string","required":false,"enum":[],"description":""},{"name":"turnstile_secret","type":"string","required":false,"enum":[],"description":""},{"name":"clear_turnstile_secret","type":"boolean","required":false,"enum":[],"description":""},{"name":"google_maps_key","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_flash_messages","description":"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.","arguments":[{"name":"position","type":"string","required":false,"enum":["top-center","top-start","top-end","center","bottom"],"description":"Where messages appear. Start and end flip in Arabic."},{"name":"duration_seconds","type":"integer","required":false,"enum":[],"description":"How long a message stays, 2 to 30 seconds."},{"name":"auto_close","type":"boolean","required":false,"enum":[],"description":"Whether messages close by themselves. Errors never do."}],"read_only":false,"destructive":false},{"name":"update_lead","description":"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.","arguments":[{"name":"lead_id","type":"integer","required":true,"enum":[],"description":""},{"name":"status","type":"string","required":false,"enum":["new","contacted","closed"],"description":""},{"name":"notes","type":"string","required":false,"enum":[],"description":""},{"name":"assigned_to","type":"integer","required":false,"enum":[],"description":"A platform admin user id; null to unassign."}],"read_only":false,"destructive":false},{"name":"update_license","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"license_id","type":"integer","required":true,"enum":[],"description":""},{"name":"modules","type":"array","required":false,"enum":[],"description":""},{"name":"max_employees","type":"integer","required":false,"enum":[],"description":""},{"name":"max_branches","type":"integer","required":false,"enum":[],"description":"Not below the branches the company already has."},{"name":"starts_on","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"ends_on","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"},{"name":"notes","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_login_design","description":"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}.","arguments":[{"name":"design","type":"string","required":true,"enum":["classic","illustration","minimal","command","card"],"description":""},{"name":"eyebrow","type":"object","required":false,"enum":[],"description":""},{"name":"headline","type":"object","required":false,"enum":[],"description":""},{"name":"text","type":"object","required":false,"enum":[],"description":""},{"name":"image","type":"string","required":false,"enum":[],"description":""},{"name":"background","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_monitor_alert_rule","description":"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.","arguments":[{"name":"metric","type":"string","required":true,"enum":["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_hours"],"description":""},{"name":"threshold","type":"number","required":false,"enum":[],"description":""},{"name":"for_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"cooldown_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_platform_admin","description":"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.","arguments":[{"name":"admin_id","type":"integer","required":true,"enum":[],"description":""},{"name":"name","type":"string","required":false,"enum":[],"description":""},{"name":"permissions","type":"array","required":false,"enum":[],"description":""},{"name":"grant","type":"string","required":false,"enum":["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"],"description":""},{"name":"revoke","type":"string","required":false,"enum":["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"],"description":""}],"read_only":false,"destructive":false},{"name":"update_platform_appearance","description":"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.","arguments":[{"name":"mode","type":"string","required":false,"enum":["","light","dark","system"],"description":"Empty: follow the level above."},{"name":"layout","type":"string","required":false,"enum":["","default","mini","detached","modern","transparent","horizontal","horizontal-single","horizontal-overlay","horizontal-box","horizontal-fullwidth","horizontal-sidemenu","twocolumn","stacked"],"description":"Empty: follow the level above."},{"name":"color","type":"string","required":false,"enum":["","primary","brightblue","lunargreen","lavendar","magenta","chromeyellow","lavared"],"description":"Empty: follow the level above."},{"name":"sidebar","type":"string","required":false,"enum":["","light","brand","darkgreen","darkgray","royalblue","indigo"],"description":"Empty: follow the level above."},{"name":"topbar","type":"string","required":false,"enum":["","white","darkaqua","whiterock","rockblue","bluehaze","orangegradient","purplegradient","bluegradient","maroongradient"],"description":"Empty: follow the level above."},{"name":"topbarcolor","type":"string","required":false,"enum":["","white","primary","blackpearl","maroon","bluegem","firefly"],"description":"Empty: follow the level above."},{"name":"card","type":"string","required":false,"enum":["","bordered","borderless","shadow"],"description":"Empty: follow the level above."},{"name":"size","type":"string","required":false,"enum":["","default","compact"],"description":"Empty: follow the level above."},{"name":"width","type":"string","required":false,"enum":["","fluid","box"],"description":"Empty: follow the level above."},{"name":"loader","type":"string","required":false,"enum":["","enable","disable"],"description":"Empty: follow the level above."}],"read_only":false,"destructive":false},{"name":"update_platform_limits","description":"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.","arguments":[{"name":"values","type":"object","required":true,"enum":[],"description":"{key: number or null}."}],"read_only":false,"destructive":false},{"name":"update_robots","description":"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.","arguments":[{"name":"marketing","type":"string","required":false,"enum":[],"description":""},{"name":"help","type":"string","required":false,"enum":[],"description":""},{"name":"api","type":"string","required":false,"enum":[],"description":""},{"name":"demo","type":"string","required":false,"enum":[],"description":""},{"name":"app","type":"string","required":false,"enum":[],"description":""},{"name":"admin","type":"string","required":false,"enum":[],"description":""}],"read_only":false,"destructive":false},{"name":"update_security_policy","description":"Change parts of the security policy; fields not given keep their value. Applies from the next request. See get_security_policy for the fields.","arguments":[{"name":"max_attempts","type":"integer","required":false,"enum":[],"description":"Failed sign-ins before the account locks (3-20)."},{"name":"lock_minutes","type":"integer","required":false,"enum":[],"description":"How long a locked account stays locked."},{"name":"password_min_length","type":"integer","required":false,"enum":[],"description":"8-64."},{"name":"password_require_mixed_case","type":"boolean","required":false,"enum":[],"description":""},{"name":"password_require_numbers","type":"boolean","required":false,"enum":[],"description":""},{"name":"password_require_symbols","type":"boolean","required":false,"enum":[],"description":""},{"name":"password_expiry_months","type":"integer","required":false,"enum":[],"description":"0 = passwords never expire."},{"name":"reset_link_minutes","type":"integer","required":false,"enum":[],"description":"How long a reset link works (5-1440)."},{"name":"reset_requests_per_hour","type":"integer","required":false,"enum":[],"description":""},{"name":"reset_channels","type":"array","required":false,"enum":[],"description":""},{"name":"app_idle_minutes","type":"integer","required":false,"enum":[],"description":"Sign out of the app after this long without activity."},{"name":"admin_idle_minutes","type":"integer","required":false,"enum":[],"description":""},{"name":"expire_on_close","type":"boolean","required":false,"enum":[],"description":"Also sign out when the browser closes."},{"name":"remember_me_days","type":"integer","required":false,"enum":[],"description":"0 hides \"Remember me\"."},{"name":"admin_remember_me","type":"boolean","required":false,"enum":[],"description":""},{"name":"support_session_minutes","type":"integer","required":false,"enum":[],"description":"How long a support session inside a company lasts (5-480)."},{"name":"activity_log_max_months","type":"integer","required":false,"enum":[0,6,12,24],"description":"The longest any company keeps its activity log, in months; 0 = no maximum (companies may keep it forever)."}],"read_only":false,"destructive":false},{"name":"update_seo_page","description":"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}.","arguments":[{"name":"page","type":"string","required":true,"enum":["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.reference"],"description":""},{"name":"en","type":"object","required":false,"enum":[],"description":"English fields."},{"name":"ar","type":"object","required":false,"enum":[],"description":"Arabic fields."}],"read_only":false,"destructive":false},{"name":"update_seo_settings","description":"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.","arguments":[{"name":"title_separator","type":"string","required":false,"enum":[],"description":"Between a page title and the site name, e.g. \" | \"."},{"name":"google_verification","type":"string","required":false,"enum":[],"description":"Google Search Console token(s), the content=\"\" value only; several separated by spaces."},{"name":"bing_verification","type":"string","required":false,"enum":[],"description":"Bing Webmaster Tools token(s)."},{"name":"ga_id","type":"string","required":false,"enum":[],"description":"Google Analytics 4 id, G-XXXXXXX, or null."},{"name":"gtm_id","type":"string","required":false,"enum":[],"description":"Google Tag Manager id, GTM-XXXXXX, or null."},{"name":"consent_mode","type":"string","required":false,"enum":["banner","none"],"description":"banner: no measuring until the visitor accepts."},{"name":"consent_text","type":"object","required":false,"enum":[],"description":"{\"en\",\"ar\"} text of the cookie banner."},{"name":"noindex_all","type":"boolean","required":false,"enum":[],"description":"Hide every public page from search engines (staging only)."},{"name":"default_og_image","type":"string","required":false,"enum":[],"description":"Path under public\/ or full URL; 1200x630."},{"name":"apple_touch_icon","type":"string","required":false,"enum":[],"description":""},{"name":"twitter_site","type":"string","required":false,"enum":[],"description":"@handle"},{"name":"organization","type":"object","required":false,"enum":[],"description":"{\"legal_name\", \"logo\", \"same_as\": [urls]} for the Organization JSON-LD."},{"name":"software_application","type":"boolean","required":false,"enum":[],"description":""},{"name":"application_category","type":"string","required":false,"enum":["BusinessApplication","FinanceApplication","ProductivityApplication","WebApplication"],"description":""}],"read_only":false,"destructive":false},{"name":"update_server_switch","description":"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\u2013168, 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.","arguments":[{"name":"on","type":"boolean","required":true,"enum":[],"description":"On or off."},{"name":"hours","type":"integer|null","required":false,"enum":[],"description":"Hours until it turns itself off (1\u2013168). Default 24; null for no end."}],"read_only":false,"destructive":false},{"name":"update_sign_in_options","description":"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.","arguments":[{"name":"forgot_password","type":"boolean","required":false,"enum":[],"description":"Show \"Forgot password\" on sign-in."},{"name":"sso","type":"boolean","required":false,"enum":[],"description":"Show \"Sign in with SSO\"."},{"name":"privacy","type":"boolean","required":false,"enum":[],"description":"Show \"Privacy policy\" on the sign-in screen."}],"read_only":false,"destructive":false},{"name":"update_site_settings","description":"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.","arguments":[{"name":"site_name","type":"object","required":false,"enum":[],"description":"{\"en\": \"...\", \"ar\": \"...\"}"},{"name":"tagline","type":"object","required":false,"enum":[],"description":""},{"name":"footer_text","type":"object","required":false,"enum":[],"description":""},{"name":"colors","type":"object","required":false,"enum":[],"description":"brand, accent, ink, muted, surface as #RRGGBB."},{"name":"fonts","type":"object","required":false,"enum":[],"description":"latin_heading, latin_body, arabic_heading, arabic_body."},{"name":"currency","type":"object","required":false,"enum":[],"description":""},{"name":"emails","type":"object","required":false,"enum":[],"description":"hello, sales, support."},{"name":"page_titles","type":"object","required":false,"enum":[],"description":"home, pricing, contact, each {\"en\",\"ar\"}."},{"name":"nav","type":"array","required":false,"enum":[],"description":"Menu links in order: [{\"label\": {\"en\",\"ar\"}, \"url\": \"\/pricing\"}]."},{"name":"app_theme","type":"object","required":false,"enum":[],"description":"The system palette (HRM, FSM, admin, sign-in): {\"primary\",\"secondary\",\"sidebar\",\"login_panel\"} as #RRGGBB, and \"sidebar_style\": light|colored. Send all five."},{"name":"auth_panel","type":"object","required":false,"enum":[],"description":"Sign-in page panel: {\"headline\": {\"en\",\"ar\"}, \"text\": {\"en\",\"ar\"}}"},{"name":"header_button","type":"object","required":false,"enum":[],"description":"{\"label\": {\"en\",\"ar\"}, \"url\": \"mailto:...\"}"}],"read_only":false,"destructive":false},{"name":"update_user_contact","description":"Set where the password reset links of a company user go: personal email and WhatsApp phone (+ and country code).","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"user_id","type":"integer","required":true,"enum":[],"description":""},{"name":"personal_email","type":"string","required":false,"enum":[],"description":""},{"name":"phone","type":"string","required":false,"enum":[],"description":"International format, e.g. +9647701234567."}],"read_only":false,"destructive":false},{"name":"update_zenhr_data_type","description":"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.","arguments":[{"name":"company_id","type":"integer","required":true,"enum":[],"description":""},{"name":"data_type","type":"string","required":true,"enum":[],"description":""},{"name":"branch_id","type":"integer","required":false,"enum":[],"description":""},{"name":"enabled","type":"boolean","required":false,"enum":[],"description":""},{"name":"frequency","type":"string","required":false,"enum":["hourly","every_6h","daily","weekly","manual"],"description":""},{"name":"starting_from","type":"string","required":false,"enum":[],"description":"YYYY-MM-DD"}],"read_only":false,"destructive":false},{"name":"verify_calculator_rules","description":"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.","arguments":[{"name":"id","type":"integer","required":true,"enum":[],"description":""},{"name":"keys","type":"array","required":true,"enum":[],"description":"Rule keys, e.g. ['ss_employee_percent']."},{"name":"verified","type":"boolean","required":false,"enum":[],"description":"Default true."}],"read_only":false,"destructive":false}]}}}