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 draft with source set to form, whatever the Default Status setting says. The response does not give the new member’s id: find submissions with filter[status]=draft in 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