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.