Connect FlutterFlow to Yoast SEO by calling the standard WordPress REST API — Yoast has no standalone endpoint. When Yoast is active on a WordPress site, its SEO fields (meta title, description, Open Graph data, canonical URL, schema) are injected into the standard `/wp-json/wp/v2/posts` response under the `yoast_head_json` object. Parse this field in FlutterFlow to pull SEO-clean metadata into a headless WordPress app or build a content audit dashboard.
| Fact | Value |
|---|---|
| Tool | Yoast SEO (for WordPress) |
| Category | Marketing |
| Method | FlutterFlow API Call |
| Difficulty | Beginner |
| Time required | 20 minutes |
| Last updated | July 2026 |
Headless WordPress + Yoast SEO in a FlutterFlow App
Many teams maintain a WordPress site for SEO-driven content — blog posts, landing pages, tutorials — and want to display that content in a native mobile app without rebuilding the content stack. The WordPress REST API makes this straightforward: FlutterFlow can pull post content, featured images, categories, and metadata directly from a WordPress site with no additional plugins. When Yoast SEO is active, a bonus field called `yoast_head_json` appears in every post and page response, containing the SEO title, meta description, canonical URL, Open Graph data, Twitter card data, and JSON-LD schema — everything Yoast injects into the HTML head, expressed as structured JSON.
The most important teaching point: there is no Yoast endpoint. Beginners often search for `/wp-json/yoast/v1/` and find nothing, because Yoast does not register its own REST route. The correct path is always `/wp-json/wp/v2/posts` and Yoast data is a passenger field inside that standard response. This means the FlutterFlow setup is simple for public content — an API Group pointing at the WordPress site URL, a JSON Path for `$.yoast_head_json.title`, and you are reading SEO metadata.
Yoast SEO is a free WordPress plugin (with a paid Premium version). Yoast Premium features do not add new REST API fields — the same `yoast_head_json` object is present on both free and Premium installations. WordPress hosting is a separate cost. For most FlutterFlow use cases (headless content delivery or SEO audit dashboards), public posts are unauthenticated and require no proxy — making this one of the simpler integrations in this collection.
Integration method
There is no separate Yoast API endpoint. When the Yoast SEO plugin is active on a WordPress site, it adds a `yoast_head_json` field to the standard WordPress REST API responses at `/wp-json/wp/v2/posts` and `/wp-json/wp/v2/pages`. A FlutterFlow API Group targeting the WordPress REST API base URL can read post content and SEO metadata in one call for public posts — no authentication needed. Authenticated operations (editing meta fields, accessing private posts) require WordPress Application Passwords sent via Basic Auth, which must be proxied through a backend for security.
Prerequisites
- A WordPress site with the Yoast SEO plugin installed and activated (free version is sufficient)
- The WordPress REST API accessible at `https://yoursite.com/wp-json` — verify by opening this URL in a browser and seeing a JSON response
- Posts or pages published on the WordPress site (at least one, for testing)
- Optional: WordPress Application Passwords enabled (for authenticated operations only — Settings → General in newer WordPress versions, or a plugin for older versions)
- A FlutterFlow project with at least one screen where WordPress content will be displayed
Step-by-step guide
Verify the WordPress REST API and Yoast fields are accessible
Before building anything in FlutterFlow, confirm that your WordPress site's REST API is reachable and that Yoast's fields are present in the response. Open a web browser and navigate to `https://yoursite.com/wp-json/wp/v2/posts?per_page=1`. Replace `yoursite.com` with your actual WordPress domain. You should see a JSON response containing one post object. If you see an error like `rest_no_route` or a 404, the WordPress REST API may be disabled on your site — some security plugins (like Wordfence or iThemes Security) disable or restrict REST API access to prevent data exposure. Check your WordPress admin under the security plugin's settings and look for 'Disable REST API' or 'Restrict REST API' options. You may need to whitelist public post endpoints. If the API responds but you do not see a `yoast_head_json` field in the post object, the Yoast SEO plugin may not be active. Log in to your WordPress admin, go to Plugins, and confirm that Yoast SEO is installed and activated. After activating it, try the API URL again — Yoast injects its fields on every post response automatically once active, with no additional configuration needed. Look inside the response for a key named `yoast_head_json`. It should be a nested JSON object containing keys like `title`, `description`, `og_title`, `og_description`, `og_image`, `canonical`, and `schema`. These are the fields you will map to a FlutterFlow Data Type. If `yoast_head_json` is present in the browser response, you are ready to build the FlutterFlow integration.
Pro tip: Append `?context=view` to the API URL to see the full public response shape: `https://yoursite.com/wp-json/wp/v2/posts?per_page=1&context=view`. This is the same context FlutterFlow will use for unauthenticated reads.
Expected result: Visiting `https://yoursite.com/wp-json/wp/v2/posts?per_page=1` in a browser returns valid JSON with a `yoast_head_json` object inside the post data. You can see fields like `title`, `description`, and `og_image` inside that object.
Create a FlutterFlow API Group for the WordPress REST API
With the API confirmed working, set up the API Group in FlutterFlow that will fetch posts and their Yoast metadata. This API Group targets the WordPress REST API base URL of your specific site — every FlutterFlow project connecting to a different WordPress site will have a different base URL here. In FlutterFlow, click API Calls in the left navigation panel. Click + Add → Create API Group. Name it 'WordPress Content' (or your site name if you have multiple WordPress sites). Set the Base URL to `https://yoursite.com/wp-json` — replacing `yoursite.com` with your actual domain. Do not include a trailing slash. Click Save. Now click + Add → Create API Call inside the WordPress Content group. Set the Name to 'Get Posts'. Set the Method to GET and the Endpoint to `/wp/v2/posts`. In the Variables tab, click + Add Variable and create: `per_page` (Integer, default value `10`) for pagination page size, `page` (Integer, default value `1`) for page number, and `search` (String, default value `''`) for keyword filtering. In the Endpoint, use these as query parameters: `/wp/v2/posts?per_page={{ per_page }}&page={{ page }}&search={{ search }}`. You can also add a `fields` variable to request only specific fields and reduce response size: `/wp/v2/posts?_fields=id,title,date,slug,yoast_head_json,excerpt,featured_media&per_page={{ per_page }}&page={{ page }}`. Using `_fields` dramatically reduces the JSON payload size, which speeds up loading on mobile networks — recommended for production. Leave the Headers tab empty for public posts — unauthenticated reads of public WordPress content require no authentication headers. This keeps the FlutterFlow API Call completely public-safe with no secrets involved.
1{2 "method": "GET",3 "endpoint": "/wp/v2/posts",4 "query_params": {5 "_fields": "id,title,date,slug,excerpt,yoast_head_json,featured_media,link",6 "per_page": "{{ per_page }}",7 "page": "{{ page }}",8 "status": "publish"9 }10}Pro tip: The `_fields` parameter is one of the most valuable WordPress REST API optimizations for mobile apps. Including only the fields you actually use can reduce each response payload by 80-90%, which is significant on slower mobile connections.
Expected result: The Get Posts API Call in FlutterFlow shows a valid response with a list of post objects in the Test tab. Each post object includes a `yoast_head_json` field with nested SEO data visible in the response.
Parse the Yoast fields into a FlutterFlow Data Type
With the API Call returning data, use FlutterFlow's JSON Path tool to map the `yoast_head_json` fields into a custom Data Type that you can bind to widgets. This is where the Yoast data becomes usable across your app. In the Get Posts API Call, go to the Response & Test tab. Click the Test button, set `per_page` to `1` and `page` to `1`, then click Run Test. You will see the full API response in the Response Preview section. Click Generate JSON Paths — FlutterFlow will automatically parse the response structure and offer to generate JSON Path expressions for each field it finds. Look for paths related to `yoast_head_json`. The most useful ones to add are: `$[*].yoast_head_json.title` (the SEO title), `$[*].yoast_head_json.description` (the meta description), `$[*].yoast_head_json.og_image[0].url` (the Open Graph image URL), `$[*].yoast_head_json.og_description` (the OG description, often the same as description), and `$[*].yoast_head_json.canonical` (the canonical URL of the original post). Also add paths for the standard WordPress fields you need: `$[*].id` (post ID), `$[*].title.rendered` (the post's HTML title), `$[*].excerpt.rendered` (the post excerpt), `$[*].date` (publish date), `$[*].slug` (URL slug), and `$[*].link` (full URL). Click + Add Data Type and name it 'WordPressPost'. Add the following fields and map the JSON paths: `id` (Integer), `seo_title` (String — mapped from `yoast_head_json.title`), `seo_description` (String — mapped from `yoast_head_json.description`), `og_image_url` (String — mapped from `yoast_head_json.og_image[0].url`), `canonical_url` (String), `title` (String — from `title.rendered`), `excerpt` (String — from `excerpt.rendered`), `published_date` (String), `slug` (String), `post_url` (String). Save the Data Type. Your FlutterFlow widgets can now reference any of these fields directly when you bind the API Call as a Backend Query on a list or page.
Pro tip: WordPress returns HTML-encoded strings in fields like `title.rendered` and `excerpt.rendered` — for example, an ampersand appears as `&`. In FlutterFlow, use the `HtmlUnescape` function or strip HTML tags when displaying these fields as plain text in Text widgets.
Expected result: A 'WordPressPost' Data Type exists in FlutterFlow with fields mapped to both the standard WordPress post fields and the Yoast SEO fields from `yoast_head_json`. The Get Posts API Call shows a successful test response and all JSON Paths resolve to values.
Bind posts to a list widget and display Yoast SEO fields
With the Data Type and API Call configured, bind the WordPress posts query to a list widget on your app's content screen. This creates a live-updating feed of WordPress posts with their Yoast SEO metadata available on every card. Navigate to your posts list screen in FlutterFlow. Add a ListView widget to the screen. Click on the ListView, then in the right panel go to Backend Query → + Add Query. Select 'API Call', choose the WordPress Content group, and select Get Posts. Set `per_page` to `10` and `page` to `1`. In the Data Type mapping, select WordPressPost. The ListView is now populated with the API response. Inside the ListView, add child widgets for each card: an Image widget for the featured image (bind its Image Path to `og_image_url` from the Data Type), a Text widget for the post title (bind to `seo_title` from Yoast — this uses the SEO-optimized title rather than the raw post title, which is usually cleaner and shorter), and a second Text widget for the description (bind to `seo_description`). Add a published date Text widget (bind to `published_date`) and optionally a URL-copy button that copies `canonical_url` to the clipboard using FlutterFlow's built-in Copy to Clipboard action — useful for a content audit use case where users need to share the original article URL. For a content SEO audit dashboard, add a conditional border color to each card based on the length of `seo_description`: red border if empty (use an If condition: `seo_description == ''`), yellow if under 100 characters (`seo_description.length < 100`), green otherwise. This creates a visual audit tool without any server-side processing — all the logic runs on the parsed Yoast data in FlutterFlow.
Pro tip: The `yoast_head_json.title` field typically includes your site name as a suffix (e.g., 'How to Build an App | Your Site'). If you want just the page title without the site name, use `yoast_head_json.og_title` instead — it is usually the plain title without the site suffix.
Expected result: Your post list screen in FlutterFlow Run Mode shows real WordPress posts with their Yoast SEO titles and descriptions displayed in each card. The og_image appears as the card image. Pagination works by incrementing the `page` variable.
Add authenticated access for editing Yoast fields (optional — via Application Passwords proxy)
Reading public WordPress posts requires no authentication. However, if your app needs to display private posts, access draft content, or write Yoast meta fields back to WordPress, you need authenticated API calls using WordPress Application Passwords — and those credentials must be proxied through a backend. First, create a WordPress Application Password. In your WordPress admin, navigate to Users → Profile (or the admin user's profile page). Scroll to the Application Passwords section (available in WordPress 5.6+). Click Add New Application Password, give it a name like 'FlutterFlow App', and click Add New Application Password. WordPress generates a password in the format `XXXX XXXX XXXX XXXX XXXX XXXX` — copy it immediately, it is only shown once. The Application Password is used as HTTP Basic Auth: the username is your WordPress username, and the password is the Application Password (spaces can be included or removed, both work). This is a sensitive credential — it allows full authenticated access to the WordPress REST API under that user's permissions. Never put it in a FlutterFlow API Call header. Deploy a simple Cloud Function or Supabase Edge Function proxy that accepts POST requests from FlutterFlow with the desired WP API endpoint and any data, then forwards the request to WordPress with the Basic Auth header injected server-side. Store the WordPress username and Application Password as environment secrets in Firebase or Supabase, not in the proxy source code. In FlutterFlow, create a second API Group named 'WordPress Authenticated' pointing to your proxy URL. This group handles private or write operations while the public 'WordPress Content' group handles all public reads without a proxy. If you need help configuring the authenticated proxy or building the SEO audit dashboard against your WordPress site, RapidDev's team works with headless WordPress setups regularly and offers a free scoping call at rapidevelopers.com/contact.
1// Firebase Cloud Function: WordPress authenticated API proxy2// Handles private posts and write operations needing Basic Auth3const functions = require('firebase-functions');4const fetch = require('node-fetch');5const btoa = (str) => Buffer.from(str).toString('base64');67exports.wpAuthProxy = functions.https.onRequest(async (req, res) => {8 res.set('Access-Control-Allow-Origin', '*');9 res.set('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE');10 res.set('Access-Control-Allow-Headers', 'Content-Type');11 if (req.method === 'OPTIONS') { res.status(204).send(''); return; }1213 const WP_USERNAME = process.env.WP_USERNAME;14 const WP_APP_PASSWORD = process.env.WP_APP_PASSWORD;15 const WP_BASE_URL = process.env.WP_BASE_URL; // e.g. https://yoursite.com/wp-json1617 const { endpoint, method = 'GET', body } = req.body;18 if (!endpoint) { res.status(400).json({ error: 'endpoint required' }); return; }1920 const credentials = btoa(`${WP_USERNAME}:${WP_APP_PASSWORD}`);2122 try {23 const wpRes = await fetch(`${WP_BASE_URL}${endpoint}`, {24 method,25 headers: {26 'Authorization': `Basic ${credentials}`,27 'Content-Type': 'application/json',28 },29 body: body ? JSON.stringify(body) : undefined,30 });31 const data = await wpRes.json();32 res.status(wpRes.status).json(data);33 } catch (err) {34 res.status(500).json({ error: err.message });35 }36});Pro tip: Application Passwords can be scoped by creating a dedicated WordPress user with limited roles (like Contributor or Editor) rather than using an Administrator account. This limits the damage if the credential is ever compromised.
Expected result: Your authenticated proxy is deployed. When tested from Postman with `{ "endpoint": "/wp/v2/posts?status=draft", "method": "GET" }`, it returns draft posts that are not visible in the unauthenticated API. The 'WordPress Authenticated' API Group in FlutterFlow successfully fetches private content.
Common use cases
Headless WordPress app that displays blog posts with SEO metadata
A FlutterFlow news or blog app pulls posts from a WordPress site via the REST API, displaying the title, content, featured image, and category alongside the Yoast-provided SEO description as a post summary. The app uses `yoast_head_json.og_image[0].url` for the post's social preview image and `yoast_head_json.description` as the excerpt in list views — no separate excerpt field needed.
Build a scrollable post list screen that shows each WordPress post's featured image, title, and Yoast meta description. Tapping a post opens a detail screen with the full post content and the canonical URL from Yoast so users can share the original web page.
Copy this prompt to try it in FlutterFlow
Content SEO audit dashboard for a marketing team
A FlutterFlow internal admin app pulls all WordPress posts and flags ones with missing or too-short Yoast meta descriptions. The dashboard shows a color-coded list — green for posts with complete SEO fields, yellow for short descriptions (under 100 characters), red for missing descriptions (empty `yoast_head_json.description`). Marketing team members can tap into each post to see the current Yoast fields and copy-paste improvements to make in WordPress.
Create an audit screen that fetches all blog posts and shows a list with each post's title, word count, and a status badge: 'Missing description' if yoast_head_json.description is empty, 'Short description' if it is under 100 characters, and 'Good' otherwise. Sort by status so missing ones appear first.
Copy this prompt to try it in FlutterFlow
Multi-platform content app that syncs WordPress SEO fields to app store metadata
A FlutterFlow content production app used by an editorial team reads Yoast SEO fields from WordPress posts and displays them alongside suggested App Store descriptions and social media copy for each content piece. The team uses the app to review and approve SEO titles before a post goes live, with the ability to compare the Yoast title against character limits.
Build a review screen that shows the WordPress post title, the Yoast SEO title and description, and a character count badge (red if title is over 60 characters or description is over 155 characters). Show the og_image preview image and a link to the WordPress edit URL.
Copy this prompt to try it in FlutterFlow
Troubleshooting
The WordPress REST API returns 404 or a generic error page at `/wp-json`
Cause: The WordPress REST API is disabled or restricted by a security plugin (Wordfence, iThemes Security, All In One WP Security), a custom `functions.php` modification, or Nginx/Apache server rules blocking the `/wp-json` route.
Solution: Log in to your WordPress admin and check any active security plugins for settings like 'Disable REST API', 'Restrict REST API access', or 'Block unauthenticated REST API requests'. For Wordfence, check Firewall → All Firewall Options. Alternatively, add the exception in the security plugin to allow public access to the `/wp-json/wp/v2/posts` endpoint. If using a caching plugin, clear the cache after making changes.
`yoast_head_json` field is missing from the WordPress REST API response
Cause: The Yoast SEO plugin is not installed, not activated, or has been configured to not expose its fields via the REST API. Some Yoast configurations or custom code may filter out the yoast_head_json field.
Solution: In WordPress admin, go to Plugins → Installed Plugins and confirm Yoast SEO appears and is marked 'Active'. If it is active but the field is missing, check if any code in your theme's functions.php contains `add_filter('rest_prepare_post', ...)` that might strip fields from the response. Also check if any other SEO plugin (like Rank Math or All in One SEO) is active simultaneously — plugin conflicts can suppress Yoast's REST API output.
FlutterFlow API Call returns 401 Unauthorized for posts that should be public
Cause: The WordPress site has the REST API restricted to authenticated users only via a plugin or functions.php filter, or the post status is something other than 'publish' (drafts and private posts require authentication).
Solution: For public posts, the REST API should work without any authentication headers. Remove any Authorization headers from your FlutterFlow API Group for public reads. Add `&status=publish` to your query parameters to ensure you are only requesting published posts. If you need draft access, that requires the authenticated proxy described in Step 5.
No route found for `/wp-json/yoast/v1/` — endpoint does not exist
Cause: There is no Yoast-specific REST API endpoint. This is a very common beginner mistake — Yoast does not register its own `yoast/v1` namespace. The Yoast data exists only as a field inside the standard WordPress post/page response.
Solution: Change your API Call endpoint from any `/yoast/` path to `/wp/v2/posts` (or `/wp/v2/pages` for pages). The Yoast SEO fields appear inside the response under the `yoast_head_json` key — use the JSON Path `$.yoast_head_json.title` (for a single post) or `$[*].yoast_head_json.title` (for a list) to access the data.
Best practices
- Use the `_fields` query parameter in your WordPress REST API calls to request only the fields you need — including only `id,title,slug,yoast_head_json,excerpt,date` can reduce response sizes by 80%+ and speeds up loading on mobile networks.
- Use `yoast_head_json.og_title` for display titles in your app rather than `yoast_head_json.title` — the OG title is usually the clean post title without the site name suffix that appears in the full SEO title field.
- Always check `yoast_head_json.description` for emptiness before displaying it — posts with no Yoast meta description will have an empty string or null, which should show a fallback excerpt from `excerpt.rendered` instead.
- Keep public post reads as direct FlutterFlow API Calls (no proxy needed) — only authenticated operations (drafts, private posts, write operations) need a proxy, and mixing the two unnecessarily adds latency.
- Implement infinite scroll pagination using the `page` variable — WordPress REST API returns the total page count in the `X-WP-TotalPages` response header, which you can use to disable the 'Load More' button when you reach the last page.
- Cache the post list in FlutterFlow's local state or a Supabase table for offline reading — WordPress blog content changes infrequently, and caching avoids repeated API calls when users browse back to the list screen.
- Use `yoast_head_json.canonical` as the shareable URL when users tap 'Share Post' — this ensures shared links point to the canonical web version of the content, not a drafts or staging URL.
- Strip HTML from `excerpt.rendered` when displaying as plain text — WordPress excerpts often contain `<p>` tags that appear as literal text in FlutterFlow Text widgets; use a regex or the HtmlUnescape function.
Alternatives
Use the generic WordPress integration if you primarily need post content, media, and taxonomy data without a specific focus on Yoast SEO metadata — this page focuses specifically on reading and using the `yoast_head_json` SEO fields.
Choose Google Ads if you need paid search performance data and campaign metrics for an internal marketing dashboard rather than pulling organic content from a WordPress CMS.
Choose HubSpot if you need a CMS with built-in CRM and marketing automation rather than WordPress — HubSpot's CMS Hub has its own content API with SEO recommendations built in.
Frequently asked questions
Is there a dedicated Yoast SEO API endpoint I should use?
No — and this is the most common misconception. Yoast SEO does not register a `/wp-json/yoast/v1/` namespace or any standalone endpoint. When Yoast is active, it adds its data as an additional field (`yoast_head_json`) inside the standard WordPress REST API responses at `/wp-json/wp/v2/posts` and `/wp-json/wp/v2/pages`. Always use the standard WordPress REST API routes.
Can I update Yoast SEO fields (title, description) via the WordPress REST API from FlutterFlow?
Yes, but it requires authenticated requests via WordPress Application Passwords, and those must be proxied through a backend (never in a FlutterFlow API Call header). Yoast meta fields are stored as WordPress post meta, so you would PATCH the post endpoint with the Yoast meta key values. The specific meta keys to target are `_yoast_wpseo_title` and `_yoast_wpseo_metadesc`. This is an advanced use case — most FlutterFlow apps only read Yoast data, not write it.
Does reading Yoast data from the WordPress REST API require Yoast Premium?
No — the `yoast_head_json` field is available in the free Yoast SEO plugin. Yoast Premium adds redirect management, multiple focus keywords, and social previews in the admin interface, but does not add new REST API fields. All the useful metadata (title, description, og_image, canonical, schema) is present in the free version.
What should I display when a post has an empty Yoast meta description?
Use a conditional in FlutterFlow to check if `seo_description` is empty, and fall back to the post's `excerpt.rendered` field. Strip HTML tags from the excerpt before displaying it as plain text. Many WordPress sites have posts where the Yoast meta description is not filled in, so this fallback handling is important for a complete user experience.
Can FlutterFlow read Yoast data from WordPress pages as well as posts?
Yes — the `yoast_head_json` field appears in WordPress Pages responses as well, accessible at `/wp-json/wp/v2/pages`. Create a separate 'Get Pages' API Call in your WordPress Content API Group targeting `/wp/v2/pages` with the same `_fields` parameters. The JSON Path structure for extracting Yoast fields is identical to the posts endpoint.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation