Extending the WHMCS API and Fetching Invoice PDF’s

At work, we’re currently doing a FULL rebuild of our customer portal.  Part of the requirements of the system are that our staff must only be logging into one place.  At present they have to be logged into the portal AND WHMCS.  So in v2, we have to basically rebuild 90% of the WHMCS admin interface into our portal, and use the WHMCS API for manipulating data stored in WHMCS.  (We’re also adding a MongoDB caching layer for read access, and then using hooks in WHMCS to update the cache whenever data is modified).

We found a few ‘holes’ (read: missing functionality) in the WHMCS API, so had to see about adding an API to sit alongside WHMCS.  We did ask WHMCS how to go about writing custom API functions to use within the WHMCS API framework, but they came back saying this was not possible.  A fair bit of Googling around, and I managed to find a blog post detailing how to write custom API functions for WHMCS.  With a bit of work, we now have a nice basis for writing WHMCS API modules.  The first one I built for testing was for pulling Invoice PDF’s, which is not currently available in the WHMCS API.

And Voila, a simple WHMCS call such as:

Returned Variables

Then it’s a simple matter to go base64_decode($jsondata->pdf) (assuming you used json format and had done a json_decode() on the returned data…), and you have the binary data for the PDF, ready to save to disk, or pass back out to the user via HTTP.


12 Responses

You can follow any responses to this entry through the RSS 2.0 feed.

You can leave a response, or trackback from your own site.

  1. WHMCSLover says:


  2. Brano says:

    Hi, use your code but Im getting this error:

    Fatal error: Cannot redeclare getinvoicestatuscolour() in /xyxxxxxx/includes/invoicefunctions.php on line 6291459

    Can you help me please, how to solve it?

    • It may be that invoicefunctions is being included with the API functions automatically these days. Try changing the require line to look like this instead:

      if (!function_exists(‘getinvoicestatuscolour’)) {

  3. Douglas says:

    Hi Damien, I’m getting “No input file specified.”

    When I browse /includes/api.php this is returned, and also my curl_exec says the same.

    Any clues?

  4. Gianpaolo says:

    Sorry to bump an old thread guys,

    I am beside myself that this functionality isn’t included in WHMCS by default, but I guess that’s how it is.

    I know I only need certain parts of the code because I’m only going to be using it in remote API mode. I’m going to be running it on the fly when someone logs into their “My Account” portal on my own page. So I don’t need to cache the page, but I suppose I could launch a popup with the PDF file rendered inside if a customer was to click on the show invoice button.

    I’m a bit confused with the way that you pass the params,etc ?

    Was the API still a CURL API when this was written??

    What would I have to change to get it to work with v 7.3

    Any help is greatly appreciated.

    I’m glad i’ve found someone who took the time to write the script so that this vital functionality is now available.


    • Hey Gianpaolo,

      I’m just working on upgrading our work WHMCS from 6.1.x to 7.7 now, and this API code is working with the _POSTbackup modification which Andrew suggested (now included in the main post) 🙂

      I’m not sure what you mean by ‘still a CURL API when this was written?’ as the access method for the API hasn’t changed at all that I can see, unless you’ve changed over from username/password to apitoken. But that’s a whole different kettle of fish, which I’ll look at in a few weeks. As it is, the existing API authentication works perfectly.

      We have ~70 custom API calls in our WHMCS install, and I have been dreading the upgrade, but it was actually fairly simple 🙂

  5. Andrew says:

    for versions 7+ use _POSTbackup
    and use username and password instead of API secret and API key as they require access control now

Leave a Reply