Contents
On this page
Submit Member - Plugixa Team
POST /plugixateam/v1/frontend/submit
Send a submission the way the [plugixa_team_form] submission form does. It creates a draft member for someone to review and publish.
Needs Plugixa Team Pro, with submissions switched on (Enable Submission Form in Plugixa Team -> Settings -> Submission). No sign-in: anyone can call it, which is why it is rate-limited, checks a honeypot field, can require Cloudflare Turnstile, and never publishes anything.
Note. A submission always lands as a
draftwithsourceset toform, whatever the Default Status setting says. The response does not give the new member’s id: find submissions withfilter[status]=draftin List Members.
Note. The limit is 5 attempts per 15 minutes per IP address, and every attempt counts, failed ones included. Behind a CDN or reverse proxy every visitor shares the proxy’s address, and so shares one allowance: see Rate limit.
Request
POST https://your-site.example/wp-json/plugixateam/v1/frontend/submit
Request body
Content type: multipart/form-data (needed to send a photo) or application/json.
| Field | Type | Required | Description |
|---|---|---|---|
first_name |
string |
Per settings | |
last_name |
string |
Per settings | |
job_title |
string |
Per settings | |
department |
string |
Per settings | |
email |
string |
Per settings | Must be a valid email address when sent. |
phone |
string |
Per settings | |
bio |
string |
No | HTML. Tags not allowed in a post are stripped. At most 2,000 characters. |
short_bio |
string |
No | Plain text. |
website_url |
string |
No | A URL. |
location |
string |
No | |
social |
object |
No | Platform name to URL: social[linkedin]=https://.... Empty URLs are dropped. |
skills |
array |
No | { "name": "UX research", "percentage": 90 } objects. The percentage is kept between 0 and 100; a skill without a name is dropped. |
meta |
object |
Depends | Custom field values, keyed by field key: meta[pronouns]=she/her. Only fields offered on the form are read; a field marked required must have a value. Email fields must hold a valid address, number fields are stored as numbers, URL fields as URLs. |
photo |
file |
No | JPEG, PNG, GIF or WebP, at most 2 MB. Read only when photo uploads are on in the submission settings. |
turnstile_token |
string |
When Turnstile is on | A Cloudflare Turnstile token minted for the action submit_team_member. |
website_url_confirm |
string |
No | The honeypot. Leave it out or empty. |
Which of the six named fields are required is set under Plugixa Team -> Settings -> Submission (first name, last name and job title by default). Every missing or invalid field is reported at once in data.errors. A mobile number, ribbon, status, groups or display order cannot be sent: an editor sets those when reviewing.
Checks run in this order: submissions switched on, the rate limit, the honeypot, the fields, then Turnstile. Turnstile is checked last so that junk submissions never cost a verification call.
{
"first_name": "Amira",
"last_name": "Haddad",
"job_title": "Head of Design",
"email": "amira@example.com",
"social": { "linkedin": "https://www.linkedin.com/in/amira-example" },
"skills": [{ "name": "UX research", "percentage": 90 }],
"meta": { "pronouns": "she/her" }
}
Responses
200 OK. The submission was saved as a draft.
{
"success": true,
"message": "",
"data": {
"message": "Member submitted successfully"
}
}
| Field | Type | Meaning |
|---|---|---|
data.message |
string |
A translated confirmation. The success message set in the submission settings is not used here: the form shows that one |
A request that fills the honeypot gets exactly the same answer, and nothing is saved.
Errors
| Status | Code | When |
|---|---|---|
403 |
rest_error |
Submissions are switched off. |
429 |
rest_error |
More than 5 attempts from this IP address in 15 minutes. |
400 |
rest_error |
One or more fields are missing or invalid. data.errors names each one: a required field by its name (first_name, job_title, …), email, bio, photo, or meta_<field key> for a custom field. |
403 |
rest_error |
Turnstile is on and the token is missing or did not verify. |
500 |
rest_error |
The submission could not be saved. |
{
"code": "rest_error",
"message": "Please correct the errors below",
"data": {
"status": 400,
"errors": {
"job_title": "Job title is required",
"email": "Please enter a valid email address"
}
}
}
A photo that passed the checks but could not be stored is dropped silently: the member is created without it.
Plus the errors every endpoint can return.
Examples
curl -s -X POST "https://your-site.example/wp-json/plugixateam/v1/frontend/submit" \
-F "first_name=Amira" \
-F "last_name=Haddad" \
-F "job_title=Head of Design" \
-F "email=amira@example.com" \
-F "social[linkedin]=https://www.linkedin.com/in/amira-example" \
-F "meta[pronouns]=she/her" \
-F "photo=@amira.jpg"
<?php
$ch = curl_init('https://your-site.example/wp-json/plugixateam/v1/frontend/submit');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => [
'first_name' => 'Amira',
'last_name' => 'Haddad',
'job_title' => 'Head of Design',
'email' => 'amira@example.com',
'social[linkedin]' => 'https://www.linkedin.com/in/amira-example',
'meta[pronouns]' => 'she/her',
'photo' => new CURLFile('amira.jpg'),
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
const form = new FormData();
form.append('first_name', 'Amira');
form.append('last_name', 'Haddad');
form.append('job_title', 'Head of Design');
form.append('email', 'amira@example.com');
form.append('social[linkedin]', 'https://www.linkedin.com/in/amira-example');
form.append('meta[pronouns]', 'she/her');
form.append('photo', photoFile); // a File or Blob
const response = await fetch('https://your-site.example/wp-json/plugixateam/v1/frontend/submit', {
method: 'POST',
body: form,
});
const { data } = await response.json();
Quick Links
Share