Contents

REST API - Plugixa FAQ

Namespace plugixa-faq/v1, under your site’s /wp-json/ root. The admin app uses these routes and nothing else, so anything the admin can do is available to you.

Authentication

Standard WordPress REST authentication: a nonce from inside the admin, or application passwords from outside. Write routes require the capability that matches the action, and the plugin registers its own: plugixa_faq_manage, plugixa_faq_edit, plugixa_faq_delete and plugixa_faq_settings.

Answers

GET    /faqs                    list, with filters and pagination
POST   /faqs                    create
GET    /faqs/<id>               read one
PUT    /faqs/<id>               update
DELETE /faqs/<id>               delete
POST   /faqs/reorder            set the order
DELETE /faqs/bulk               delete several
GET    /faqs/tree               the nested structure
GET    /faqs/authors            distinct authors, for the filter
GET    /faqs/export             json or csv
POST   /faqs/import             json or csv

PUT is not a PATCH

The single thing most likely to cost you an afternoon. PUT /faqs/<id> rebuilds the record from the request: question, answer, category_id, status and menu_order are all written every time, and the last two default to draft and 0 when absent.

So a request that sets only category_id also unpublishes the answer and moves it to the top of the order, and returns 200.

question and answer are required, which is the only reason a naive partial update fails loudly rather than quietly. Read the record, merge your change into it, and send the whole thing back.

Categories, views and shortcodes

GET|POST       /categories          GET|PUT|DELETE /categories/<id>
POST           /categories/reorder

GET|POST       /views               GET|PUT|DELETE /views/<id>
POST           /views/<id>/duplicate
POST           /views/<id>/set-default
GET            /views/default-config
GET            /views/preview-faqs

GET|POST       /shortcodes          GET|PUT|DELETE /shortcodes/<id>
POST           /shortcodes/<id>/duplicate

Settings and multilingual

GET|PUT /settings
GET     /settings/dashboard          the counts on the dashboard
GET     /settings/health

GET     /multilingual/languages
GET     /multilingual/status
GET     /multilingual/<entity>/<id>/translations
PUT     /multilingual/<entity>/link-translations    source_id, target_id
DELETE  /multilingual/<entity>/<id>/translations/<lang>

link-translations is how two records become translations of each other. Do not try to set translation_group on a create or an update: it is read only when creating, ignored when updating, and rejects a null.

Public routes

GET  /faqs/page                    paged answers, for the front end
POST /feedback                     record a vote           (premium)
GET  /feedback/check/<faq_id>      has this visitor voted  (premium)
POST /frontend/submit-faq          submit a question       (premium)

These are public by design. All three are rate limited, and the two write routes can require Turnstile.

Premium routes

/custom-fields, /feedback, /feedback/stats, /ai-generator/*, /faqs/export-pdf and /woocommerce/* are registered by the premium build. They are not present at all in the free build, rather than answering with an upgrade message.

Response shape

Most routes wrap: { success, message, data }, with lists under data.items and a created record’s id under data.id. Read one level deeper than looks necessary.

Troubleshooting

What you see Why What to do
An answer was unpublished by an update PUT rebuilds the record Send the full record with your change merged in
404 on a premium route The free build does not register it Check which build is installed
translation_group is not of type string You passed a null on create Create first, then call link-translations
401 or 403 Missing nonce, or a capability Use an application password from outside the admin

What to do next

Troubleshooting for everything else.

Quick Links