Ever wondered how to use Kaiju’s API to be able to Bypass, Break and Own the codes just like our customers have been doing ? Here is a 3-step tutorial to master our APIs.
Kaiju: Your Ultimate Rolling Code Attack Toolkit
Kaiju is an online rolling code analyzer and generator.
It’s designed to analyze systems that use rolling codes (also known as hopping codes) like KeeLoq. You’ll find these systems in Remote Keyless Entry (RKE) devices, including key fobs for gates, garage doors, cars, and home/car alarm systems.
One ultimate API to Connect Them All!
Kaiju comes with a REST API that can offer multiple services such as:
- Request detailed Rolling Code analysis
- Request Keeloq Secure Decrypt analysis (for seed based devices)
- Request for Flipper Zero sub file analysis
- Request for Software Defined Radio I/Q file analysis
- Generate Rolling codes from already captured data or from scratch with specific parameters
- Generate Flipper Zero SubGHz Key / Raw file corresponding to a given rolling code
And many more exclusive benefits that can be of use in different projects from Brute-Forcing & Reverse Engineering to RF Analysis & Replay Attacks.
Step 1: Getting API Access
By creating an account on Kaiju, you can automatically find a private API token on your profile page. The token allows making API calls to different endpoints according to the license/plan you have subscribed for.

DISCLAIMER: Your API Token is secure. Never expose it to anyone or anywhere in public repositories!
Step 2: Understanding the API Endpoints
Our ever-improving API Swagger Documentation is the perfect starting point for exploring the API endpoints. You can discover the supported parameters, responses, and status codes by providing your token (Authorize) or logging in to your account (Login):

You can also test the API directly from the browser by clicking on the Try it Out section for each endpoint, providing the necessary data and executing the call.
Step 3: Making Your First API Call
In this example, we are calling the /api/v1/generate/capture endpoint that generates rolling codes from captured data (binary/hexadecimal/duration):
Let’s make a simple request to get a detailed rolling code analysis using the cURL command and a rawDuration stream:
curl --location 'https://rolling.pandwarf.com/api/v1/analyze/detailed' \
--header 'Authorization: Replace_with_API_Token' \
--data '{
"rawDurationStream": "400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 4400 400 800 800 400 ... 800 800 400 800 400 800 400 400"
}'
Note: rawDurationStream has been reduced to fit in this post. You can find samples here.
If the API Token and the data submitted are correct, the API returns a 201 status code and a JSON Response:
{
"user": "user@email.com",
"id": "remote_uuid", <== Here a unique remote UUID is provided
"name": "kaiju_compute_analyze_detailed",
"status": "scheduled",
"progress": 0,
"complete": false,
"failedReason": "",
"resultType": "analyze/detailed",
"enqueuedAt": "2025-06-05T13:03:10.587932Z",
"startedAt": null,
"endedAt": null,
"queue": "high",
"kaijuVersionUsed": "v617",
"origin": "API",
"pandwaRfProduct": ""
}
It is also possible to call this API endpoint using Binary or Hexadecimal captured data.
Now we can view the remote created using the device/{task} API endpoint using the cURL command:
curl --location 'https://rolling.pandwarf.com/api/v1/device/remote_id' \
--header 'Authorization: Token <your_api_token>'
The 201 status code Response returns a detailed information for the remote, such as it being a Gate Opener from the brand Nice and a MHouse model :
{
"task": {
"user": "user@email.com",
"id": "remote_uuid", <== Use the unique remote UUID provided in the analysis response
"name": "kaiju_compute_analyze_detailed",
"status": "finished",
"progress": 100,
"complete": true,
"failedReason": "",
"resultType": "analyze/detailed",
...
"kaijuVersionUsed": "v617",
"origin": "API",
"pandwaRfProduct": ""
},
"rxTxConfig": {
"frequency": null,
"samplingRate": 1000000,
"modulation": null,
"modulationName": "Unknown",
"channelBandwidth": null,
"deviation": null,
"rxFrameCompressionEnabled": null,
"rawHexStream": "",
"rawBitStream": "10101010101010101010000000000010011010011011010010011011010010011010011010011011010011010011011010010 ... 001101101001001101101101001101001101001101001001001101101101101001101101101101101001101101101",
"rawDurationStream": "400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 4400 400 800 800 400 ... 400 800 400 800 400 400 800 800 400 800 400 800 400 400",
"createdAt": "2025-06-05T13:03:10.573317Z",
"sectorId": null,
"capturedAt": null,
"session": ""
},
"generatedTxConfig": {
"frequency": 433912000,
"dataRate": 2500,
"modulation": 48,
"modulationName": "ASK_OOK",
"deviation": 0
},
"remoteData": {
"name": "",
"manufacturerCodeId": "MC006",
"type": "Gate Opener",
"brand": "Nice",
"model": "MHouse",
"serialNumberHex": "0x0875465",
"syncCounter": 96,
"fixedPartHex": "0x220875465",
"plainTextHex": "",
"cipherTextHex": "0x25CA5665",
"buttonStatus": 2,
"buttonValue": 1,
"buttonInfo": {
"min": 1,
"max": 4
},
"syncCounterInfo": {
"min": 0,
"max": 65535
},
"encoder": "PWM 198",
"cipher": "KeeLoq",
"locked": false,
"rollingCodes": [],
"imageUrl": "https://rolling.pandwarf.com/static/assets/images/remotes/gate_opener/ic_remote_mhouse_unknown.png",
"comment": "",
...
"rollingCodePossible": {
"eligible": true,
"message": "Rolling codes generation is available."
}
}
}
Note: rawBitStream & rawDurationStream has been reduced to fit in this post.
Now, we can add more rolling codes to this remote using the add/rolling-code API endpoint:
curl --location 'https://rolling.pandwarf.com/api/v1/add/rolling-code' \
--header 'Authorization: Token Replace_with_API_Token' \
--data '{
"rollingCodeAddition": {
"remoteInfo": "remote_uuid", <== Use the unique remote UUID provided in the analysis response
"syncCounter": 300, <== Specify what sync counter and button you want to generate
"button": 4,
"numCodesRequested": 3
}
}'
If the remote UUID is correct, the API returns a 200 status code and a JSON Response confirming the success of the task:
{
"user": "user@email.com",
"id": "add_rolling_codes_task_uuid",
"name": "kaiju_compute_add_rolling_codes_to_remote",
"status": "scheduled",
"progress": 0,
"complete": false,
"failedReason": "",
"resultType": "add/rolling-code",
"enqueuedAt": "2025-06-05T13:23:30.572233Z",
"startedAt": null,
"endedAt": null,
"queue": "high",
"kaijuVersionUsed": "v617",
"origin": "API",
"pandwaRfProduct": ""
}
Finally, we can call the device/{task} endpoint again with remote_id, to retrieve the updated remote information.
In the previous API call, the list of rolling codes was empty but now it contains the 10 added roling codes to the remote:
{
"task": {
"user": "user@email.com",
"id": "remote_uuid",
"name": "kaiju_compute_analyze_detailed",
"status": "finished",
...
},
"rxTxConfig": {
...
},
"generatedTxConfig": {
...
},
"remoteData": {
...
"rollingCodes": [
{
"syncCounter": 300,
"button": 4,
"dataHex": "AAAAA0036D34926D349269349A69A49A69B49B69A69A49B6D36DA69360",
"fullMsgHex": "AAAAA0036D34926D349269349A69A49A69B49B69A69A49B6D36DA693600000002AAAA800DB4D249B4D249A4D269A69269A6D26DA69A6926DB4DB69A4D80000000AAAAA0036D34926D349269349A69A49A69B49B69A69A49B6D36DA693600000002AAAA800DB4D249B4D249A4D269A69269A6D26DA69A6926DB4DB69A4D80000000AAAAA0036D34926D349269349A69A49A69B49B69A69A49B6D36DA693400000002AAAA800DB4D249B4D249A4D269A69269A6D26DA69A6926DB4DB69A4D000000000",
"status": "NOT_USED"
},
{
"syncCounter": 301,
"button": 4,
"dataHex": "AAAAA0034926DA4934DB6DB69A69269A69B49B69A69A49B6D36DA69360",
"fullMsgHex": "AAAAA0034926DA4934DB6DB69A69269A69B49B69A69A49B6D36DA693600000002AAAA800D249B6924D36DB6DA69A49A69A6D26DA69A6926DB4DB69A4D80000000AAAAA0034926DA4934DB6DB69A69269A69B49B69A69A49B6D36DA693600000002AAAA800D249B6924D36DB6DA69A49A69A6D26DA69A6926DB4DB69A4D80000000AAAAA0034926DA4934DB6DB69A69269A69B49B69A69A49B6D36DA693400000002AAAA800D249B6924D36DB6DA69A49A69A6D26DA69A6926DB4DB69A4D000000000",
"status": "NOT_USED"
},
{
"syncCounter": 302,
"button": 4,
"dataHex": "AAAAA00269A49A4DB49269A4DB4D269269B49B69A69A49B6D36DA69360",
"fullMsgHex": "AAAAA00269A49A4DB49269A4DB4D269269B49B69A69A49B6D36DA693600000002AAAA8009A6926936D249A6936D349A49A6D26DA69A6926DB4DB69A4D80000000AAAAA00269A49A4DB49269A4DB4D269269B49B69A69A49B6D36DA693600000002AAAA8009A6926936D249A6936D349A49A6D26DA69A6926DB4DB69A4D80000000AAAAA00269A49A4DB49269A4DB4D269269B49B69A69A49B6D36DA693400000002AAAA8009A6926936D249A6936D349A49A6D26DA69A6926DB4DB69A4D000000000",
"status": "NOT_USED"
}
],
"imageUrl": "https://rolling.pandwarf.com/static/assets/images/remotes/gate_opener/ic_remote_mhouse_unknown.png",
...
"rollingCodePossible": {
"eligible": true,
"message": "Rolling codes generation is available."
}
}
}
There are several ways to use our API:
- Directly through Kaiju API Swagger Documentation in the Try it Out section for each endpoint
- Using cUrl commands in a terminal, as shown above
- Using the requests library in Python
- Using Postman
Conclusion
Now you’re ready to integrate the Kaiju API into your projects! For further details, visit our Kaiju API Swagger Documentation or reach out to our support team. Happy rolling!