jBackend for Joomla 3.0
The Menu Module is implemented with the plg_jbackend_menu plugin. It provides functions related to Joomla menus (com_menus). Here is the list of supported methods.
action=get module=menu resource=menus limit=<L> (optional) offset=<O> (optional) orderby=<field> (optional) orderdir=<dir> (optional)
<end-point>?action=get&module=menu&resource=menus&limit=<L>&offset=<O>
<end-point>/get/menu/menus?limit=<L>
{ "status": "ok", "total": <total items>, "limit": <pagination limit>, "offset": <pagination offset>, "pages_current": <current page>, "pages_total": <total pages>, "menus": [ { "id": "<menu id>", "menutype": "<menu type>", "title": "<menu title>", "description": "<menu description>", "count_published": "<total published>", "count_unpublished": "<total unpublished>", "count_trashed": "<total trashed>" }, ... { "id": "<menu id>", "menutype": "<menu type>", "title": "<menu title>", "description": "<menu description>", "count_published": "<total published>", "count_unpublished": "<total unpublished>", "count_trashed": "<total trashed>" } ] }
action=get module=menu resource=menus id=<N>
<end-point>?action=get&module=menu&resource=menus&id=<N>
<end-point>/get/menu/menus/<N>
{ "status": "ok", "id": "<menu id>", "menutype": "<menu type>", "title": "<menu title>", "description": "<menu description>" }
action=get module=menu resource=items menutype=<menutype> parentid=<R> (optional) level=<E> (optional) limit=<L> (optional) offset=<O> (optional) orderby=<field> (optional) orderdir=<dir> (optional)
<end-point>?action=get&module=menu&resource=items&menutype=<menutype>&orderby=<field>&orderby=<dir>
<end-point>/get/menu/items?menutype=<menutype>
{ "status": "ok", "total": <total items>, "limit": <pagination limit>, "offset": <pagination offset>, "pages_current": <current page>, "pages_total": <total pages>, items: [ { "id": "<article id>", "menutype": "<menu type>", "title": "<title>", "alias": "<alias>", "note": "<note>", "path": "<path>", "link": "<link>", "type": "<type>", "parent_id": "<parent id>", "level": "<level>", "component_id": "<component id>", "browserNav": "<browserNav>", "access": "<access>", "img": "<img>", "template_style_id": "<template style id>", "home": "<home>", "language": "<language>", "client_id": "<client id>", "language_title": "<language title>", "image": "<image>", "componentname": "<component name>", "access_level": "<access level>", "name": "<component name>" }, ... { ... } ] }
The Push Module is implemented with the plg_jbackend_push plugin. It provides functions related to mobile push notifications for iOS and Android. Here is the list of supported methods.
The register function must be called by mobile apps each time they get a notification token from the push service (e.g. APNs or FCM) to register the device on jBackend. Registration is needed to send push notifications to the app on the registered device.
action=put module=push resource=register token=<token> appcode=<appcode> platform=<platform> user_id=<user_id> (optional) user_email=<user_email> (optional) ios_alert=<true or 1> (optional) ios_badge=<true or 1> (optional) ios_sound=<true or 1> (optional)
<end-point>?action=put&module=push&resource=register&token=<token>&appcode=<appcode>&platform=ios
<end-point>/put/push/register?token=<token>&appcode=<appcode>&platform=android
{ "status": "ok", "token": "<token>", "appcode": "<appcode>", "platform": "<generic|android|ios>", "platform_code": <platform_code>, "app_id": "<app_id>", "device_id": <device_id>, "ios_alert": <0|1>, "ios_badge": <0|1>, "ios_sound": <0|1> }
Supported platform codes are 0=Generic, 1=Android, 2=iOS.
It is possible to associate an existing Joomla user to the device with the user_id param. If the plugin option Require user email is enabled, it is also needed to include the user_email field, and the email must match with the registered email address for the user with the specified user_id.
On iOS platform the app can also send (optionally) its notification settings for alert (ios_alert), badge (ios_badge), and sound (ios_sound). These values can be used to filter target devices when sending push notifications from jBackend.
The scheduler function must be called on a regular basis (e.g. from a crontab) to trigger the sending of scheduled push notifications.
action=get module=push resource=scheduler
<end-point>?action=get&module=push&resource=scheduler
<end-point>/get/push/scheduler
{ "status": "ok", "batch_size": <N>, "sent": <T>, "success": <S>, "failure": <F> }
Sent is the total number of processed notifications.
This function allows to create a push notification programmatically (i.e. add a notification to the queue).
action=post module=push resource=notifications title=<title> message=<message> app_code=<app_code> platform=<platform> target=<target> target_users=<target_users> target_groups=<target_groups> target_devices=<target_devices> scheduled_time=<scheduled_time> payload=<payload> (optional) context=<context> (optional) auth_token=<auth_token> (optional)
<end-point>?action=post&module=push&resource=notifications&title=<title>&message=<message>&app_code=<code>&platform=1&target=0&scheduled_time=2016-11-13%2000:15:31
<end-point>/post/push/notifications?title=<title>&message=<message>&app_code=<code>&platform=1&target=0&scheduled_time=2016-11-13%2000:15:31
{ "status": "ok" }
Supported platform codes are 0=Generic, 1=Android, 2=iOS.
Supported target codes are 0=All, 1=Selected users, 2=Selected groups, 3=Selected devices.
Params target_users, target_groups and target_devices are comma separated list of id.
Scheduled time format is YYYY-MM-DD HH:MM:SS (e.g. 2016-07-23 00:19:11).
Params payload and context can be a string or a json.
The following options are available for push plugin:
Option | Description |
Auto app registration | Allow automatic creation of new applications by code. |
Require user email | Require the user email to add the user id when register a device (as a security measure). |
JSON Register | Enable JSON payload on register action. |
JSON Notifications | Enable JSON payload on add notification action. |
Protect Notifications | Enable token protection on add notification action. |
Authorization Token | The token that enables the add notification action. |
Batch size | Number of push messages to send out each batch job. |
Log notifications | Enable logging of all notifications in a dedicated database table (useful for analytics purposes). |
FCM URL | URL of Firebase Cloud Messaging server. |
API key | Google API key. |
Use FCM | Use FCM to send push messages on iOS too. |
APNs URL | URL of Apple APNs server. |
Timeout | APNs connection timeout. |
The Content Module is implemented with the plg_jbackend_content plugin. It provides functions related to Joomla content (articles and categories). Here is the list of supported methods.
action=get module=content resource=categories rootid=<R> (optional) recursive=<true or 1> (optional) countitems=<true or 1> (optional)
<end-point>?action=get&module=content&resource=categories&rootid=<R>&recursive=<false>&countitems=<0>
<end-point>/get/content/categories?rootid=<R>
{ "status": "ok", "total": <T>, "categories": [ { "id": "<category id>", "title": "<category title>", "description": "<category description>", "parent_id": "<parent category id>", "numitems": <items count> }, ... { "id": "<category id>", "title": "<category title>", "description": "<category description>", "parent_id": "<parent category id>", "numitems": <items count> } ] }
If rootid is specified, starts to get subcategories from the specified category id instead of the root category. If recursive is true or 1, get categories and all subcategories, otherwise get only one level (default). If countitems is true or 1, return the number of articles of each category, otherwise do not return this information (default). Category id can be "root" for root node.
action=get module=content resource=categories id=<N>
<end-point>?action=get&module=content&resource=categories&id=<N>
<end-point>/get/content/categories/<N>
{ "status": "ok", "id": "<category id>", "title": "<category title>", "alias": "<category alias>", "description": "<category description>", "metadesc": "<meta description>", "metakey": "<meta keywords>", "metadata": { "page_title": "<meta title>", "author": "<meta author>", "robots": "<meta robots>" }, "language": "<language code>", "parent_id": "<category id>", "level": "<category level>", "numitems": "<N>" }
Language can be "*" if any. Category id can be "root" for root node.
action=get module=content resource=articles catid=<C> (optional) maxsubs=<S> (optional) featured=<F> (optional) limit=<L> (optional) offset=<O> (optional) orderby=<field> (optional) orderdir=<dir> (optional)
<end-point>?action=get&module=content&resource=articles&catid=<C>&maxsubs=<S>&featured=<F>&orderby=<id>
<end-point>/get/content/articles?catid=<C>&limit=<L>&offset=<O>
{ "status": "ok", "total": <total articles>, "limit": <pagination limit>, "offset": <pagination offset>, "pages_current": <current page>, "pages_total": <total pages>, "articles": [ { "id": "<article id>", "title": "<article title>", "alias": "<article alias>", "featured": "<featured>", "content": "<article content>", "catid": "<article category id>", "images": { "image_intro": "<image_url_for_intro>", "float_intro": "<float_side_for_intro>", "image_intro_alt": "<alt_text_for_intro>", "image_intro_caption": "<caption_for_intro>", "image_fulltext": "<image_url_for_fulltext>", "float_fulltext": "<float_side_for_fulltext>", "image_fulltext_alt": "<alt_text_for_fulltext>", "image_fulltext_caption": "<caption_for_fulltext>" }, "tags": [ { "id": "<tag id>", "title": "<tag title>", "alias": "<tag alias>", "language": "<tag language>" }, ... ], "fields": [ { "id": "<field id>", "title": "<field title>", "name": "<field name>", "type": "<field type>", "default_value": "<default value>", "group_id": "<field group id>", "label": "<field label>", "description": "<field description>", "required": "<field required>", "value": "<field value>", "rawvalue": "<field raw value>" }, ... ], "metakey": "<meta keywords>", "metadesc": "<meta description>", "metadata": { "robots": "<meta robots>", "author": "<meta author>", "rights": "<meta content rights>", "xreference": "<meta external reference>" }, "language": "<language code>", "category_title": "<category title>", "category_alias": "<category alias>", "author": "<article author>", "created_date": "<created date>", "modified_date": "<modified date>", "published_date": "<publish up date>", "unpublished_date": "<publish down date>", "state": "<article state>" }, ... { ... } ] }
State:
Max subs:
Number of subcategories to include (default 0=none)
Featured:
hide,only,show (default)
Order by:
id, title, alias, catid, state, created, created_by, ordering (default), hits
Order dir:
asc (default), desc
Dates are in ISO 8601 format (e.g 2017-05-11T10:16:32+00:00)
Property content is present only if plugin's option Content in article list is set.
Property tags is present only if plugin's option Add tags in article list is set.
Property fields is present only if plugin's option Prepare content in article list is set.
action=get module=content resource=articles id=<N>
<end-point>?action=get&module=content&resource=articles&id=<N>
<end-point>/get/content/articles/<N>
{ "status": "ok", "id": "<article id>", "title": "<article title>", "alias": "<article alias>", "featured": "<featured>", "introtext": "<article intro text>", "content": "<article content>", "content_raw": "<article content raw>", "catid": "<article category id>", "images": { "image_intro": "<image_url_for_intro>", "float_intro": "<float_side_for_intro>", "image_intro_alt": "<alt_text_for_intro>", "image_intro_caption": "<caption_for_intro>", "image_fulltext": "<image_url_for_fulltext>", "float_fulltext": "<float_side_for_fulltext>", "image_fulltext_alt": "<alt_text_for_fulltext>", "image_fulltext_caption": "<caption_for_fulltext>" }, "tags": [ { "id": "<tag id>", "title": "<tag title>", "alias": "<tag alias>", "language": "<tag language>" }, ... ], "associations": [ ], "event": { "afterDisplayTitle": "<after display title>", "beforeDisplayContent": "<before display content>", "afterDisplayContent": "<after display content>" }, "fields": [ { "id": "<field id>", "title": "<field title>", "name": "<field name>", "type": "<field type>", "default_value": "<default value>", "group_id": "<field group id>", "label": "<field label>", "description": "<field description>", "required": "<field required>", "value": "<field value>", "rawvalue": "<field raw value>" }, ... ], "cck_fields": [ ], "metakey": "<meta keywords>", "metadesc": "<meta description>", "metadata": { "robots": "<meta robots>", "author": "<meta author>", "rights": "<meta content rights>", "xreference": "<meta external reference>" }, "language": "<language code>", "category_title": "<category title>", "category_alias": "<category alias>", "author": "<article author>", "parent_id": "<parent id>", "parent_title": "<parent title>", "parent_alias": "<parent alias>", "parent_route": "<parent route>", "created_date": "<created date>", "modified_date": "<modified date>", "published_date": "<publish up date>", "unpublished_date": "<publish down date>", "version": "<article version>", "hits": "<article hits>", "rating": "<article rating>", "rating_count": "<article rating count>", "state": "<article state>" }
State:
Dates are in ISO 8601 format (e.g 2017-05-11T10:16:32+00:00)
Language can be "*" if any.
Property content_raw is present only if plugin's option Include content raw is set.
Property event is present only if plugin's option Show article event is set.
Property cck_fields is present only if plugin's option Include CCK is set.
action=get module=content resource=tagarticles tagid=<T1,T2,...,Tn> limit=<L> (optional) offset=<O> (optional)
<end-point>?action=get&module=content&resource=tagarticles&tagid=<T>&limit=<L>&offset=<O>
<end-point>/get/content/tagarticles?tagid=<T>&limit=<L>&offset=<O>
{ "status": "ok", "total": <total articles>, "limit": <pagination limit>, "offset": <pagination offset>, "pages_current": <current page>, "pages_total": <total pages>, articles: [ { "id": "<article id>", "title": "<article title>", "alias": "<article alias>", "featured": "<featured>", "content": "<article content>", "images": { "image_intro": "<image_url_for_intro>", "float_intro": "<float_side_for_intro>", "image_intro_alt": "<alt_text_for_intro>", "image_intro_caption": "<caption_for_intro>", "image_fulltext": "<image_url_for_fulltext>", "float_fulltext": "<float_side_for_fulltext>", "image_fulltext_alt": "<alt_text_for_fulltext>", "image_fulltext_caption": "<caption_for_fulltext>" }, "tags": [ { "id": "<tag id>", "title": "<tag title>", "alias": "<tag alias>", "language": "<tag language>" }, ... ], "metadesc": "<meta description>", "metakey": "<meta keywords>", "metadata": { "robots": "<meta robots>", "author": "<meta author>", "rights": "<meta content rights>", "xreference": "<meta external reference>" }, "category_title": "<category title>", "author": "<article author>", "published_date": "<article date>" }, ... { ... } ] }
Dates are in ISO 8601 format (e.g 2017-05-11T10:16:32+00:00)
action=get module=content resource=articlebyalias id=<alias>
<end-point>?action=get&module=content&resource=articlebyalias&id=<alias>
<end-point>/get/content/articlebyalias/<alias>
Same response as "Get an article"
Same notes as "Get an article".
The following options are available for user plugin:
Option | Description |
Filter language | Filter content by language. |
Status | Filter content by state. |
Access archived articles | Allow get article on archived items. |
Grant access | Skip access permissions check and allow access to articles. |
Full image URL | Generate absolute URL (i.e. with domain) for images fields. |
Force full image URL in content | Try to replace relative image URL in content with absolute URL. |
Add tags in article list | Include article tags in the list of articles. |
Prepare content in article list | Call onContent events on each article in the list of articles. |
Content in article list | Include full content in the list of articles. |
Show article event | Include results of events in the article response. |
Include content raw | Include raw content (no content plugin) in the article response. |
Include CCK | Include SEBLOD CCK custom fields in the article response. |
The User Module is implemented with the plg_jbackend_user plugin. It provides functions related to Joomla users and ACL. Here is the list of supported methods.
action=post module=user resource=login username=<username> password=<password>
<end-point>?action=post&module=user&resource=login&username=<username>&password=<password>
<end-point>/post/user/login?username=<username>&password=<password>
{ "status": "ok", "userid": <userid>, "username": "<username>", "session_id": "<session_id>" }
action=get module=user resource=logout
<end-point>?action=get&module=user&resource=logout
<end-point>/get/user/logout
{ "status": "ok" }
action=post module=user resource=register username=<username> password=<password> email=<email> firstname=<firstname> lastname=<lastname>
<end-point>?action=post&module=user&resource=register&username=<username>&password=<password>&email=<email>&firstname=<firstname>&lastname=<lastname>
<end-point>/post/user/register?username=<username>&password=<password>&email=<email>&firstname=<firstname>&lastname=<lastname>
{ "status": "ok" }
Sends an email to the user's account with a password remind link.
action=get module=user resource=remind email=<email>
<end-point>?action=get&module=user&resource=remind
<end-point>/get/user/remind
{ "status": "ok" }
Sends an email to the user's account with a password reset link.
action=get module=user resource=reset email=<email>
<end-point>?action=get&module=user&resource=reset
<end-point>/get/user/reset
{ "status": "ok" }
action=get module=user resource=profile
<end-point>?action=get&module=user&resource=profile
<end-point>/get/user/profile
{ "status": "ok", "fields": [ { "id": "<id>", "title": "<title>", "name": "<name>", "language": "<language>", "type": "<type>", "default_value": "<default value>", "context": "<context>", "group_id": "<group id>", "label": "<label>", "description": "<description>", "required": "<required>", "language_title": "<language title>", "language_image": "<language image>", "group_title": "<group title>", "value": "<value>", "rawvalue": "<raw value>" }, ... ], "_errors": [<_errors>], "groups": { "<groupid>": "<groupid>" ... }, "id": "<id>", "name": "<name>", "username": "<username>", "email": "<email>", "block": "<block>", "sendEmail": "<sendEmail>", "registerDate": "<registerDate>", "lastvisitDate": "<lastvisitDate>", "activation": "<activation>", "params": { "admin_style": "<admin_style>", "admin_language": "<admin_language>", "language": "<language>", "editor": "<editor>", "helpsite": "<helpsite>", "timezone": "<timezone>" }, "lastResetTime": "<lastResetTime>", "resetCount": "<resetCount>", "otpKey": "<otpKey>", "otep": "<otep>", "requireReset": "<requireReset>", "tags": { "typeAlias": <typeAlias>, "tags": "<tags>" } }
Allows to update the user profile (user must be authenticated). The requests must use the POST method with a JSON payload.
action=put module=user resource=profile
POST <end-point>?action=put&module=user&resource=profile
POST <end-point>/put/user/profile
{ "name": "<name>", "username": "<username>", "password": "<password>", "email": "<email>", "profile": { "city": "<city>" ... }, "com_fields": { "field-1": "<value 1>", "field-2": "<value 2>" ... } }
{ "status": "ok" }
Allows to check the current status of the user (guest or logged in), and provides some additional information.
action=get module=user resource=status
<end-point>?action=get&module=user&resource=status
<end-point>/get/user/status
{ "status": "ok", "is_guest": <0 or 1>, "user_id": "<user_id>", "session_id": "<session_id>", "session_expire": <session_expire> }
The following options are available for user plugin:
Option | Description |
Auto activate | Automatically activate users on registration and skip any notification email. |
Extended auth request | Process register, remind and reset as an authentication request (i.e. these requests can bypass the access restrictions on the endpoint). |
Extended fields | Enable support for additional fields in the registration. |
External libraries | List of paths (relative to JPATH_SITE) of external libraries to load in the registration (one path each row). |
Required fields | List of fields to include in the response for profile requests (when blank it returns all fields). Fields must be separated by commas and square brackets for nested fields (e.g. id,name,username,profile[city,region,country]). |
JSON Login | Enable JSON payload on login action. |
JSON Register | Enable JSON payload on register action. |
Enable session id | When enabled it overrides cookie based session with session_id parameter. This is useful when it is not possible to rely on cookie based session. This parameter can be passed as GET/POST param or as JSON field when JSON payload is enabled for the current request. |
The general format for any error response is the following:
{ "status": "ko", "error_code": "<code>", "error_description": "<description>" }
The following table includes all error codes with description, grouped by "realm".
KNN_KNIKunena not installed{"status":"ko","error_code":"KNN_KNI","error_description":"Kunena not installed"}
Realm | Error code | Error description | JSON format |
---|---|---|---|
Module related error codes | REQ_ANS | Action not specified | {"status":"ko","error_code":"REQ_ANS","error_description":"Action not specified"} |
REQ_MNS | Module not specified | {"status":"ko","error_code":"REQ_MNS","error_description":"Module not specified"} | |
REQ_MNF | Module not found | {"status":"ko","error_code":"REQ_MNF","error_description":"Module not found"} | |
REQ_RUN | Request unknown | {"status":"ko","error_code":"REQ_RNS","error_description":"Request unknown"} | |
API key related error codes | REQ_AKR | API key required | {"status":"ko","error_code":"REQ_AKR","error_description":"API key required"} |
REQ_AKL | API key limit exceeded | {"status":"ko","error_code":"REQ_AKL","error_description":"API key limit exceeded"} | |
REQ_AKE | API key expired | {"status":"ko","error_code":"REQ_AKE","error_description":"API key expired"} | |
REQ_AKI | API key invalid | {"status":"ko","error_code":"REQ_AKI","error_description":"API key invalid"} | |
REQ_AKG | API key generic error | {"status":"ko","error_code":"REQ_AKG","error_description":"API key generic error"} | |
User authentication related error codes | REQ_UCA | Unable to check authentication | {"status":"ko","error_code":"REQ_UCA","error_description":"Unable to check authentication"} |
REQ_AUR | Authentication required | {"status":"ko","error_code":"REQ_AUR","error_description":"Authentication required"} | |
User module | USR_LIF | Login failed | {"status":"ko","error_code":"USR_LIF","error_description":"Login failed"} |
USR_LOF | Logout failed | {"status":"ko","error_code":"USR_LOF","error_description":"Logout failed"} | |
USR_UNR | Username required | {"status":"ko","error_code":"USR_UNR","error_description":"Username required"} | |
USR_PWR | Password required | {"status":"ko","error_code":"USR_PWR","error_description":"Password required"} | |
USR_EMR | Email required | {"status":"ko","error_code":"USR_EMR","error_description":"Email required"} | |
USR_NMR | Name required | {"status":"ko","error_code":"USR_NMR","error_description":"Name required"} | |
USR_ALI | Already logged in | {"status":"ko","error_code":"USR_NMR","error_description":"Already logged in"} | |
USR_UNE | User not enabled | {"status":"ko","error_code":"USR_UNE","error_description":"User not enabled"} | |
USR_RNA | Registration not allowed | {"status":"ko","error_code":"USR_RNA","error_description":"Registration not allowed"} | |
USR_IRF | Invalid registration field | {"status":"ko","error_code":"USR_IRF","error_description":"Invalid registration field"} | |
USR_UNL | User not logged in | {"status":"ko","error_code":"USR_UNL","error_description":"User not logged in"} | |
USR_UNE | User not enabled | {"status":"ko","error_code":"USR_UNE","error_description":"User not enabled"} | |
USR_EDR | Error during registration | {"status":"ko","error_code":"USR_EDR","error_description":"Error during registration"} | |
USR_UAX | Username already exists | {"status":"ko","error_code":"USR_UAX","error_description":"Username already exists"} | |
USR_EAX | Email already exists | {"status":"ko","error_code":"USR_EAX","error_description":"Email already exists"} | |
USR_RRE | Reset request error | {"status":"ko","error_code":"USR_RRE","error_description":"Reset request error"} | |
USR_RRF | Reset request failed | {"status":"ko","error_code":"USR_RRF","error_description":"Reset request failed"} | |
Content module | CNT_ANF | Article not found | {"status":"ko","error_code":"CNT_ANF","error_description":"Article not found"} |
CNT_AGE | Article generic error | {"status":"ko","error_code":"CNT_AGE","error_description":"Article generic error"} | |
CNT_ANA | Access not authorized | {"status":"ko","error_code":"CNT_ANA","error_description":"Access not authorized"} | |
CNT_CNF | Category not found | {"status":"ko","error_code":"CNT_CNF","error_description":"Category not found"} | |
CNT_NCF | No categories found | {"status":"ko","error_code":"CNT_NCF","error_description":"No categories found"} | |
CNT_TNS | Tag not specified | {"status":"ko","error_code":"CNT_TNS","error_description":"Tag not specified"} | |
CNT_TGE | Tag generic error | {"status":"ko","error_code":"CNT_TGE","error_description":"Tag generic error"} | |
CNT_ANS | Alias not specified | {"status":"ko","error_code":"CNT_ANS","error_description":"Alias not specified"} | |
Push module | PSH_TNS | Token not specified | {"status":"ko","error_code":"PSH_TNS","error_description":"Token not specified"} |
PSH_ANS | App code not specified | {"status":"ko","error_code":"PSH_ANS","error_description":"App code not specified"} | |
PSH_PNS | Platform not specified | {"status":"ko","error_code":"PSH_PNS","error_description":"Platform not specified"} | |
PSH_PUN | Platform unknown | {"status":"ko","error_code":"PSH_PUN","error_description":"Platform unknown"} | |
PSH_ESA | Error saving app code | {"status":"ko","error_code":"PSH_ESA","error_description":"Error saving app code"} | |
PSH_AUN | Application unknown | {"status":"ko","error_code":"PSH_AUN","error_description":"Application unknown"} | |
PSH_ESD | Error saving device | {"status":"ko","error_code":"PSH_ESD","error_description":"Error saving device"} | |
PSH_ECN | Error creating notification | {"status":"ko","error_code":"PSH_ECN","error_description":"Error creating notification"} | |
PSH_IAT | Invalid authorization token | {"status":"ko","error_code":"PSH_IAT","error_description":"Invalid authorization token"} | |
Menu module | MNU_MNS | Menu not specified | {"status":"ko","error_code":"MNU_MNS","error_description":"Menu not specified"} |
MNU_INF | Item not found | {"status":"ko","error_code":"MNU_INF","error_description":"Item not found"} | |
MNU_NIF | No items found | {"status":"ko","error_code":"MNU_NIF","error_description":"No items found"} | |
SobiPro module | SP_SNI | SobiPro not installed | {"status":"ko","error_code":"SP_SNI","error_description":"SobiPro not installed"} |
SP_SNS | Section not specified | {"status":"ko","error_code":"SP_SNS","error_description":"Section not specified"} | |
SP_CNS | Category not specified | {"status":"ko","error_code":"SP_CNS","error_description":"Category not specified"} | |
SP_PNS | Parent not specified | {"status":"ko","error_code":"SP_PNS","error_description":"Parent not specified"} | |
SP_SGE | Section generic error | {"status":"ko","error_code":"SP_SGE","error_description":"Section generic error"} | |
SP_NSF | No sections found | {"status":"ko","error_code":"SP_NSF","error_description":"No sections found"} | |
SP_SNF | Section not found | {"status":"ko","error_code":"SP_SNF","error_description":"Section not found"} | |
SP_CGE | Category generic error | {"status":"ko","error_code":"SP_CGE","error_description":"Category generic error"} | |
SP_NCF | No categories found | {"status":"ko","error_code":"SP_NCF","error_description":"No categories found"} | |
SP_CNF | Category not found | {"status":"ko","error_code":"SP_CNF","error_description":"Category not found"} | |
SP_EGE | Entry generic error | {"status":"ko","error_code":"SP_EGE","error_description":"Entry generic error"} | |
SP_NEF | No entries found | {"status":"ko","error_code":"SP_NEF","error_description":"No entries found"} | |
SP_ENF | Entry not found | {"status":"ko","error_code":"SP_ENF","error_description":"Entry not found"} | |
ZOO module | ZOO_ZNI | ZOO not installed | {"status":"ko","error_code":"ZOO_ZNI","error_description":"ZOO not installed"} |
ZOO_ZNS | ZOO app not specified | {"status":"ko","error_code":"ZOO_ZNS","error_description":"ZOO app not specified"} | |
ZOO_INF | Item not found | {"status":"ko","error_code":"ZOO_INF","error_description":"Item not found"} | |
ZOO_ANA | Access not authorized | {"status":"ko","error_code":"ZOO_ANA","error_description":"Access not authorized"} | |
ZOO_CNS | Category not specified | {"status":"ko","error_code":"ZOO_CNS","error_description":"Category not specified"} | |
ZOO_CNF | Category not found | {"status":"ko","error_code":"ZOO_CNF","error_description":"Category not found"} | |
ZOO_NCF | No categories found | {"status":"ko","error_code":"ZOO_NCF","error_description":"No categories found"} | |
Kunena module | KNN_KNI | Kunena not installed | {"status":"ko","error_code":"KNN_KNI","error_description":"Kunena not installed"} |
KNN_NTF | No topic found | {"status":"ko","error_code":"KNN_NTF","error_description":"No topic found"} | |
K2 module | K2_KNI | K2 not installed | {"status":"ko","error_code":"K2_KNI","error_description":"K2 not installed"} |
K2_NUF | No users found | {"status":"ko","error_code":"K2_NUF","error_description":"No users found"} | |
K2_INF | Item not found | {"status":"ko","error_code":"K2_INF","error_description":"Item not found"} | |
K2_IGE | Item generic error | {"status":"ko","error_code":"K2_IGE","error_description":"Item generic error"} | |
K2_ANA | Access not authorized | {"status":"ko","error_code":"K2_ANA","error_description":"Access not authorized"} | |
K2_CNF | Category not found | {"status":"ko","error_code":"K2_CNF","error_description":"Category not found"} | |
K2_NCF | No categories found | {"status":"ko","error_code":"K2_NCF","error_description":"No categories found"} | |
K2_CGE | Category generic error | {"status":"ko","error_code":"K2_CGE","error_description":"Category generic error"} | |
Search module | - | - | - |
Community Builder module | CB_CNI | Community Builder not installed | {"status":"ko","error_code":"CB_CNI","error_description":"Community Builder not installed"} |
CB_EAD | Error accessing database | {"status":"ko","error_code":"CB_EAD","error_description":"Error accessing database"} | |
CB_UNS | User not specified | {"status":"ko","error_code":"CB_UNS","error_description":"User not specified"} | |
CB_UNF | User not found | {"status":"ko","error_code":"CB_UNF","error_description":"User not found"} | |
CB_MFM | Mandatory field missing | {"status":"ko","error_code":"CB_MFM","error_description":"Mandatory field missing"} | |
CB_PUF | Profile update failed | {"status":"ko","error_code":"CB_PUF","error_description":"Profile update failed"} | |
Release System module | REL_PNS | Package not specified | {"status":"ko","error_code":"REL_PNS","error_description":"Package not specified"} |
REL_ENS | Email not specified | {"status":"ko","error_code":"REL_ENS","error_description":"Email not specified"} | |
REL_UNS | Username not specified | {"status":"ko","error_code":"REL_UNS","error_description":"Username not specified"} | |
REL_PWD | Password not specified | {"status":"ko","error_code":"REL_PWD","error_description":"Password not specified"} | |
REL_KNS | Key not specified | {"status":"ko","error_code":"CB_MFM","error_description":"Key not specified"} | |
REL_KNR | Key not required | {"status":"ko","error_code":"REL_KNR","error_description":"Key not required"} | |
REL_PNF | Package not found | {"status":"ko","error_code":"REL_PNF","error_description":"Package not found"} | |
REL_PNE | Package not exists | {"status":"ko","error_code":"REL_PNE","error_description":"Package not exists"} | |
REL_GNS | Group not specified | {"status":"ko","error_code":"REL_GNS","error_description":"Group not specified"} | |
REL_GNF | Group not found | {"status":"ko","error_code":"REL_GNF","error_description":"Group not found"} | |
REL_UNF | User not found | {"status":"ko","error_code":"REL_UNF","error_description":"User not found"} | |
REL_UNA | User not authorized | {"status":"ko","error_code":"REL_UNA","error_description":"User not authorized"} | |
REL_INK | Invalid key | {"status":"ko","error_code":"REL_INK","error_description":"Invalid key"} | |
REL_ESK | Error sending key | {"status":"ko","error_code":"REL_ESK","error_description":"Error sending key"} | |
REL_LIF | Login failed | {"status":"ko","error_code":"REL_LIF","error_description":"Login failed"} | |
REL_UNE | User not enabled | {"status":"ko","error_code":"REL_UNE","error_description":"User not enabled"} |
Once an end-point is published the web clients can start to make HTTP requests and consume services provided by jBackend API. It is possible to test if all is working as expected using any REST client that allows to build custom HTTP requests (much better if the client supports JSON decode to better show server responses). Some good clients are available as browser plugin for both Firefox and Chrome. We suggest REST Easy for Firefox and Postman - REST Client for Chrome.
Let's assume the end-point menu item can be accessed with the following URL:
http://www.mysite.com/index.php/jbackend
Calling just the URL without any parameter we will get the following JSON response:
{ "status": "ko", "error_code": "REQ_MNS", "error_description": "Module not specified" }
Note that the HTTP Response Code is always 200 even in case of errors. The error condition is reported by the "status" value (ok, ko). Additional information about the error can be found in the "error_code" and the "error_description" values.
To check jBackend features it is available a sandbox with the last version of jbackend and all modules installed, and free access type on the end-point. To play with the sandbox a Postman collection is available to download here:
http://www.selfget.com/downloads/file/41-jbackapp-postman-collection.html
It needs only to be imported into Postman and is ready to play.
jBackend includes a fully featured platform for sending Push Notifications over Google GCM (Android) and Apple APNs (iOS). Moreover, it supports multiple mobile applications, and you can manage them all from a single Joomla installation.
The component interface includes functions to manage Apps, Devices and Notifications, and there's a Push module to interact with jBackend from the outside (e.g. to send registration token from your app or start the push notification sending process).
The first thing to do just after installation is to enable jBackend basic plugins. To do this go to menu "Extensions" -> "Plug-in Manager", and filter plugin list for type "jbackend".
Each one of these plugins has some configurable options, so it is enough to click on "Status" buttons to enable the plugins, but it is necessary to edit a plugin to change its settings.
Note that when a plugin is disabled the API functions it provides will NOT be available.
To start using jBackend it is a good practice to publish an "end-point". This is a Joomla menu item which provides a defined URL to access to jBackend APIs (the one associated with the menu link), and can be configured as needed using menu item's options. To create an end-point go to "Menus" -> "Menu Manager", click on the menu that will contain the end-point (or create a new menu, like an hidden menu) and add a new menu item.
Select a menu type "jBackend" -> "Request" and set the "Access type" in the "Options" tab, and other options available for the current endpoint.
The following options are available for each endpoint:
Option | Description |
Access type | Specify the kind of access allowed by the endpoint. |
Enable trace | Enable or disable the logging of each request made at this endpoint. |
Enable CORS | Add Access-Control-Allow-Origin: * to the response header. |
Force SSL | Redirect any request on http to the same request on https. |
Enabled modules | Specify which modules to expose and make accessible on the endpoint (all modules or only selected modules). |
Selected modules | The list of modules enabled on the endpoint. This option is applied only when "Enabled modules" is "Only selected". |
Currently jBackend supports the following access type:
Access type | Description |
Free | End-point can be consumed without any authentication or limitation, just like a guest user can browse the site's pages and with the same restrictions. This means that if an article is restricted to "Register users" only, it will be not accessible for guests even on the end-point, but the client needs to authenticate himself, using the login service. Native ACL are always satisfied with any access type and this should be respected also in case of custom module development. |
User | End-point usage is restricted to authenticated users only. To consume services the first call must be to login service. If the user can login to the site, then the same credentials are authorized to use the end-point. |
API Key | End-point needs a valid API Key for each request. The request must include the api_key=<KEY> parameter or it will be rejected. More details on API Key features can be found in the dedicated section. |
Note that APIs could be accessed without to publish any end-point, just calling the jBackend component with http://<siteurl>/index.php?option=com_jbackend&<params> (default requests). For this reasons there are global options defined as default and used for such situations. These general options can be accessed by the "Options" button in the jBackend panel. For security reasons the default access is set to "API Key".
The following global options are available:
Option | Description |
Default Access type | Specify the kind of access allowed by the default endpoint. |
Default Enable trace | Enable or disable the logging of each request made on the default endpoint. |
Default Force SSL | Redirect any request on http to the same request on https on the default endpoint. |
If Joomla SEF is enabled, the endpoint can serve requests with the REST format (e.g. /get/content/articles/<N>).
jBackend basic extension has just one package to download and install. The package includes the component and three plugins (User Module, Content Module, and Push Module), and support the installation with "upgrade" mode, so there’s no need to uninstall any previous installed version.
To install jBackend, login to Joomla backend as administrator, and go to menu "Extension Manager". Click the browse button, select the package file (jBackendX.X_J3.zip) and click the installation button.
The package will be uploaded on the server and then installed. After installation finished a message will report a successful message.
That’s all. Now we are ready to start using jBackend.
When upgrading from a previous version of jBackend, there is no need to first uninstall the old package. As mentioned earlier, jBackend supports the "upgrade" mode for the installation, so is enough to just install the new package over the old one. The component and the three plugins included in the basic package will be upgraded.
Note that during the upgrade also the database tables are upgraded when needed, but without to delete or loose any table data. It is in charge of the installation process to upgrade tables structure if needed. All the data (e.g. API Keys) will be preserved.
jBackend is a Joomla extension that introduces a set of APIs for access to all Joomla's content and features, and easily integrate any Joomla site with any external system. It extends the power of Joomla allowing you to use your site as a "backend system" to serve and feed any kind of client (mobile apps, news channels, affiliate sites, and any other external system).
jBackend also provides a full push notifications platform for iOS and Android mobile apps. It is possible to manage multiple apps, to register devices for each app, and to schedule push notifications sending on registered devices, filtered by app and platform type.
jBackend is designed to be "extensible" via plugins. Adding new plugins means to add new APIs to support new Joomla extensions. The basic package already includes three plugins, the User Module (that supports Joomla users and ACL), the Content Module (for the standard Joomla content, categories and articles), and the Push Module (to work with push notifications). New plugins are on the way, to add support for the most used Joomla extensions (e.g. K2, Zoo, VirtueMart, HikaShop, and so on). Additional plugins can be installed separately, so you can install and use only the necessary modules, and keep your CMS lightweight and efficient.
jBackend access is possible through an "end-point", that can be published like a menu item. It is possible to publish several end-points and configure access rules separately for each one. The access can be free, or restricted with a standard user login or through the use of an API Key. API Keys can be generated and configured (e.g. in terms of limitations like expiration or daily access) in jBackend panel. This allows full control on API access provided to clients.
It is possible to enable requests tracking for each endpoint separately. In this way all requests received from the endpoint are stored in the database and can be used for security audit or for statistical analysis.
It is also possible to enable specific modules for each endpoint separately. This increase the control level on the pool of functions or services to expose for each endpoint.
End-point channels can be accessed through HTTP, requests can be compliant to RESTful pattern, and responses are JSON encoded. In the future is expected to support the ability to provide XML responses.