Perfex CRM GraphQL API: Query Custom Module Data in One Request
How a Perfex CRM GraphQL API queries native and custom module tables in one request, plus an honest look at when REST is the better choice.
CRM data is relational to its core. A customer links to invoices, invoices link to payments, projects link to tasks and tickets, and the moment you install third-party modules, entirely new tables join that web. If you have ever tried to pull a complete picture of a single customer out of Perfex through a conventional API, you know the routine: one request per resource, then stitching the results together in your own code. That mismatch between deeply connected data and resource-per-endpoint design is exactly what a Perfex CRM GraphQL API is built to fix, and it is what this article digs into.
Full disclosure: we build and sell the module discussed here. It is the sibling of our REST API module for Perfex CRM, and we will be upfront about when the REST option is the better pick, because it genuinely is sometimes. The aim is that you leave with a clearer sense of how GraphQL maps onto CRM data, whether or not you ever buy anything from us.
Why CRM data fits GraphQL
REST APIs typically operate through predefined endpoints, each representing one resource. That structure is easy to reason about, but it gets awkward when the client needs data from several resources at once. You end up with one of two classic problems:
- Over-fetching: an endpoint returns more data than the client needs, because the response shape is fixed on the server.
- Under-fetching: no single endpoint returns enough, so the client makes multiple round trips and assembles the picture itself.
Fetching a customer’s information along with their recent orders is the textbook case. Over REST, that usually means separate calls to a customers resource and an orders resource, then joining the results client-side. Over GraphQL, the client asks for exactly the fields it needs across both entities and receives them in a single response from a single endpoint. Fewer requests, less wasted transfer, and the joining logic lives in the query instead of your application code.
CRM data makes this difference bigger than usual, because almost nothing in a CRM stands alone. Reports, dashboards, and sync jobs nearly always want a slice that spans related entities. A strongly-typed schema also gives frontend and backend developers a shared, explicit picture of what data exists and how it connects, which shortens the conversation every time an integration changes.
What the Perfex CRM GraphQL API module does
The module adds a single unified GraphQL endpoint to a Perfex CRM installation. Through that one endpoint you can query every database table, field, and option in the install, so the integration is never boxed in by whatever subset the base CRM chooses to expose.
It is not read-only. The API supports the write operations an external system needs to keep itself and Perfex in step: adding a record, updating an existing record, and deleting a record. Queries can also be limited by record id, which keeps responses lean and predictable in production. That id-based limiting (id_in) arrived in version 1.0.1 alongside a round of security enhancements, so it is worth running the current release.
To shorten the ramp-up, the module ships with example queries organized per programming language and per method, and there is complete online documentation for building your own connections. Installation itself takes a few seconds: install, activate, and the endpoint is working. Compatibility covers PHP 7.x and PHP 8.x on CodeIgniter, the stack Perfex CRM runs on.
For provenance: the module has 67 sales on CodeCanyon and holds a 4.80/5 from 5 verified CodeCanyon reviews.
Custom module tables are where it earns its keep
Here is the part that matters most for real-world Perfex installs. Very few production deployments run a vanilla CRM. The Perfex ecosystem is full of third-party modules from different authors, and many of them create their own tables and fields. Those tables hold data your business depends on, but they are invisible to any API that only covers the core schema.
This module treats non-native tables as first-class citizens. You can query every table, field, and option created by third-party modules through the same GraphQL interface you use for native Perfex data. If a module you installed adds unique fields or drives a custom workflow, that information is reachable the same way client records are.
The practical consequence is that cross-entity reporting stops being a special project. A query can span native entities and custom module data in one request, which is exactly what analytics dashboards, data sync jobs, and operational tooling want. And because the architecture is designed to stay compatible with existing modules, the API keeps pace as your install grows instead of freezing your integration at whatever the core CRM exposed on day one.
One note on examples: we are deliberately not pasting query syntax into this article. Working requests live in the module’s per-language examples and its online documentation, and copying real, current examples from there beats adapting snippets from a blog post that may age.
When REST is the better pick
An honest comparison cuts both ways, so here it is.
If your integration touches a single resource in a fixed, predictable shape - push a new lead in, pull a list of invoices out on a schedule - REST is simpler and entirely sufficient. There is no join problem to solve, so GraphQL’s main advantage never comes into play. The same goes for teams already fluent in REST conventions, with client code, logging, and habits built around them: the switching cost is real, and a working REST integration is worth more than a theoretically cleaner one.
GraphQL wins when the questions you ask the CRM span related entities, when response size matters because clients are bandwidth-constrained or response times are critical, or when the data you need lives partly in custom module tables that a fixed set of endpoints was never designed to expose.
We sell both. The REST API module for Perfex CRM is the companion product, and picking it over the GraphQL module is sometimes the right call. We would rather you choose the fit than the newer acronym.
Honest limits
A few things this module will not do for you. It does not remove the GraphQL learning curve: if your team has never written a GraphQL query, budget time for that, and if you are not familiar with APIs at all, it is genuinely worth hiring an expert to build the connection rather than fighting through it alone. Full-database reach is also a responsibility as much as a feature: an API that can read and write every table deserves careful thought about who holds the credentials and what your integration actually needs to touch. And the module is young - version 1.0.1, updated 2026-05-04, with a review base that is still small - which is worth weighing if you only adopt tools with a long public track record.
Key facts
| Fact | Detail |
|---|---|
| Current version | 1.0.1 |
| Last updated | 2026-05-04 |
| Compatibility | PHP 7.x, PHP 8.x, CodeIgniter |
| Operations | Query, add, update, delete records |
| Scope | All tables and fields, including third-party module tables |
| Query control | Limit results by record id (id_in) |
| Track record | 67 sales on CodeCanyon, 4.80/5 from 5 verified reviews |
Links
Building an integration and unsure which of the two APIs fits your case? Describe it in the comments and we will give you a straight answer.
A copy of this article is also published on dev.to, where the comments are open.