{"id":298188,"date":"2026-04-20T04:17:03","date_gmt":"2026-04-20T04:17:03","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/contesimal-connector\/"},"modified":"2026-10-16T19:36:24","modified_gmt":"2026-10-16T19:36:24","slug":"contesimal-connector","status":"publish","type":"plugin","link":"https:\/\/kea.wordpress.org\/plugins\/contesimal-connector\/","author":23477484,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.8","stable_tag":"1.0.8","tested":"6.9.10","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"Contesimal Connector","header_author":"Contesimal","header_description":"Exposes a private REST API on your site so authorized external apps (e.g. Contesimal at contesimal.ai) can publish posts and media using an administrator-managed API key. Does not phone home; see readme for data flow and privacy.","assets_banners_color":"5220a9","last_updated":"2026-10-16 19:36:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/contesimal.ai","header_author_uri":"https:\/\/profiles.wordpress.org\/contesimal\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":656,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"contesimal","date":"2026-04-20 04:16:55","revision":3510394},"1.0.1":{"tag":"1.0.1","author":"contesimal","date":"2026-04-22 15:50:14","revision":3513002},"1.0.2":{"tag":"1.0.2","author":"contesimal","date":"2026-05-14 06:54:28","revision":3531665},"1.0.3":{"tag":"1.0.3","author":"contesimal","date":"2026-10-13 11:48:21","revision":3743783},"1.0.4":{"tag":"1.0.4","author":"contesimal","date":"2026-10-14 05:58:22","revision":3745422},"1.0.5":{"tag":"1.0.5","author":"contesimal","date":"2026-10-14 12:09:39","revision":3746285},"1.0.6":{"tag":"1.0.6","author":"contesimal","date":"2026-10-14 17:35:14","revision":3746859},"1.0.7":{"tag":"1.0.7","author":"contesimal","date":"2026-10-15 13:41:20","revision":3748611},"1.0.8":{"tag":"1.0.8","author":"contesimal","date":"2026-10-16 19:36:24","revision":3751030}},"upgrade_notice":{"1.0.8":"<p>Publish accepts featured_image_id (preferred) plus optional caption\/credit\/alt\/title for the featured attachment.<\/p>","1.0.7":"<p>Contesimal admin menu with Content types and Field mapping; REST APIs honor the map via GET \/publish-config.<\/p>","1.0.6":"<p>Publish assigns categories and tags for custom post types that register those taxonomies.<\/p>","1.0.5":"<p>Categories API returns every active category across public hierarchical taxonomies.<\/p>","1.0.4":"<p>Media import supports optional title, alt text, caption, and description.<\/p>","1.0.3":"<p>Adds user roles on list, GET \/roles, and POST \/users with strict role allowlisting (never administrator).<\/p>","1.0.2":"<p>Adds <code>GET \/wp-json\/contesimal\/v1\/posts<\/code> with pagination and total count for any public post type.<\/p>","1.0.1":"<p>Adds <code>GET \/wp-json\/contesimal\/v1\/users<\/code> for listing author-capable user IDs.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3510394,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256-256.png":{"filename":"icon-256-256.png","revision":3510394,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"Banner-1544x500.png":{"filename":"Banner-1544x500.png","revision":3510394,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3510398,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[610,529,2278,7143,23853],"plugin_category":[57],"plugin_contributors":[260594,260593],"plugin_business_model":[],"class_list":["post-298188","plugin","type-plugin","status-publish","hentry","plugin_tags-categories","plugin_tags-content","plugin_tags-post-types","plugin_tags-publishing","plugin_tags-rest-api","plugin_category-taxonomy","plugin_contributors-contesimal","plugin_contributors-wondermentkirpal","plugin_committers-contesimal"],"banners":{"banner":"https:\/\/ps.w.org\/contesimal-connector\/assets\/banner-772x250.png?rev=3510398","banner_2x":"https:\/\/ps.w.org\/contesimal-connector\/assets\/Banner-1544x500.png?rev=3510394","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/contesimal-connector\/assets\/icon-128x128.png?rev=3510394","icon_2x":"https:\/\/ps.w.org\/contesimal-connector\/assets\/icon-256-256.png?rev=3510394","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Contesimal Connector adds REST API endpoints to your WordPress site, allowing external applications to create and manage content using an API key.<\/p>\n\n<p>Requests are made to your site\u2019s <code>\/wp-json\/contesimal\/v1\/<\/code> endpoints. The plugin does not send any data externally on its own.<\/p>\n\n<p><strong>External services and privacy<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Designed to work with Contesimal (https:\/\/contesimal.ai), but compatible with any client using your API key.<\/li>\n<li><strong>Data received:<\/strong> Post title, content (HTML), excerpt, status, categories, tags, post type, author ID, and media URLs with optional title, alt text, caption, and description. User listing and create responses return ID, display name, slug, and roles for active users (no email or passwords in the response). Creating a user accepts username, email, optional password, display name, and an allowlisted role. The administrator role cannot be assigned via the API.<\/li>\n<li><strong>Media handling:<\/strong> Your WordPress site may download remote files from provided URLs to create Media Library attachments.<\/li>\n<li><strong>When:<\/strong> Only when a valid API request is sent to your site. No background communication occurs.<\/li>\n<li><strong>Control:<\/strong> External access is enabled only if you share the API key. You can regenerate the key or deactivate the plugin at any time.<\/li>\n<li><strong>Consent:<\/strong> By enabling the plugin and sharing the API key, the site administrator allows external applications to submit content and, when used, create users with non-administrator roles.<\/li>\n<\/ul>\n\n<p><strong>Authentication<\/strong><\/p>\n\n<p>All endpoints require an API key sent in the <code>X-API-Key<\/code> header (or <code>Authorization: Bearer<\/code>).<\/p>\n\n<p>The key is:\n- Generated on your site\n- Stored as a secure hash\n- Managed by administrators only<\/p>\n\n<p>Requests without a valid key are rejected (401). Rate limiting is applied per IP.<\/p>\n\n<p>API keys should be treated as sensitive credentials and only shared with trusted systems.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>API key authentication (hashed storage)<\/li>\n<li>Create posts via REST API<\/li>\n<li>List categories, post types, and author-capable users (with roles)<\/li>\n<li>List assignable roles and create users (allowlisted roles only; never administrator)<\/li>\n<li>Media import from external URLs<\/li>\n<li>Rate limiting (per IP)<\/li>\n<li>Configurable CORS<\/li>\n<li>Optional request logging (admin only)<\/li>\n<li>Contesimal admin menu: Connection, Content types, and Field mapping<\/li>\n<li>Publish config API so Contesimal discovers enabled types and taxonomy maps<\/li>\n<\/ul>\n\n<p><strong>REST endpoints (base: <code>\/wp-json\/contesimal\/v1<\/code>)<\/strong><\/p>\n\n<ul>\n<li><code>GET \/ping<\/code> \u2013 Health check<\/li>\n<li><code>GET \/publish-config<\/code> \u2013 Enabled post types and field (categories\/tags) taxonomy maps<\/li>\n<li><code>GET \/categories<\/code> \u2013 Categories from mapped taxonomies for enabled post types<\/li>\n<li><code>GET \/post-types<\/code> \u2013 Enabled Contesimal post types (with field maps)<\/li>\n<li><code>GET \/users<\/code> \u2013 List active users (id, name, slug, roles; optional <code>session_only<\/code>, <code>search<\/code>, <code>limit<\/code>)<\/li>\n<li><code>POST \/users<\/code> \u2013 Create a user with an allowlisted role<\/li>\n<li><code>GET \/roles<\/code> \u2013 List roles that may be assigned via <code>POST \/users<\/code><\/li>\n<li><code>GET \/posts<\/code> \u2013 List posts by enabled post type with pagination and total count<\/li>\n<li><code>POST \/publish<\/code> \u2013 Create post (uses Field mapping for categories\/tags)<\/li>\n<li><code>POST \/media\/import<\/code> \u2013 Import media from URLs (optional title, alt, caption, description)<\/li>\n<\/ul>\n\n<p>An admin notice is shown when API access is enabled, indicating that external publishing is active.<\/p>\n\n<h3>REST API Reference<\/h3>\n\n<p>All endpoints require: <code>X-API-Key: your_api_key<\/code><\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/ping<\/h4>\n\n<p>Returns plugin status.<\/p>\n\n<p><strong>Response:<\/strong>\n{ \"status\": \"ok\", \"plugin\": \"contesimal-connector\", \"version\": \"1.0.8\" }<\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/publish-config<\/h4>\n\n<p>Returns the site\u2019s Contesimal publish map: default post type and each enabled type with whether categories\/tags are mapped and to which taxonomies.<\/p>\n\n<p><strong>Response (example):<\/strong>\n{ \"success\": true, \"default_post_type\": \"post\", \"post_types\": [ { \"name\": \"post\", \"label\": \"Posts\", \"is_default\": true, \"fields\": { \"title\": true, \"content\": true, \"excerpt\": true, \"author\": true, \"featured_image\": true, \"categories\": { \"enabled\": true, \"taxonomy\": \"category\" }, \"tags\": { \"enabled\": true, \"taxonomy\": \"post_tag\" } } } ] }<\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/categories<\/h4>\n\n<p>Returns active terms from taxonomies mapped as Contesimal \u201ccategories\u201d for enabled post types. Each item includes <code>taxonomy<\/code> and <code>post_types<\/code> (enabled types that use that taxonomy for categories).<\/p>\n\n<p><strong>Response (example):<\/strong>\n{ \"success\": true, \"categories\": [ { \"id\": 1, \"name\": \"Uncategorized\", \"slug\": \"uncategorized\", \"count\": 5, \"taxonomy\": \"category\", \"post_types\": [ \"post\" ] } ] }<\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/post-types<\/h4>\n\n<p>Returns post types enabled under Contesimal \u2192 Content types, plus <code>default_post_type<\/code> and per-type <code>fields<\/code> (categories_taxonomy \/ tags_taxonomy).<\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/users<\/h4>\n\n<p>Returns active (non-deleted \/ non-spam) users. Suitable for user management UI and for <code>author_id<\/code> on <code>POST \/publish<\/code>. Never returns email or passwords.<\/p>\n\n<p><strong>Query parameters (all optional):<\/strong><\/p>\n\n\n\n\n  Parameter\n  Description\n\n\n\n\n  search\n  Substring match on login, nicename, display name, or email\n\n\n  session_only\n  <code>1<\/code> to only include users with stored WordPress session tokens (typically logged in recently)\n\n\n  limit\n  Max results, 1\u2013200 (default 200)\n\n\n\n\n<p><strong>Response (example):<\/strong>\n{ \"success\": true, \"users\": [ { \"id\": 1, \"name\": \"admin\", \"slug\": \"admin\", \"roles\": [ \"administrator\" ] } ] }<\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/roles<\/h4>\n\n<p>Returns roles that may be assigned when creating a user. Privileged roles (e.g. administrator) are never included.<\/p>\n\n<p><strong>Response (example):<\/strong>\n{ \"success\": true, \"roles\": [ { \"slug\": \"author\", \"name\": \"Author\" }, { \"slug\": \"editor\", \"name\": \"Editor\" } ] }<\/p>\n\n<p>Default allowlist: subscriber, contributor, author, editor. Roles that exist on the site and do not grant dangerous capabilities (such as manage_options or edit_users) are returned.<\/p>\n\n<h4>POST \/wp-json\/contesimal\/v1\/users<\/h4>\n\n<p>Creates a WordPress user. Not supported on multisite. The administrator role cannot be assigned.<\/p>\n\n<p><strong>Headers:<\/strong>\nContent-Type: application\/json<br>\nX-API-Key: your_api_key<\/p>\n\n<p><strong>Body:<\/strong><\/p>\n\n\n\n\n  Field\n  Type\n  Required\n  Description\n\n\n\n\n  username\n  string\n  Yes\n  Login name (must be unique and valid)\n\n\n  email\n  string\n  Yes\n  Email (must be unique and valid)\n\n\n  password\n  string\n  No\n  Min 8 characters. If omitted, a strong password is generated\n\n\n  display_name\n  string\n  No\n  Display name\n\n\n  first_name\n  string\n  No\n  First name\n\n\n  last_name\n  string\n  No\n  Last name\n\n\n  role\n  string\n  No\n  Assignable role from GET \/roles (default: author)\n\n\n  send_notification\n  boolean\n  No\n  Default <code>false<\/code>. If <code>true<\/code>, WordPress emails the user a link to set their password\n\n\n\n\n<p><strong>Success response (example):<\/strong>\n{ \"success\": true, \"notification_sent\": false, \"user\": { \"id\": 42, \"name\": \"Jane\", \"slug\": \"jane\", \"roles\": [ \"author\" ] } }<\/p>\n\n<p>When a password is auto-generated and <code>send_notification<\/code> is false, the response also includes <code>\"password_generated\": true<\/code> and <code>\"password\": \"\u2026\"<\/code> (shown once; never stored in the activity log). When <code>send_notification<\/code> is true, the user sets their password from the email link and the plaintext password is not returned.<\/p>\n\n<p><strong>Error responses:<\/strong>\n- 400 Invalid input, duplicate user, disallowed role, or multisite\n- 401 Invalid API key\n- 429 Rate limit exceeded\n- 500 Server error<\/p>\n\n<h4>GET \/wp-json\/contesimal\/v1\/posts<\/h4>\n\n<p>Returns a paginated list of posts for a given post type, plus the total count for that filter.<\/p>\n\n<p><strong>Query parameters (all optional):<\/strong><\/p>\n\n\n\n\n  Parameter\n  Description\n\n\n\n\n  post_type\n  Public post type (default <code>post<\/code>)\n\n\n  per_page\n  1\u2013100, default 50\n\n\n  offset\n  Number of posts to skip (default 0)\n\n\n  status\n  Comma-separated status list (default <code>publish<\/code>), or <code>any<\/code>\n\n\n  search\n  Optional keyword across title\/content\n\n\n\n\n<p><strong>Response (example):<\/strong>\n{ \"success\": true, \"post_type\": \"post\", \"total\": 124, \"per_page\": 50, \"offset\": 0, \"count\": 50, \"posts\": [ { \"post_id\": 42, \"title\": \"Hello world\", \"slug\": \"hello-world\", \"status\": \"publish\", \"date\": \"2026-05-14T11:50:00+00:00\", \"author_name\": \"Site Admin\", \"link\": \"https:\/\/example.com\/hello-world\/\", \"featured_image\": \"https:\/\/example.com\/wp-content\/uploads\/2026\/05\/cover.jpg\", \"featured_image_id\": 99, \"categories\": [ \"News\", \"Updates\" ], \"tags\": [ \"Announcement\", \"WordPress\" ], \"content\": \"<\/p>\n\n<p>Hello<\/p>\n\n<p>\" } ] }<\/p>\n\n<h4>POST \/wp-json\/contesimal\/v1\/publish<\/h4>\n\n<p>Creates a post.<\/p>\n\n<p><strong>Headers:<\/strong>\nContent-Type: application\/json<br>\nX-API-Key: your_api_key<\/p>\n\n<p><strong>Body:<\/strong><\/p>\n\n\n\n\n  Field\n  Type\n  Required\n  Description\n\n\n\n\n  title\n  string\n  Yes\n  Post title\n\n\n  content\n  string\n  Yes\n  HTML content\n\n\n  status\n  string\n  No\n  publish, draft, pending, private\n\n\n  excerpt\n  string\n  No\n  Post excerpt\n\n\n  post_type\n  string\n  No\n  Default: post\n\n\n  category_ids\n  array\n  No\n  Category IDs (taxonomy category) when the post type supports categories\n\n\n  tags\n  array\n  No\n  Tag names (taxonomy post_tag) when the post type supports tags\n\n\n  featured_image_url\n  string\n  No\n  Image URL to sideload when featured_image_id is omitted\n\n\n  featured_image_id\n  integer\n  No\n  Preferred: existing Media Library attachment ID (skips re-upload)\n\n\n  featured_image_caption\n  string\n  No\n  Featured attachment Caption\n\n\n  featured_image_credit\n  string\n  No\n  Source credit (Description when description omitted)\n\n\n  featured_image_description\n  string\n  No\n  Featured attachment Description \/ source credit\n\n\n  featured_image_alt\n  string\n  No\n  Featured attachment alt text\n\n\n  featured_image_title\n  string\n  No\n  Featured attachment title\n\n\n  author_id\n  integer\n  No\n  Default: 1\n\n\n\n\n<p><strong>Responses:<\/strong>\n- 200 Success\n- 400 Bad request\n- 401 Invalid API key\n- 429 Rate limit exceeded\n- 500 Server error<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install via Plugins screen.<\/li>\n<li>Activate the plugin (API key is generated).<\/li>\n<li>Go to <strong>Contesimal \u2192 Connection<\/strong> and copy your API key.<\/li>\n<li>Optionally enable custom post types under <strong>Content types<\/strong> and map categories\/tags under <strong>Field mapping<\/strong>.<\/li>\n<li>Configure rate limiting, CORS, and logging if needed.<\/li>\n<li>Use the API key in requests via the <code>X-API-Key<\/code> header.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20send%20data%20externally%3F\"><h3>Does the plugin send data externally?<\/h3><\/dt>\n<dd><p>No. The plugin only receives data via API requests made to your site.<\/p><\/dd>\n<dt id=\"who%20can%20use%20the%20api%3F\"><h3>Who can use the API?<\/h3><\/dt>\n<dd><p>Only external applications with your API key.<\/p><\/dd>\n<dt id=\"can%20the%20api%20create%20administrator%20users%3F\"><h3>Can the API create administrator users?<\/h3><\/dt>\n<dd><p>No. Only allowlisted non-privileged roles (by default subscriber, contributor, author, editor) can be assigned. Roles with capabilities such as manage_options or edit_users are rejected.<\/p><\/dd>\n<dt id=\"where%20is%20the%20api%20key%20managed%3F\"><h3>Where is the API key managed?<\/h3><\/dt>\n<dd><p>In <strong>Contesimal \u2192 Connection<\/strong>. It is shown once and stored securely as a hash.<\/p><\/dd>\n<dt id=\"is%20this%20gpl%20compatible%3F\"><h3>Is this GPL compatible?<\/h3><\/dt>\n<dd><p>Yes, GPL v2 or later.<\/p><\/dd>\n<dt id=\"post%20%2Fwp-json%2Fcontesimal%2Fv1%2Fmedia%2Fimport\"><h3>POST \/wp-json\/contesimal\/v1\/media\/import<\/h3><\/dt>\n<dd><p>Imports remote media into the Media Library. Optional Media Library fields may be set on import.<\/p>\n\n<p><strong>Body (single URL):<\/strong><\/p>\n\n\n\n\n  Field\n  Type\n  Required\n  Description\n\n\n\n\n  url\n  string\n  Yes*\n  Remote http(s) URL\n\n\n  urls\n  array\n  Yes*\n  Multiple URLs (shared optional meta applies to each)\n\n\n  items\n  array\n  Yes*\n  Per-file objects with <code>url<\/code> plus optional meta\n\n\n  title\n  string\n  No\n  Attachment title\n\n\n  alt\n  string\n  No\n  Alternative text\n\n\n  caption\n  string\n  No\n  Caption\n\n\n  description\n  string\n  No\n  Description\n\n\n\n\n<p>* Provide one of <code>url<\/code>, <code>urls<\/code>, or <code>items<\/code>.<\/p>\n\n<p><strong>Example:<\/strong>\n{ \"url\": \"https:\/\/example.com\/photo.jpg\", \"title\": \"Summer shot\", \"alt\": \"Red sneakers\", \"caption\": \"New arrival\", \"description\": \"Optional longer text\" }<\/p>\n\n<p><strong>Per-item example:<\/strong>\n{ \"items\": [ { \"url\": \"https:\/\/example.com\/a.jpg\", \"title\": \"Image A\", \"alt\": \"Alt A\" } ] }<\/p>\n\n<p>Success <code>results[]<\/code> includes <code>title<\/code>, <code>alt<\/code>, <code>caption<\/code>, and <code>description<\/code> for each imported file.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.8<\/h4>\n\n<ul>\n<li><code>POST \/publish<\/code>: optional featured image caption, credit, description, alt, and title<\/li>\n<li>Prefer <code>featured_image_id<\/code> (reuse Media Library attachment) over re-sideloading <code>featured_image_url<\/code><\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Move admin UI to a top-level <strong>Contesimal<\/strong> menu (Connection, Content types, Field mapping)<\/li>\n<li>Add Content types screen to enable which public post types Contesimal may publish to<\/li>\n<li>Add Field mapping screen to map Contesimal categories\/tags to site taxonomies per post type<\/li>\n<li>Legacy Settings \u2192 Contesimal Connector URL redirects to Connection<\/li>\n<li>Add <code>GET \/publish-config<\/code> for enabled post types and category\/tag taxonomy maps<\/li>\n<li>Restrict <code>GET \/post-types<\/code>, <code>GET \/posts<\/code>, and <code>POST \/publish<\/code> to admin-enabled types<\/li>\n<li><code>GET \/categories<\/code> and publish\/list use Field mapping taxonomies (fixes custom types such as IssueM article)<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Allow <code>category_ids<\/code> and <code>tags<\/code> on <code>POST \/publish<\/code> for any post type that supports those taxonomies (e.g. article), not only <code>post<\/code><\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Expand <code>GET \/categories<\/code> to every active category across public hierarchical taxonomies (same response shape)<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Add optional <code>title<\/code>, <code>alt<\/code>, <code>caption<\/code>, and <code>description<\/code> to <code>POST \/media\/import<\/code> (plus per-file <code>items<\/code>)<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Expand <code>GET \/users<\/code> to list all active users with id, name, slug, and roles<\/li>\n<li>Add <code>GET \/roles<\/code> for assignable (non-administrator) roles<\/li>\n<li>Add <code>POST \/users<\/code> to create users with allowlisted roles, sanitized input, password generation, and optional set-password email (<code>send_notification<\/code>)<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Add <code>GET \/posts<\/code> to list posts by post type with pagination, total count, featured image, categories, and tags<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Add <code>GET \/users<\/code> to list author-capable users (ID, name, slug); optional <code>session_only<\/code> for users with active sessions<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial stable release<\/li>\n<li>REST API for publishing, categories, post types, and media import<\/li>\n<li>API key authentication with hashed storage<\/li>\n<li>Rate limiting, CORS, and optional logging<\/li>\n<li>Admin notice for external publishing awareness<\/li>\n<\/ul>","raw_excerpt":"Publish content to WordPress from external applications via a secure REST API using API key authentication.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/298188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=298188"}],"author":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/contesimal"}],"wp:attachment":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=298188"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=298188"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=298188"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=298188"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=298188"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=298188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}