{"id":1104,"date":"2026-05-08T13:56:16","date_gmt":"2026-05-08T05:56:16","guid":{"rendered":"https:\/\/witlab.ph\/blog\/?p=1104"},"modified":"2026-05-08T13:56:18","modified_gmt":"2026-05-08T05:56:18","slug":"automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api","status":"publish","type":"post","link":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/","title":{"rendered":"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why automate this<\/h2>\n\n\n\n<p>Posting a daily English-learning card on Facebook sounds tiny \u2014 pick a phrase, write a meaning in Burmese, add three example sentences, attach an illustration, publish. Multiply that by 365 and the only sustainable answer is to automate the entire pipeline. The objective for this project was exactly that: fully automate generation, persistence, and Facebook publishing of daily learning content, on a stack we already trust \u2014 Laravel Actions, structured AI agents, image generation, and the Facebook Graph API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">System architecture<\/h2>\n\n\n\n<p>The system is split into three deliberately thin layers so each one can be tested and replaced in isolation.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Application layer.<\/strong> <code>GenerateDailyVocabulary<\/code> is the orchestrator action. The <code>DailyVocabulary<\/code> Eloquent model stores the final record. <code>FacebookService<\/code> owns the publish call and nothing else.<\/li>\n\n\n\n<li><strong>AI layer.<\/strong> An <code>EnglishTeacher<\/code> agent returns structured fields (not free text). Image generation reuses a phrase-aligned prompt produced by the same agent, so the picture and the wording stay coherent. The output format is schema-driven from the start.<\/li>\n\n\n\n<li><strong>External layer.<\/strong> The Facebook Graph API endpoint <code>\/{page-id}\/photos<\/code> is the only outbound integration. It needs a valid Page token and the right permissions, and any error is surfaced through the Laravel log so we can diagnose without re-running the agent.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The data contract<\/h2>\n\n\n\n<p>The agent response is treated like an API payload, not a chat reply. The schema has five tagged fields: <code>phrase<\/code>, <code>content_type<\/code>, <code>localized_meaning<\/code>, <code>example_sentences<\/code> (exactly 3), and <code>image_prompt<\/code>.<\/p>\n\n\n\n<p><code>content_type<\/code> uses a strict allow-list: <code>phrasal_verb<\/code>, <code>idiom<\/code>, <code>collocation<\/code>, <code>expression<\/code>, <code>noun<\/code>, <code>verb<\/code>, <code>adjective<\/code>, <code>adverb<\/code>. That single field then drives:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the dynamic post title (e.g. &#8220;Phrasal Verb of the Day&#8221;),<\/li>\n\n\n\n<li>the type-specific hashtag,<\/li>\n\n\n\n<li>and the layout choices in the caption builder.<\/li>\n<\/ul>\n\n\n\n<p>Forcing <code>example_sentences<\/code> to be exactly three keeps the post layout predictable, which means the caption template never has to branch on count. Schema constraints like these are the single biggest reason we can skip brittle parsing logic and runtime formatting fallbacks.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">End-to-end flow<\/h2>\n\n\n\n<p>The action runs eight steps in a fixed order:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Trigger.<\/strong> The route <code>\/ai\/daily-vocabulary<\/code> invokes <code>GenerateDailyVocabulary<\/code>.<\/li>\n\n\n\n<li><strong>Generate.<\/strong> Request a structured payload from <code>EnglishTeacher<\/code>.<\/li>\n\n\n\n<li><strong>Deduplicate.<\/strong> Check whether the phrase already exists using a case-insensitive query.<\/li>\n\n\n\n<li><strong>Create image.<\/strong> Render a square image using the agent&#8217;s <code>image_prompt<\/code>.<\/li>\n\n\n\n<li><strong>Store image.<\/strong> Save it to the <code>public<\/code> disk and capture the URL\/path.<\/li>\n\n\n\n<li><strong>Persist.<\/strong> Insert phrase, content type, meaning, examples, prompts, and image URL into the database.<\/li>\n\n\n\n<li><strong>Build caption.<\/strong> Pick a style variant and format the sections.<\/li>\n\n\n\n<li><strong>Publish.<\/strong> Upload the image and caption to the Graph API.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Caption generation<\/h2>\n\n\n\n<p>The caption builder has two halves: a strict format spec and a small safety net.<\/p>\n\n\n\n<p><strong>Required behaviors<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Header: <code>{Type} of the Day: {Phrase}<\/code>.<\/li>\n\n\n\n<li>A Burmese meaning block with a labeled section.<\/li>\n\n\n\n<li>An examples block with a blank line between each example, so it reads cleanly on Facebook.<\/li>\n\n\n\n<li>Style variants rotate (emoji header, bullet examples, a CTA, a base hashtag set) so the feed never looks copy-pasted.<\/li>\n\n\n\n<li>The type hashtag is mapped from <code>content_type<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Fallback and safety<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Any invalid <code>content_type<\/code> falls back to <code>expression<\/code> instead of throwing.<\/li>\n\n\n\n<li>The mapping uses a strict allow-list, so we cannot accidentally publish a label like &#8220;Verb_phrase of the Day&#8221; if the agent drifts.<\/li>\n\n\n\n<li>Every final post still includes the campaign hashtags plus the type hashtag.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">A real generated post<\/h2>\n\n\n\n<p>This is a verbatim runtime sample of what gets pushed to the Page:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\ud83d\udcda Phrasal Verb of the Day: Run Out Of\n\n\ud83c\uddf2\ud83c\uddf2 Meaning (\u1021\u1013\u102d\u1015\u1039\u1015\u102c\u101a\u103a):\n\u1010\u1005\u103a\u1001\u102f\u1001\u102f \u1000\u102f\u1014\u103a\u101e\u103d\u102c\u1038\u101e\u100a\u103a (\u101e\u102d\u102f\u1037) \u1015\u103c\u1010\u103a\u101c\u1015\u103a\u101e\u103d\u102c\u1038\u101e\u100a\u103a\u104b\n\n\ud83d\udcdd Examples (\u1025\u1015\u1019\u102c \u1005\u102c\u1000\u103c\u1031\u102c\u1004\u103a\u1038\u1019\u103b\u102c\u1038):\n\n\ud83d\udd39 We have run out of milk, so I need to go to the grocery store.\n\n\ud83d\udd39 We need to make a decision soon because we are running out of time.\n\n\ud83d\udd39 My phone just ran out of battery, so I could not call you.\n\n\u2728 Save this post and try using it in your conversation today!\n\n#LearnEnglishDaily #PhrasalVerbOfTheDay\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Database and storage<\/h2>\n\n\n\n<p>The <code>DailyVocabulary<\/code> row keeps everything we need to either re-render the post later or audit what the agent produced:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>phrase<\/code> (unique)<\/li>\n\n\n\n<li><code>content_type<\/code><\/li>\n\n\n\n<li><code>localized_meaning<\/code><\/li>\n\n\n\n<li><code>example_sentences<\/code> (stored as JSON)<\/li>\n\n\n\n<li><code>image_prompt<\/code><\/li>\n\n\n\n<li><code>image_url<\/code><\/li>\n<\/ul>\n\n\n\n<p>The image file itself lives under <code>storage\/app\/public\/vocabulary<\/code>. The public URL is generated from the disk configuration, and the relative path is what we hand to the Facebook upload as the multipart <code>source<\/code>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Facebook integration<\/h2>\n\n\n\n<p>The publish call is intentionally small.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Endpoint: <code>https:\/\/graph.facebook.com\/v25.0\/{page-id}\/photos<\/code><\/li>\n\n\n\n<li>Multipart payload:\n<ul class=\"wp-block-list\">\n<li>    <code>source<\/code> \u2014 the image binary,<\/li>\n\n\n\n<li><code>caption<\/code> \u2014 the final formatted text,<\/li>\n\n\n\n<li><code>access_token<\/code> \u2014 the Page token.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Configuration is read from <a href=\"config\/services.php\">config\/services.php<\/a>, which in turn reads <code>.env<\/code>.<\/li>\n\n\n\n<li>Success returns the Facebook response JSON and the action continues gracefully.<\/li>\n\n\n\n<li>Failure logs both the HTTP status and the response body, so diagnosing a bad token or a missing permission does not require re-running the agent.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Permissions and Meta compliance<\/h2>\n\n\n\n<p>The Page token needs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pages_show_list<\/code><\/li>\n\n\n\n<li><code>pages_manage_posts<\/code><\/li>\n<\/ul>\n\n\n\n<p>Avoid the deprecated <code>publish_actions<\/code> permission \u2014 it is no longer accepted. On the Meta App side, the app must also expose:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a public HTTPS Privacy Policy URL,<\/li>\n\n\n\n<li>a Data Deletion Instructions or Callback URL,<\/li>\n\n\n\n<li>and no <code>localhost<\/code> or private URLs in app settings.<\/li>\n<\/ul>\n\n\n\n<p>These three are easy to forget on the first submission and are the most common reason the app gets rejected during review.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo runbook<\/h2>\n\n\n\n<p>The exact sequence used for a live demo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1) php artisan migrate<\/li>\n\n\n\n<li>2) php artisan serve<\/li>\n\n\n\n<li>3) Open: http:\/\/127.0.0.1:8000\/ai\/daily-vocabulary<\/li>\n\n\n\n<li>4) php artisan tinker<\/li>\n\n\n\n<li>App\\Models\\DailyVocabulary::latest()->first([&#8216;phrase&#8217;,&#8217;content_type&#8217;,&#8217;image_url&#8217;]);<\/li>\n\n\n\n<li>5) tail -f storage\/logs\/laravel.log<\/li>\n<\/ul>\n\n\n\n<p>During the walkthrough it helps to point out three things in order: the generated card in the browser, the matching DB row with <code>content_type<\/code> and <code>image_url<\/code>, and the success\/failure entry in the log for the Facebook step.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons learned<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Schema-first AI removes whole classes of bugs.<\/strong> Treating the agent response like an API payload (<code>phrase<\/code>, <code>content_type<\/code>, <code>localized_meaning<\/code>, <code>example_sentences<\/code>, <code>image_prompt<\/code>) means the caption builder never has to guess.<\/li>\n\n\n\n<li><strong>Allow-lists beat string matching.<\/strong> A strict <code>content_type<\/code> allow-list with an <code>expression<\/code> fallback keeps the post header sane even when the model drifts.<\/li>\n\n\n\n<li><strong>Log the bad path loudly.<\/strong> Logging the Graph API status and response body on failure turns &#8220;the cron broke&#8221; into a 30-second diagnosis instead of a re-run.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Why automate this Posting a daily English-learning card on Facebook sounds tiny \u2014 pick a phrase, write a meaning in Burmese, add three example sentences, attach an illustration, publish. Multiply that by 365 and the only sustainable answer is to automate the entire pipeline. The objective for this project was exactly that: fully automate generation, [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":1109,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-1104","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-system"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API - WIT LAB %<\/title>\n<meta name=\"description\" content=\"We excel in utilizing cutting-edge technology, programming languages, and frameworks to deliver high-quality digital solutions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API - WIT LAB %\" \/>\n<meta property=\"og:description\" content=\"We excel in utilizing cutting-edge technology, programming languages, and frameworks to deliver high-quality digital solutions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\" \/>\n<meta property=\"og:site_name\" content=\"WIT LAB\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/people\/WIT-LAB\/61567795364273\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-08T05:56:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-08T05:56:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"366\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Thuta Yar Moe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thuta Yar Moe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\"},\"author\":{\"name\":\"Thuta Yar Moe\",\"@id\":\"https:\/\/witlab.ph\/blog\/#\/schema\/person\/9a653900ccc3f52126d3e372603f3617\"},\"headline\":\"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API\",\"datePublished\":\"2026-05-08T05:56:16+00:00\",\"dateModified\":\"2026-05-08T05:56:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\"},\"wordCount\":864,\"publisher\":{\"@id\":\"https:\/\/witlab.ph\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png\",\"articleSection\":[\"System\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\",\"url\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\",\"name\":\"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API - WIT LAB %\",\"isPartOf\":{\"@id\":\"https:\/\/witlab.ph\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png\",\"datePublished\":\"2026-05-08T05:56:16+00:00\",\"dateModified\":\"2026-05-08T05:56:18+00:00\",\"description\":\"We excel in utilizing cutting-edge technology, programming languages, and frameworks to deliver high-quality digital solutions.\",\"breadcrumb\":{\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage\",\"url\":\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png\",\"contentUrl\":\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png\",\"width\":700,\"height\":366},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/witlab.ph\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/witlab.ph\/blog\/#website\",\"url\":\"https:\/\/witlab.ph\/blog\/\",\"name\":\"WIT LAB\",\"description\":\"Web Development\",\"publisher\":{\"@id\":\"https:\/\/witlab.ph\/blog\/#organization\"},\"alternateName\":\"WIT LAB INC\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/witlab.ph\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/witlab.ph\/blog\/#organization\",\"name\":\"WIT LAB INC\",\"alternateName\":\"Spiceworks (Japan)\",\"url\":\"https:\/\/witlab.ph\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/witlab.ph\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2024\/09\/logo_witlab-Copy-Copy.png\",\"contentUrl\":\"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2024\/09\/logo_witlab-Copy-Copy.png\",\"width\":681,\"height\":616,\"caption\":\"WIT LAB INC\"},\"image\":{\"@id\":\"https:\/\/witlab.ph\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/people\/WIT-LAB\/61567795364273\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/witlab.ph\/blog\/#\/schema\/person\/9a653900ccc3f52126d3e372603f3617\",\"name\":\"Thuta Yar Moe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/witlab.ph\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b2af6b0444bf2ed0e9bc446ac7ee374a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b2af6b0444bf2ed0e9bc446ac7ee374a?s=96&d=mm&r=g\",\"caption\":\"Thuta Yar Moe\"},\"url\":\"https:\/\/witlab.ph\/blog\/author\/thuta\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API - WIT LAB %","description":"We excel in utilizing cutting-edge technology, programming languages, and frameworks to deliver high-quality digital solutions.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/","og_locale":"en_US","og_type":"article","og_title":"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API - WIT LAB %","og_description":"We excel in utilizing cutting-edge technology, programming languages, and frameworks to deliver high-quality digital solutions.","og_url":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/","og_site_name":"WIT LAB","article_publisher":"https:\/\/www.facebook.com\/people\/WIT-LAB\/61567795364273\/","article_published_time":"2026-05-08T05:56:16+00:00","article_modified_time":"2026-05-08T05:56:18+00:00","og_image":[{"width":700,"height":366,"url":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png","type":"image\/png"}],"author":"Thuta Yar Moe","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Thuta Yar Moe","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#article","isPartOf":{"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/"},"author":{"name":"Thuta Yar Moe","@id":"https:\/\/witlab.ph\/blog\/#\/schema\/person\/9a653900ccc3f52126d3e372603f3617"},"headline":"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API","datePublished":"2026-05-08T05:56:16+00:00","dateModified":"2026-05-08T05:56:18+00:00","mainEntityOfPage":{"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/"},"wordCount":864,"publisher":{"@id":"https:\/\/witlab.ph\/blog\/#organization"},"image":{"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage"},"thumbnailUrl":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png","articleSection":["System"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/","url":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/","name":"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API - WIT LAB %","isPartOf":{"@id":"https:\/\/witlab.ph\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage"},"image":{"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage"},"thumbnailUrl":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png","datePublished":"2026-05-08T05:56:16+00:00","dateModified":"2026-05-08T05:56:18+00:00","description":"We excel in utilizing cutting-edge technology, programming languages, and frameworks to deliver high-quality digital solutions.","breadcrumb":{"@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#primaryimage","url":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png","contentUrl":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2026\/05\/cover_automating_daily_vocabulary_posts_with_laravel_structured_ai_and_the_facebook_Graph_API.png","width":700,"height":366},{"@type":"BreadcrumbList","@id":"https:\/\/witlab.ph\/blog\/automating-daily-vocabulary-posts-with-laravel-structured-ai-and-the-facebook-graph-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/witlab.ph\/blog\/"},{"@type":"ListItem","position":2,"name":"Automating Daily Vocabulary Posts with Laravel, Structured AI, and the Facebook Graph API"}]},{"@type":"WebSite","@id":"https:\/\/witlab.ph\/blog\/#website","url":"https:\/\/witlab.ph\/blog\/","name":"WIT LAB","description":"Web Development","publisher":{"@id":"https:\/\/witlab.ph\/blog\/#organization"},"alternateName":"WIT LAB INC","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/witlab.ph\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/witlab.ph\/blog\/#organization","name":"WIT LAB INC","alternateName":"Spiceworks (Japan)","url":"https:\/\/witlab.ph\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/witlab.ph\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2024\/09\/logo_witlab-Copy-Copy.png","contentUrl":"https:\/\/witlab.ph\/blog\/wp-content\/uploads\/2024\/09\/logo_witlab-Copy-Copy.png","width":681,"height":616,"caption":"WIT LAB INC"},"image":{"@id":"https:\/\/witlab.ph\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/people\/WIT-LAB\/61567795364273\/"]},{"@type":"Person","@id":"https:\/\/witlab.ph\/blog\/#\/schema\/person\/9a653900ccc3f52126d3e372603f3617","name":"Thuta Yar Moe","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/witlab.ph\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b2af6b0444bf2ed0e9bc446ac7ee374a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b2af6b0444bf2ed0e9bc446ac7ee374a?s=96&d=mm&r=g","caption":"Thuta Yar Moe"},"url":"https:\/\/witlab.ph\/blog\/author\/thuta\/"}]}},"_links":{"self":[{"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/posts\/1104"}],"collection":[{"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/comments?post=1104"}],"version-history":[{"count":4,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/posts\/1104\/revisions"}],"predecessor-version":[{"id":1108,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/posts\/1104\/revisions\/1108"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/media\/1109"}],"wp:attachment":[{"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/media?parent=1104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/categories?post=1104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/witlab.ph\/blog\/wp-json\/wp\/v2\/tags?post=1104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}