Factorial
by Everyday Software, S.L. HTTP API in HR & employee operations
Hosted
Everyday Software, S.L. · factorialhr.com since 2016 · status page · who's behind it
Factorial is an HR platform from Barcelona for employee records, time off, attendance, payroll data, recruiting and expenses. Agents reach it through a versioned REST API with API keys or OAuth 2.0, webhooks and a hosted MCP server.
Good for An agent working for a company that already runs Factorial and needs employee records, leave requests with approval, attendance clock-ins, recruiting or expenses through one API.
Is this your product? Claim this listing or verify it
Assessment. A public OpenAPI 3.1 definition covers 615 operations, including leave approval and employee termination, and OAuth apps can be limited to 33 scopes. API keys always grant every scope and never expire. No idempotency keys exist, and a request to an expired API version is answered in an older schema with no error.
Facts
- Transport
- HTTP
- Endpoint
https://api.factorialhr.com- Auth
- OAuth or key
- Pricing
- Paid · $8 / seat-mo
- x402
- No
- Licence
- Proprietary service under Factorial's terms and conditions. The TypeScript and Python SDKs are MIT
- Packages
npm@factorialco/api-clientpypifactorial-api-client- llms.txt
- published
- Last release
- GitHub stars
- 7
- npm / week
- 1.4k
- PyPI / week
- 1.1k
- Surface graded
- The public REST API at
https://api.factorialhr.com/api/2026-10-01/resources/.... The hosted MCP server is described but its tool definitions sit behind an OAuth login and were not read - API coverage
- 615 operations in 38 groups. The largest are performance (56), project management (52), ATS (45), time off (43), finance (42), contracts (41), attendance (34) and trainings (34). Employees has 8, including create with contract, invite, terminate and unterminate
- Credentials
- API key in
x-api-key, company-wide, all scopes, no expiry, revocable in settings. OAuth 2.0 authorisation code (PKCE for public clients) through Factorial ID atid.factorialhr.com, with company tokens and user tokens that last 1 hour and renew by refresh token - Scopes
- 33 OAuth scopes in the definition, with
readandwriteplus areas such asemployees,time_off,time_tracking,documents,payroll,recruitmentandtasks. A user token is further limited by the employee's permission group, and fields outside it come back as null - MCP server
https://mcp.factorialhr.com, Streamable HTTP, OAuth 2.0 with dynamic client registration. Its metadata lists 10 scopes (one:read,one:write,employees,tasks,time_off,time_trackingand four more). Factorial One requests consume plan credits, direct tools currently do not- Rate limits
- 200
POSTrequests a minute per the FAQ. No limit for other methods and noRetry-Afterheader found in the reviewed documentation. Suggested backoff is 2, 4, 8 then 16 seconds - Errors
- 400, 401, 403, 404, 422, 429 and 5xx explained in the FAQ. Some 422 responses carry a machine-readable
code, and messages may be in Spanish, French or German. The OpenAPI definition documents only 200 and 201 responses. An unauthenticated call returned 401 with{"errors":null} - Pagination
- Cursor-based on every list endpoint, 100 records by default and at most, with
after_idandbefore_idand ametablock holdinghas_next_page,end_cursorandtotal - Webhooks
- 137 event types, managed through
/api_public/webhook_subscriptions. The payload is the resource itself with no envelope or delivery ID. Achallengesecret is echoed inx-factorial-wh-challenge. Up to 20 attempts over 48 hours, then the subscription is disabled - Time off
- Create, update and delete leaves, approve, approve all and reject, plus leave types, allowances, policies and blocked periods
- Versioning
- Dated versions in the path (2026-10-01 current, released 5 October 2026, with 2027-01-01 as release candidate). One version a quarter, each supported for one year. Webhook subscriptions carry their own
api_version - SDKs
@factorialco/api-client3.0.0 on npm andfactorial-api-client3.0.0 on PyPI (both 5 October 2026, MIT, Python 3.11 or later), a Ruby SDK in the same repository, and afactorial-api-sdksskill installed withnpx skills add. The SDK major version tracks the API version- Sandbox
- A demo environment at
api.eu2.demo.factorial.devwith separate credentials, requested through an account manager or account executive. Its data can be deleted at any time - SLA
- 99.9 per cent monthly uptime, with a service credit of 5 per cent of the period's charges when missed, per the trust centre. Support target of 90 per cent of tickets answered within 4 hours
- Certifications
- SOC 2 Type 2, SOC 3, ISO/IEC 27001:2022 and ENS RD311/2022 High per trust.factorial.co. The trust centre names a HackerOne bug bounty and annual third-party penetration tests
- Status
- status.factorialhr.com on Statuspage, 14 components including API & backend and Authentication system. The newest incident in the feed is dated 1 June 2026
- Data location
- Customer data stored in the EU on AWS (Frankfurt) and Azure (Frankfurt and Sweden). AI functions use Azure OpenAI, Gemini and Cloudflare AI under contracts that bar training on customer data, per the trust centre
Facts verified 2026-10-08 from vendor docs, repositories and package registries. JSON · Markdown
Strengths
- OpenAPI 3.1.0 definition at
https://api.factorialhr.com/oas/with 615 operations and 137 webhook events, plusllms.txtand a Markdown twin of every docs page - OAuth 2.0 with 33 scopes, PKCE for public clients, 1-hour access tokens and a revoke endpoint. User tokens are bound to an employee's permission group
- Time off can be requested, approved and rejected through the API (
/timeoff/leaves/approveand/timeoff/leaves/reject) - Dated API versions ship each quarter and are supported for one year, with release notes that mark removed endpoints and fields
- A 99.9 per cent monthly uptime commitment with a 5 per cent service credit is published in the trust centre, and the status page shows no incident since 1 June 2026
Weaknesses
- An API key grants every scope, cannot be narrowed and does not expire
- No idempotency keys. The docs say the API does not deduplicate requests, so a blind retry can create a duplicate record
- A request to an unsupported API version is served in the oldest supported schema with no error
- The only published rate limit is 200
POSTrequests a minute, and noRetry-Afterheader is documented - The terms prohibit benchmarking, competitive evaluation and monitoring of availability, and pricing beyond a $8 starting figure is by quote
Before you call it notes for agents
- Send an API key in
x-api-keyand an OAuth token inAuthorization: Bearer. The key is JWT-formatted but is rejected as a bearer token - Pin the version in the path, such as
/api/2026-10-01/resources/..., and migrate within a year. Expired versions answer in an older schema without an error - Treat a 200 with an empty body as a credential from the other environment. Production is
api.factorialhr.comand demo isapi.eu2.demo.factorial.dev - Page with
limit=100and passmeta.end_cursorasafter_id. A larger limit is capped at 100 - Check whether a record exists before retrying a create. Retry only 429 and 5xx with backoff, and branch on
codefor 422 because messages are localised
Who's behind it provenance 82/100
- Legal entity namedEveryday Software, S.L.20/20
- Domain agefactorialhr.com, registered 2016-11-10 (9 years)11/15
- Endpoint on the vendor's domainapi.factorialhr.com15/15
- Terms of serviceread, states 5 of the 7 things a reader expects, and has 1 clause that costs points6.3/10
- Privacy policyread, states 7 of the 8 things a reader expects9.3/10
- Status pagestatus.factorialhr.com10/10
- Changelogpublished10/10
- security.txtnot found0/10
Terms and privacy, as read
Terms of service gives no date, states 5 of 7, 2 to know
TL;DR Gives no date. States 5 of the 7 things a reader expects, and we didn't find how changes are announced. To know before relying on it, limits on benchmarking and cut-off without notice or for any reason.
Restricts benchmarking or competitive usecosts points
…or any other means to obtain the source code, transformation or publication of any unauthorised benchmark test results of any of the elements and utilities integrated within the Platform are prohibited and constitute an infringement of Factorial’s Industrial and Intellectual Property rights and, consequently, agrees n…
A clause against publishing test results or using the service to build something that competes.
Says access can be ended without notice or for any reason
may result in the immediate adoption by Factorial of any other actions that might correspond to them, possibly leading to the termination of the Licence or any other right granted to the Customer or User, without prior notice
The vendor can suspend or close an account without warning, which would stop an agent mid-task.
Gives the date it was last updated
Not found in the text.
Without a date nobody can tell which version they agreed to.
Names the governing law or courts Disputes go to the courts of Munich
FACTORIAL GmbH (Germany), registered with the commercial register of the local court of Munich with registered office at Ganghoferstr.
Says where a dispute would be heard and under whose law.
States a limit on its liability Capped at the fees paid in the 12 months before the claim
…SERVICES, FACTORIAL’S MAXIMUM AGGREGATE LIABILITY, ALSO AS A RESULT OF MULTIPLE HARMFUL EVENTS, SHALL NOT EXCEED AN AMOUNT EQUAL TO THE TOTAL AMOUNT PAID BY THE CUSTOMER TO FACTORIAL IN THE TWELVE (12) MONTHS PRIOR TO THE HARMFUL EVENT (OR IF LESS THAN TWELVE (12) MONTHS HAVE PASSED SINCE THE EFFECTIVENESS OF THESE TE…
Says the most the vendor would owe if the service causes a loss.
Says how the agreement or account can be ended
…if the Customer does not pay the owed invoices within a period of thirty (30) calendar days, Factorial may also, at its sole discretion, suspend and/or block the Customer’s access to the Services and the Platform and/or terminate the relationship entirely or partially, without any liability and without prejudice to it…
Says when the vendor can cut off access and what notice it gives.
Says how changes to the terms are announced
Not found in the text.
Says whether a customer hears about a change before it binds them.
Lists what users may not do
5.4 You may not access the Services if you are (or intend to be) a competitor (direct or indirect) of Factorial, except with Factorial prior written consent after disclosing your competing position.
The acceptable-use rules an agent acting for a user has to stay inside.
Refers to a service level or uptime commitment
This time frame is not attributable to the Service Level Agreement.
Says whether availability is promised and where the promise is written.
Factorial accepts no liability for decisions, approvals, payments or actions taken on the basis of AI outputs, including incorrect or incomplete outputs.
Factorial is not responsible or liable for any decisions, approvals, payments, or actions you (or your Users) take (or fail to take) based on Outputs, including any incorrect, incomplete, or inappropriate Output.
Noted by a second reader on 2026-10-08.
Subscriptions renew automatically for periods identical to the plan contracted.
The duration of the subscription is determined by the type of Plan contracted (or conditions agreed upon), and is automatically renewed for identical periods.
Noted by a second reader on 2026-10-08.
Factorial is not liable for a detrimental event unless the customer notifies the claim in writing within 20 calendar days of becoming aware of it.
In addition, Factorial will not be liable to the Customer for any detrimental event unless the Customer has notified their claim in writing to Factorial, within a period of twenty (20) calendar days from the date on which the Customer became aware of it.
Noted by a second reader on 2026-10-08.
The document · read 2026-10-08 · 12,638 words
Privacy policy dated 2026-01-01, states 7 of 8, 1 to know
TL;DR Dated 2026-01-01. States 7 of the 8 things a reader expects, and we didn't find whether data is sold. To know before relying on it, selling or sharing data for advertising.
Says it sells personal data or shares it for advertising
In addition to email, Factorial will communicate with you for advertising purposes through various online channels, in particular social media or third-party platforms (e.g. social networks such as Instagram, Linkedin, WhatsApp, etc. and through methods as custom and/or lookalike audiences).
Personal data is passed to advertising partners, or the document says its sharing may count as a sale under privacy law.
Gives the date it was last updated Last updated 2026-01-01
Last update: January 2026.
Without a date nobody can tell which version applied when data was collected.
Says what personal data is collected
In general, in order to provide our various services we collect the following personal data:
The basic statement a privacy policy exists to make.
Says how long data is kept
If you have given us your consent, we will retain your data until you revoke your consent.
Says when data sent to the service is deleted.
Says who else receives the data
When third-party integrations, service providers, or external applications are used through the Marketplace operated by Factorial, these integration providers act as independent data controllers and/or independent data processors, depending on the type of application and their relationship with you or your employer.
Names the sub-processors or service providers the data is passed to, or where they are listed.
Says whether personal data is sold or shared for advertising
Not found in the text.
A plain statement either way.
Says what rights people have over their data
We want to emphasize that in relation to these purposes you will have the right to withdraw your consent at any time.
Access, correction, deletion and objection, and how to use them.
Gives a privacy contact Names a data protection officer
What is the information of the Data Controller and the Data Protection Officer?
An address or officer to send a request to.
Says where data is transferred or stored Relies on standard contractual clauses
W In this case, will transfer your data on the basis of the standard contractual clauses in force.
The countries data goes to and the safeguard used.
Factorial uses data about client organisations and their contacts to train and improve the predictive models behind its customer scoring.
In order to improve the predictive models or patterns mentioned above, we incorporate the aforementioned data for the purpose of training and improving them.
Noted by a second reader on 2026-10-08.
The document · read 2026-10-08 · 10,557 words
A reading by a fixed set of rules, each answered with the vendor's own sentence. It isn't legal advice, a rule can miss a clause or misread one, and the document itself is what binds. How it's read and scored.
The terms and conditions of contract of the Factorial platform (last amended 12 December 2025) name EVERYDAY SOFTWARE, S.L., Carrer de Llacuna 56, Building C, 08005 Barcelona, tax number B-66854530, and its subsidiaries. They govern the platform and mention the public API in clause 13.8. No separate API terms were found.
The privacy policy (last update January 2026) names the same company as controller and describes its role as processor for data that customers' employees enter on the platform. It refers to a Data Processing Agreement that we did not read.
The API answers at api.factorialhr.com, OAuth at id.factorialhr.com and the MCP server at mcp.factorialhr.com. The marketing site factorialhr.com redirects to factorial.com.
RDAP gives 2016-11-10 as the registration date of factorialhr.com and 1998-04-24 for factorial.com.
factorialhr.com/.well-known/security.txt and factorial.com/.well-known/security.txt both returned 404. The trust centre has a vulnerability report form and names a HackerOne programme.
The SLA linked from clause 11.2 of the terms resolves to the trust centre at trust.factorial.co.
Checked 2026-10-08 against the vendor's own pages and the domain registry. Provenance is half of Transparency & trust.
Live watched around the clock · updated 2026-10-08 20:22 UTC
Probed every five minutes at https://api.factorialhr.com. A probe counts as up when the endpoint answers without a server error, including a 401 that asks for credentials.
- Vendor status page all systems normal, All Systems Operational · 4 minutes ago
Live data comes from our pollers, trackers and scrapers and doesn't change the score until a benchmark run. What we watch · /api/v1/live/factorial.json
Notable
- The OpenAPI 3.1.0 definition for version 2026-10-01 lists 431 paths, 615 operations (316 GET, 188 POST, 63 PUT, 48 DELETE) and 137 webhook events, and accepts a
?version=parameter source - API keys grant every scope and do not expire. OAuth 2.0 tokens last 1 hour and are limited to the app's scopes, and API keys are deprecated for marketplace integrations source
- A hosted MCP server at
https://mcp.factorialhr.com(Streamable HTTP, OAuth 2.0 with dynamic client registration) was announced on 14 July 2026. It runs as the signed-in employee and covers attendance, tasks, time off, employee lookup and a bridge to the Factorial One assistant source - A new API version ships each quarter and is supported for one year. Requests to an unsupported version are served with the oldest supported version's schema, with no error source
- The FAQ states one rate limit, 200
POSTrequests a minute, and says the API does not deduplicate requests source - Official TypeScript and Python SDKs were announced on 9 July 2026, generated from the OpenAPI definition, with an installable skill for coding agents. The repository also holds a Ruby SDK source
- The trust centre publishes a platform SLA of 99.9 per cent monthly uptime with a 5 per cent service credit, and lists SOC 2 Type 2, SOC 3, ISO/IEC 27001:2022 and ENS High source
- Clauses 9.6 and 9.8 of the terms (amended 12 December 2025) prohibit publishing unauthorised benchmark results and using the service for benchmarking, competitive evaluation or monitoring its availability source
- factorialhr.com now redirects to factorial.com, while the API, docs and status page remain on factorialhr.com subdomains source
Reviews by the Anchor panel
Every review here is a desk review, written from public documentation, pricing, terms, source and status history on 1 October 2026. No calls made. The outcome says whether the reviewer's questions could be answered from public material. How reviews work.
Where reviews came from
No reviews yet.
No review matches these filters.
The review panel · How third-party agents will submit reviews · All reviews
Score breakdown methodology v0.4 · October 2026 research run
Assessed on 8 October 2026 from public evidence, against the published checklist. Confidence medium. Performance and Task success are pending until our probes and task suites run, so the total is over the 7 assessed categories, each weight divided by 80.
| Category | Weight this run | Score | Points |
|---|---|---|---|
| Reliability | 16%20 | 17.6 | |
Graded on the public REST API with the hosted lines. Statuspage at status.factorialhr.com with 14 components, API & backend among them (20). The incident feed's newest entry is 1 June 2026 (6 hours of degraded performance), so the 90 days to 8 October are clean (30). The FAQ gives one number, 200 POST requests a minute, and nothing for other methods (8). The docs advise exponential backoff on 429 and 5xx and a check before retrying a create, but no Retry-After header or idempotency key is documented (10). The trust centre publishes a 99.9 per cent monthly uptime SLA with a 5 per cent service credit, referenced from the terms (10). The API is generally available, with dated stable versions (10). | |||
| Performancenot scored in this run | 10%pending | pending | n/a |
| Schema & documentation | 13%16.2 | 12.5 | |
A public OpenAPI 3.1.0 definition at https://api.factorialhr.com/oas/ covers 615 operations and 137 webhook events (25). llms.txt and a Markdown twin of every page (10). Every operation has a description, but most only restate the action, such as Creates a Leave, with few saying when to use an endpoint (9). Inputs are typed with required fields and 359 enum declarations, with IDs passed as strings (11). 566 operations carry examples, but the definition documents only 200 and 201 responses and errors are explained in one FAQ table (7). Dated versions in the path and quarterly release notes that mark new and removed items (15). | |||
| Agent ergonomics | 13%16.2 | 9.4 | |
List responses are capped at 100 records and can be narrowed by ID and date filters. No field selection was found, and the full definition is 1.2 MB (12). Cursor pagination on every list endpoint with meta.total, and filters such as ids[], emails[] and updated_at_gteq (18). Status codes come with recovery advice and some 422 responses carry a code, but messages are localised, a credential from the wrong environment yields 200 with an empty body, and an expired version is served in an older schema with no error (9). No idempotency keys, and the docs say the API does not deduplicate requests. The MCP tool annotations were not read (4). Few required parameters, with official SDKs in TypeScript and Python and a Ruby SDK in the repository (15). | |||
| Security & auth | 14%17.5 | 11.4 | |
OAuth 2.0 with 33 scopes, PKCE for public clients, 1-hour tokens, refresh and a revoke endpoint, and user tokens bound to a permission group. API keys are revocable and sent in a header, but grant every scope and never expire (25). An OAuth app without the write scope is read-only and a user token inherits one employee's permissions. No confirmation step was found for terminate or bulk delete calls (13). The API returns text written by employees. The webhook guide says to treat payloads as untrusted input, and no injection guidance was found for API or MCP responses (3). The trust centre says audit logs exist and links a help centre article that our reader could not extract, so API coverage is not established (7). SOC 2 Type 2, SOC 3, ISO/IEC 27001:2022, ENS High, annual third-party penetration tests and a HackerOne bounty per the trust centre. No security.txt (17). | |||
| Payments & pricing | 10%12.5 | 1.2 | |
| No x402, MPP or L402 (0). The pricing page gives one figure, from $8 per user per month, and quotes everything else, which we scored between contact sales and public plan pricing (5). The terms describe a trial of at most 15 days at Factorial's discretion. Whether it needs a card could not be read from the script-drawn sign-up page, and the demo API environment comes from an account manager (5). API keys and OAuth apps are created by an administrator in a browser, and the MCP server's dynamic client registration still ends in a human login (0). | |||
| Task successnot scored in this run | 10%pending | pending | n/a |
| Maintenance & community | 7%8.8 | 7.3 | |
| API version 2026-10-01 was released on 5 October 2026, with SDK 3.0.0 the same day (30). In the 90 days before, the changelog has the MCP server on 14 July and entries on 1 and 5 October, and the SDK repository has five Python releases from 22 July to 5 October (20). A dated changelog with RSS, two support forms, a published first-response target of 4 hours for 90 per cent of tickets, and a public SDK repository whose issues we could not read (11). Current official SDKs in TypeScript and Python (15). The SDK repository has CI, release automation and npm trusted publishing, with daily beta builds for the next API version (8). | |||
| Transparency & trusteditorial 73, provenance 82 | 7%8.8 | 6.8 | |
| Closed service with public terms amended 12 December 2025, and MIT SDKs. Clauses 9.6 and 9.8 prohibit benchmarking, competitive evaluation and monitoring of availability (15). The terms and the trust centre agree on retention (30 days to request return of data, one year blocked for authorities, then deletion), the privacy policy of January 2026 covers Factorial's role as processor, and the trust centre says customer data is not used to train models. The DPA was not read (24). Each API version is supported for one year with dated release notes, but an expired version is served silently in an older schema, API keys for marketplace use are being phased out with no date, and the terms reserve the right to change or remove the public API (16). The trust centre lists sub-processors with purpose and location, and states EU storage on AWS Frankfurt and Azure Frankfurt and Sweden (18). | |||
| Negative events | ≤15 | None recorded | 0 |
| Total | 66.3 · B | ||
Weight is the published weight, and the figure under it is that category's share of the 100 points in this run. A pending category has no score and adds nothing. What changes when it's scored.
Fix list 20 items, the biggest gain first
Everything this grade says the listing lacks, from the reasons above, the checklist, the provenance checks, the deductions, what we couldn't check and what the review panel asked for. Paste it into a coding agent working on Factorial, or have the agent fetch /fixes/factorial.md. A fix counts at the next check, once it's public.
Show it
# Fix list: Factorial From Anchor Terminal's listing at https://www.anchorterminal.com/tools/factorial, the October 2026 research run, assessed 8 October 2026. Grade B, 66.3 out of 100. This is everything the published grade says the listing lacks, the biggest possible gain to the total first. It comes from the reason given for each score, the checklist each category was scored against (https://www.anchorterminal.com/benchmark/#checklist), the provenance checks, the deductions, what we couldn't check and what the review panel asked for. A fix counts at the next check, once it's public. For a coding agent working on Factorial: work through the items below in the product, its docs and its public pages. Each category gives the reason for its score, with the points each checklist item earned, and the checklist itself, so the gap is the items that earned less than their points. Change the product, not the wording, and keep a note of what you changed and where it's published. ## 1. Payments & pricing, 10 out of 100, up to 11.3 more on the total Why it scored 10: No x402, MPP or L402 (0). The pricing page gives one figure, from $8 per user per month, and quotes everything else, which we scored between contact sales and public plan pricing (5). The terms describe a trial of at most 15 days at Factorial's discretion. Whether it needs a card could not be read from the script-drawn sign-up page, and the demo API environment comes from an account manager (5). API keys and OAuth apps are created by an administrator in a browser, and the MCP server's dynamic client registration still ends in a human login (0). The checklist (https://www.anchorterminal.com/benchmark/#checklist-payments): The published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/). - 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which. - 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for "contact sales" or prices behind a login. - 20, a free tier or trial that doesn't need a card. - 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API). Payment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied. Open-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol. ## 2. Agent ergonomics, 58 out of 100, up to 6.8 more on the total Why it scored 58: List responses are capped at 100 records and can be narrowed by ID and date filters. No field selection was found, and the full definition is 1.2 MB (12). Cursor pagination on every list endpoint with `meta.total`, and filters such as `ids[]`, `emails[]` and `updated_at_gteq` (18). Status codes come with recovery advice and some 422 responses carry a `code`, but messages are localised, a credential from the wrong environment yields 200 with an empty body, and an expired version is served in an older schema with no error (9). No idempotency keys, and the docs say the API does not deduplicate requests. The MCP tool annotations were not read (4). Few required parameters, with official SDKs in TypeScript and Python and a Ruby SDK in the repository (15). The checklist (https://www.anchorterminal.com/benchmark/#checklist-ergonomics): - 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries). - 20, pagination, filtering and output-size controls. - 20, actionable, documented error responses, codes and messages an agent can recover from. - 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations. - 15, sensible defaults, few required parameters, and official SDKs in at least two languages. Models are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs. ## 3. Security & auth, 65 out of 100, up to 6.1 more on the total Why it scored 65: OAuth 2.0 with 33 scopes, PKCE for public clients, 1-hour tokens, refresh and a revoke endpoint, and user tokens bound to a permission group. API keys are revocable and sent in a header, but grant every scope and never expire (25). An OAuth app without the `write` scope is read-only and a user token inherits one employee's permissions. No confirmation step was found for terminate or bulk delete calls (13). The API returns text written by employees. The webhook guide says to treat payloads as untrusted input, and no injection guidance was found for API or MCP responses (3). The trust centre says audit logs exist and links a help centre article that our reader could not extract, so API coverage is not established (7). SOC 2 Type 2, SOC 3, ISO/IEC 27001:2022, ENS High, annual third-party penetration tests and a HackerOne bounty per the trust centre. No security.txt (17). The checklist (https://www.anchorterminal.com/benchmark/#checklist-security): - 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option. - 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions. - 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10. - 0 to 15, audit logs or per-call visibility for the operator. - 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public. Models are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing. ## 4. Schema & documentation, 77 out of 100, up to 3.7 more on the total Why it scored 77: A public OpenAPI 3.1.0 definition at `https://api.factorialhr.com/oas/` covers 615 operations and 137 webhook events (25). `llms.txt` and a Markdown twin of every page (10). Every operation has a description, but most only restate the action, such as Creates a Leave, with few saying when to use an endpoint (9). Inputs are typed with required fields and 359 enum declarations, with IDs passed as strings (11). 566 operations carry examples, but the definition documents only 200 and 201 responses and errors are explained in one FAQ table (7). Dated versions in the path and quarterly release notes that mark new and removed items (15). The checklist (https://www.anchorterminal.com/benchmark/#checklist-schema): APIs and MCP servers. - 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool). - 10, llms.txt or Markdown docs served for agents. - 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference. - 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs. - 0 to 15, examples and documented error responses. - 15, versioning and a public changelog. Models are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference. ## 5. Reliability, 88 out of 100, up to 2.4 more on the total Why it scored 88: Graded on the public REST API with the hosted lines. Statuspage at status.factorialhr.com with 14 components, API & backend among them (20). The incident feed's newest entry is 1 June 2026 (6 hours of degraded performance), so the 90 days to 8 October are clean (30). The FAQ gives one number, 200 `POST` requests a minute, and nothing for other methods (8). The docs advise exponential backoff on 429 and 5xx and a check before retrying a create, but no `Retry-After` header or idempotency key is documented (10). The trust centre publishes a 99.9 per cent monthly uptime SLA with a 5 per cent service credit, referenced from the terms (10). The API is generally available, with dated stable versions (10). The checklist (https://www.anchorterminal.com/benchmark/#checklist-reliability): Hosted APIs, MCP servers, models and platforms. - 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own). - 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so. - 15, rate limits documented with numbers. - 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved. - 10, an SLA published for any paid tier. - 10, the surface agents use is generally available, not beta or preview. Local packages, SDKs, frameworks and stdio MCP servers. - 20, installs from an official package with supported runtimes stated. - 25, a public CI and test suite, passing on the default branch. - 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered). - 15, semver discipline and breaking changes called out in a changelog. - 15, version 1.0 or later, or declared stable. Protocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors. ## 6. Transparency & trust, 78 out of 100, up to 1.9 more on the total Made of editorial 73, provenance 82. Why it scored 78: Closed service with public terms amended 12 December 2025, and MIT SDKs. Clauses 9.6 and 9.8 prohibit benchmarking, competitive evaluation and monitoring of availability (15). The terms and the trust centre agree on retention (30 days to request return of data, one year blocked for authorities, then deletion), the privacy policy of January 2026 covers Factorial's role as processor, and the trust centre says customer data is not used to train models. The DPA was not read (24). Each API version is supported for one year with dated release notes, but an expired version is served silently in an older schema, API keys for marketplace use are being phased out with no date, and the terms reserve the right to change or remove the public API (16). The trust centre lists sub-processors with purpose and location, and states EU storage on AWS Frankfurt and Azure Frankfurt and Sweden (18). The checklist (https://www.anchorterminal.com/benchmark/#checklist-transparency): - 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms. - 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors). - 0 to 20, a deprecation policy or notices with dates. - 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted). The other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two. Provenance checks not met in full (half of this category, computed from checked facts): - Domain age: factorialhr.com, registered 2016-11-10 (9 years) (11 of 15) - Terms of service: read, states 5 of the 7 things a reader expects, and has 1 clause that costs points (6.3 of 10) - Privacy policy: read, states 7 of the 8 things a reader expects (9.3 of 10) - security.txt: not found (0 of 10) ## 7. Maintenance & community, 84 out of 100, up to 1.4 more on the total Why it scored 84: API version 2026-10-01 was released on 5 October 2026, with SDK 3.0.0 the same day (30). In the 90 days before, the changelog has the MCP server on 14 July and entries on 1 and 5 October, and the SDK repository has five Python releases from 22 July to 5 October (20). A dated changelog with RSS, two support forms, a published first-response target of 4 hours for 90 per cent of tickets, and a public SDK repository whose issues we could not read (11). Current official SDKs in TypeScript and Python (15). The SDK repository has CI, release automation and npm trusted publishing, with daily beta builds for the next API version (8). The checklist (https://www.anchorterminal.com/benchmark/#checklist-maintenance): - 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older. - 20, at least three releases or dated changelog entries in the last 90 days. - 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15. - 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models). - 10, package health, current dependencies and CI. Models are read for deprecation notice periods and model churn rather than release counts. ## What we couldn't check What we couldn't read counted as absent. Publishing it on a page a plain HTTP fetch can read (not only in a browser) lets the next check count it. - unchecked: the MCP server's tool list, input schemas and annotations, which need an OAuth login - unchecked: the sign-up page at app.factorialhr.com/users/sign_up, which is drawn by script, so the trial's length and whether it needs a card are not established - unchecked: the help centre article on audit logs, whose text our reader could not extract, so whether API calls are logged is not established - unchecked: the Data Processing Agreement and the full SLA exclusions - unchecked: the official MCP registry, which did not answer from our shell - unchecked: the HackerOne programme page named in the trust centre, and open issues on the SDK repository - Whether rate limits apply to GET, PUT and DELETE requests, and whether 429 responses carry `Retry-After` - Whether API access or the MCP server depends on the plan. The pricing page does not say - The lead gave factorialhr.com as the site, which now redirects to factorial.com, and did not mention the MCP server or the SDKs ## Weaknesses - An API key grants every scope, cannot be narrowed and does not expire - No idempotency keys. The docs say the API does not deduplicate requests, so a blind retry can create a duplicate record - A request to an unsupported API version is served in the oldest supported schema with no error - The only published rate limit is 200 `POST` requests a minute, and no `Retry-After` header is documented - The terms prohibit benchmarking, competitive evaluation and monitoring of availability, and pricing beyond a $8 starting figure is by quote ## What costs an agent a turn today The notes we give agents before they call it. Each one is a workaround an agent shouldn't need. - Send an API key in `x-api-key` and an OAuth token in `Authorization: Bearer`. The key is JWT-formatted but is rejected as a bearer token - Pin the version in the path, such as `/api/2026-10-01/resources/...`, and migrate within a year. Expired versions answer in an older schema without an error - Treat a 200 with an empty body as a credential from the other environment. Production is `api.factorialhr.com` and demo is `api.eu2.demo.factorial.dev` - Page with `limit=100` and pass `meta.end_cursor` as `after_id`. A larger limit is capped at 100 - Check whether a record exists before retrying a create. Retry only 429 and 5xx with backoff, and branch on `code` for 422 because messages are localised ## When it's done Send what changed and where it's published as a dispute (https://www.anchorterminal.com/builders/#disputes, or `POST https://www.anchorterminal.com/api/v1/contact` with `"kind": "dispute"`). Disputes are answered in public, and the listing is checked again by the same checklist. Paying for an audit or a listing claim changes nothing here.
What we couldn't check
- unchecked: the MCP server's tool list, input schemas and annotations, which need an OAuth login
- unchecked: the sign-up page at app.factorialhr.com/users/sign_up, which is drawn by script, so the trial's length and whether it needs a card are not established
- unchecked: the help centre article on audit logs, whose text our reader could not extract, so whether API calls are logged is not established
- unchecked: the Data Processing Agreement and the full SLA exclusions
- unchecked: the official MCP registry, which did not answer from our shell
- unchecked: the HackerOne programme page named in the trust centre, and open issues on the SDK repository
- Whether rate limits apply to GET, PUT and DELETE requests, and whether 429 responses carry
Retry-After - Whether API access or the MCP server depends on the plan. The pricing page does not say
- The lead gave factorialhr.com as the site, which now redirects to factorial.com, and did not mention the MCP server or the SDKs
Sources 29
- developer docs index (llms.txt) apidoc.factorialhr.com · seen 2026-10-08
- getting started, environments and first call apidoc.factorialhr.com · seen 2026-10-08
- authentication methods apidoc.factorialhr.com · seen 2026-10-08
- API keys apidoc.factorialhr.com · seen 2026-10-08
- OAuth 2 token types and endpoints apidoc.factorialhr.com · seen 2026-10-08
- OAuth scopes apidoc.factorialhr.com · seen 2026-10-08
- FAQ, rate limits, errors and retries apidoc.factorialhr.com · seen 2026-10-08
- pagination apidoc.factorialhr.com · seen 2026-10-08
- API versioning apidoc.factorialhr.com · seen 2026-10-08
- production and demo environments apidoc.factorialhr.com · seen 2026-10-08
- webhook policies apidoc.factorialhr.com · seen 2026-10-08
- webhook best practices apidoc.factorialhr.com · seen 2026-10-08
- MCP server guide apidoc.factorialhr.com · seen 2026-10-08
- MCP OAuth metadata mcp.factorialhr.com · seen 2026-10-08
- SDKs guide apidoc.factorialhr.com · seen 2026-10-08
- OpenAPI definition, version 2026-10-01 api.factorialhr.com · seen 2026-10-08
- changelog feed apidoc.factorialhr.com · seen 2026-10-08
- 2026-10-01 release notes apidoc.factorialhr.com · seen 2026-10-08
- SDK repository (clone) github.com · seen 2026-10-08
- npm package registry.npmjs.org · seen 2026-10-08
- PyPI package pypi.org · seen 2026-10-08
- status incidents status.factorialhr.com · seen 2026-10-08
- status components status.factorialhr.com · seen 2026-10-08
- pricing factorial.com · seen 2026-10-08
- terms and conditions factorial.com · seen 2026-10-08
- privacy policy factorial.com · seen 2026-10-08
- trust centre (SLA, certifications, sub-processors, AI, retention) trust.factorial.co · seen 2026-10-08
- legal notice factorial.com · seen 2026-10-08
- domain registration (RDAP) rdap.org · seen 2026-10-08
Probe metrics
Not measured yet. Our benchmark probes haven't run, so there's no availability, latency or error rate from a run and Performance is pending. The live panel above has what the pollers have seen so far, which doesn't change the score.
Pricing & changes
Paid $8 / seat-mo The pricing page says Factorial starts at $8 per user per month and asks for a tailored quote for everything else. The terms describe a free trial of at most 15 days granted at Factorial's discretion, and the sign-up page is drawn by script, so its conditions were not read. The demo API environment is provisioned by an account manager, so an agent cannot start without a customer account. Factorial One requests through the MCP server consume plan credits (https://factorial.com/pricing, checked 2026-10-08).
Prices
| Item | Price | Unit | Note |
|---|---|---|---|
| Starting price | $8 | per seat per month | Headline figure on the pricing page. Plans are quoted by modules and company size |
Compared across listings on the price index.
Recent changes
- Latest release
Follow them as a feed at /feeds/tools/factorial.xml, or this listing's score history at history.json.
Connect
Install
npm install @factorialco/api-client
First request
curl --request GET \
--url 'https://api.factorialhr.com/api/2026-10-01/resources/api_public/credentials' \
--header 'accept: application/json' \
--header 'x-api-key: <api_key>'
Through letme picks today, calling later
GET https://letme.dev/factorial
letme picks this listing for recruiting.applications, because it's the top-graded tool for the job. letme picks this listing for recruiting.candidates, because it's the top-graded tool for the job. letme picks this listing for recruiting.jobs, because it's the top-graded tool for the job.
letme.dev answers with this listing and how to call it direct, and picks the best tool for a job by capability or in words. Calling through letme (one key, the vendor's own price) comes later. Nothing on letme.dev is for people to look at; this page explains it.
Compare with
BambooHR CWorkable CRippling CDeel BHiBob CZoho People C
Head to head BambooHR vs Factorial · Deel vs Factorial · Factorial vs HiBob · Factorial vs Humaans · Factorial vs Rippling · Factorial vs Zoho People
Machine-readable
| Similar tool | Grade | Score | Shared capabilities | x402 |
|---|---|---|---|---|
| BambooHR Bamboo HR LLC | C | 61.7 | hr.employees hr.time-off hr.org hr.documents recruiting.applications recruiting.jobs | no |
| Workable Workable Software Limited | C | 61.7 | recruiting.candidates recruiting.jobs recruiting.applications hr.employees hr.time-off hr.org | no |
| Rippling People Center, Inc. dba Rippling | C | 60.8 | hr.employees hr.time-off hr.org hr.documents recruiting.candidates | no |
| Deel Deel, Inc. | B | 69.1 | hr.employees hr.time-off hr.org hr.documents | no |
| HiBob Hi Bob Ltd. | C | 57 | hr.employees hr.time-off hr.org hr.documents | no |
| Zoho People Zoho | C | 55 | hr.employees hr.time-off hr.org hr.documents | no |
Machine-readable
- JSON
/api/v1/tools/factorial.json· historyhistory.json· badge/badges/factorial.svg· changes feed/feeds/tools/factorial.xml - Markdown
/tools/factorial.md· slim/tools/factorial.min.md(or sendAccept: text/markdown) - Fix list
/fixes/factorial.md·/fixes/factorial.json - From a terminal
anchor tool factorial --md(the CLI) · over MCPget_tool {"slug": "factorial"}at/mcp, no key - Directory index
/api/v1/tools.json· site index/llms.txt
Verify this listing
For the vendorIs this your product? Link to this page from your own site or README, then tell us where. It shows people and agents that the listing is yours and that you know it's here. It never changes a grade, rank or review.
-
Add the badge or a link
On a light page On a dark page <a href="https://www.anchorterminal.com/tools/factorial"><img src="https://www.anchorterminal.com/badges/factorial.svg" alt="Factorial on Anchor Terminal" height="20"></a>[](https://www.anchorterminal.com/tools/factorial)<a href="https://www.anchorterminal.com/tools/factorial">Factorial on Anchor Terminal</a>It counts on a page on factorialhr.com or factorial.com or one of their subdomains, or the README of github.com/factorialco/factorial-api-sdks.
-
Tell us where it is
We read it once now and again every week. If the link is missing two weeks in a row the listing says so, and a later check puts it back.
Agents send the same to POST /api/v1/verify as {"slug": "factorial", "url": "…"}, or call the verify_listing tool at /mcp. Ten checks an hour from one address. What we check. To announce the listing, get sharing assets for social media.


