{"id":13800,"date":"2022-05-27T07:00:46","date_gmt":"2022-05-27T05:00:46","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=13800"},"modified":"2023-02-16T14:42:46","modified_gmt":"2023-02-16T13:42:46","slug":"salesforce-functions-what-should-you-know-about-them","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/salesforce-functions-what-should-you-know-about-them\/","title":{"rendered":"Salesforce Functions \u2013 what should you know about them?"},"content":{"rendered":"<p>There are some tasks Salesforce platform was simply not built for. There are limits to processing large data volumes or generating files. Even though these tasks are not usually necessary in CRM systems, there are still a lot of cases where apex and VisualForce are just not enough.<!--more--> Salesforce Functions is great for bypassing these limitations. From my observations, not a lot of Salesforce developers know the capabilities of this powerful tool. If you want to know how to make the impossible possible in Salesforce, keep reading \u2013 it might be your way to shine next time the Product Owner brings up a challenging requirement.<\/p>\n<p><strong>Salesforce functions<\/strong> let developers integrate with the Salesforce Platform <strong>with no complex infrastructure<\/strong>. The hassle you usually have to deal with when building an integration is not a concern here \u2013 you don\u2019t have to create connected apps, integration users or allowlist IPs. Under the hood, it runs on Heroku. You get to choose the language (JavaScript, TypeScript, Java) and use open-source libraries. Anything that is possible in the language of your choice, is possible for Salesforce Functions. All you have to worry about are the Apex, API and Function Execution limits.<\/p>\n<p>Salesforce Functions are deployed to, and run in, a secure Salesforce-managed infrastructure separate from your Salesforce org. You can invoke Functions directly from Apex (Invocable Apex in case of Flow).<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-13802\" src=\"https:\/\/siiwebsite-uat.siitest.pl\/blog\/wp-content\/uploads\/2022\/05\/Blank-diagram-6-1.png\" alt=\"\" width=\"800\" height=\"430\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Blank-diagram-6-1.png 1765w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Blank-diagram-6-1-300x161.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Blank-diagram-6-1-1024x551.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Blank-diagram-6-1-768x413.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Blank-diagram-6-1-1536x826.png 1536w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<h2>Use cases<\/h2>\n<p>You might have already thought about some of the cases when such functionality comes in handy. The possibilities are countless! I cannot create an exhaustive list of all Salesforce Functions use cases. There are so many options, even Salesforce hasn\u2019t explored all of them yet! I did, however, list some of the most used ones below:<\/p>\n<ul>\n<li>ETL Processing,<\/li>\n<li>Heavy Asynchronous processes,<\/li>\n<li>Generating files,<\/li>\n<li>Using external libraries,<\/li>\n<li>Bypassing Apex Limits.<\/li>\n<\/ul>\n<p>Moving these heavy processes outside of the Salesforce platform is sometimes necessary due to technological and functional limitations, but it\u2019s never been this straightforward before!<\/p>\n<h2>Setup<\/h2>\n<p>If you\u2019re anything like me, you\u2019ve probably had enough of hollow theorizing. Let\u2019s start the engineering part, then!<\/p>\n<p>First things first, before you will be able to use Salesforce Functions, you need to purchase the Functions License. Once you have it, you can start the setup process.<\/p>\n<p>There are three major things to do there: You need to set up your dev environment, configure your org and set up permissions. Let me explain in more detail.<\/p>\n<h3>Dev Environment setup<\/h3>\n<ul>\n<li>Time for big decisions \u2013 <strong>choose the language<\/strong> you want to use! There are a few options when it comes to working with Salesforce Functions:\n<ul>\n<li><strong>js<\/strong> 14 or higher to developer Functions that use <strong>JavaScript <\/strong>or <strong>TypeScript,<\/strong><\/li>\n<li><strong>OpenJDK<\/strong> 8 or higher and<strong> Apache Maven<\/strong>6.3 or higher to developer Functions that use <strong>Java.<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Once you are ready to make a commitment, <strong>install<\/strong> the language. It\u2019s official now!<\/p>\n<ul>\n<li>On top of your language of choice, you will definitely need<strong> GIT CLI<\/strong>. Install it if you haven\u2019t already.<\/li>\n<li>One more thing that will be necessary is of course the <strong>Salesforce CLI<\/strong>. If you have managed to read this far despite not having it installed on your device, do it now!<\/li>\n<\/ul>\n<h3>Org configuration<\/h3>\n<ul>\n<li>Enable <strong>Dev Hub<\/strong> in production, sandbox, or Developer Edition org.<\/li>\n<li>Enable <strong>Salesforce Functions<\/strong> to create an authenticated connection for requests between your org and Salesforce Functions.<\/li>\n<li>Go to Setup &gt; Functions. You will see two toggles there: <strong>Enable Test Space<\/strong> and <strong>Enable Production Space<\/strong>. Be sure to switch them both on.<\/li>\n<\/ul>\n<h4><img decoding=\"async\" class=\"aligncenter wp-image-13803\" src=\"https:\/\/siiwebsite-uat.siitest.pl\/blog\/wp-content\/uploads\/2022\/05\/Setup-Functions.png\" alt=\"\" width=\"800\" height=\"355\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Setup-Functions.png 1029w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Setup-Functions-300x133.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Setup-Functions-1024x454.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Setup-Functions-768x340.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/h4>\n<h3>Set up permissions<\/h3>\n<ul>\n<li>For developers to work with functions, they will need certain permissions granted to them. There are a few <strong>permission sets<\/strong> you can assign to them. Check out the guidelines below if you\u2019re not sure as to which are necessary:<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-table has-t-4-font-size\"><table><thead><tr><th>Permission Set Name<\/th><th>Lets the user\u2026<\/th><th>Required System Permissions<\/th><\/tr><\/thead><tbody><tr><td>FunctionsAccess<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use Functions services and functionality. &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Access any functionality that relies on the Heroku platform including login through CLI.<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Deploy Functions to Scratch and Sandbox Orgs.<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compute Access<\/td><\/tr><tr><td>FunctionsProdAccess<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Perform any actions that require access to a production space. &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Deploy Functions-related metadata in your Salesforce Org.<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compute Production Access &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customize Application<\/td><\/tr><tr><td>FunctionsAdminAccess<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manually deploy Functions to your Production Space. &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manage Permission Sets.<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compute Production Access &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manage Custom Permissions<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manage Session Permission Set Activations<\/td><\/tr><tr><td>SalesforceDXAccess<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create and manage scratch orgs. &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add new Apex classes for Functions.<\/td><td>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; API Enabled &nbsp;<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Author Apex<br>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manage Sandboxes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<h2>Development<\/h2>\n<p>Now that we have laid the groundwork, it\u2019s time for the exciting part: Salesforce Functions development. There are just a few commands you need to run before we start. You will only run them the first time you start, so just in case you wanted to memorize them \u2013 don\u2019t.<\/p>\n<ul>\n<li>Log in and Set an Alias to Your Dev Hub<\/li>\n<\/ul>\n<pre style=\"padding-left: 40px;\">sf login org --alias ORG_NAME --set-default-dev-hub<\/pre>\n<ul>\n<li>Authenticate the CLI with Salesforce Functions<\/li>\n<\/ul>\n<pre style=\"padding-left: 40px;\">sf login functions<\/pre>\n<ul>\n<li>[Scratch Org only] Create your Scratch Org<\/li>\n<\/ul>\n<pre style=\"padding-left: 40px;\">sfdx force:org:create -s -f config\/project-scratch-def.json -a MyScratchOrgAlias<\/pre>\n<ul>\n<li>Create a Compute Environment to deploy the functions and connect it to your org:<\/li>\n<\/ul>\n<pre style=\"padding-left: 40px;\">sfdx env create compute -o ORG_NAME -a COMPUTE_ENV_ALIAS<\/pre>\n<p>All set now! You can create your first Function.It really is way easier than you think. Just run the below commands and follow the steps. Some commands will be provided in two or three alternatives &#8211; for the terminal command line, for the VSC command line and for VSC UI buttons.<\/p>\n<h3>Create function<\/h3>\n<p>The most profound part of the process &#8211; to make the Function come into existence!<\/p>\n<pre>sf generate function -n functionname -l javascript\nor\nCtrl + Shift + P &gt; SFDX:Create Function<\/pre>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-13804\" src=\"https:\/\/siiwebsite-uat.siitest.pl\/blog\/wp-content\/uploads\/2022\/05\/create-function.png\" alt=\"\" width=\"631\" height=\"76\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/create-function.png 631w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/create-function-300x36.png 300w\" sizes=\"(max-width: 631px) 100vw, 631px\" \/><\/p>\n<h3>Test function locally<\/h3>\n<p>If you\u2019re a skeptic, here\u2019s how to verify it works:<\/p>\n<ul>\n<li>First, run the function\n<pre>Ctrl + Shift + P &gt; SFDX: Start Function\nor\nSf run function start (executed from the function directory<\/pre>\n<\/li>\n<li>Now Invoke it with a test payload\n<ul>\n<li>Create a payload.json file in your function directory<\/li>\n<li>Navigate to your project root directory and run<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre style=\"padding-left: 40px;\">sf run function -l http:\/\/localhost:8080 -p '{\"accountName\": \u201cFrom Test\u201d}' - if you want to pass a payload in the command\nor\nsf run function -l http:\/\/localhost:8080 -p '@functions\/myfunction\/payload.json' - if you want to pass a path to the payload\nor\nOpen payload.json and click invoke - if you want to use UI<\/pre>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-13805\" src=\"https:\/\/siiwebsite-uat.siitest.pl\/blog\/wp-content\/uploads\/2022\/05\/FunctionInvoker.png\" alt=\"\" width=\"502\" height=\"268\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/FunctionInvoker.png 502w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/FunctionInvoker-300x160.png 300w\" sizes=\"(max-width: 502px) 100vw, 502px\" \/><\/p>\n<ul>\n<li>Finally, if you want to stop the function, just use:<\/li>\n<\/ul>\n<pre style=\"padding-left: 40px;\">Ctrl + Shift + P &gt; SFDX: Stop Function\nor\nCtrl-C<\/pre>\n<h3>Deploy the functions<\/h3>\n<p>Now that you\u2019ve tested your function locally, you\u2019re ready to deploy it! Let\u2019s move it to your Compute Environment.<\/p>\n<p>When it comes to deploying Salesforce Functions, there\u2019s one thing that might be different from your experience from Apex. Your local version of code will never be deployed if uncommitted, as the deploy process always looks to the changes tracked in git. Do remember to commit your changes before each deployment.<\/p>\n<pre>git add .\ngit commit -m \u201ccommit message\u201d\nsf deploy functions -o ScratchOrgAlias<\/pre>\n<p><em>&nbsp;<\/em>To check the status of your deployed project, use<\/p>\n<p>sf env list<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-13828\" src=\"https:\/\/siiwebsite-uat.siitest.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela.png\" alt=\"\" width=\"900\" height=\"160\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela.png 1430w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela-300x53.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela-1024x182.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela-768x136.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/p>\n<h3>Invoke function from Apex<\/h3>\n<p>We\u2019re back on our Salesforce Platform, but now we have more possibilities. Run whatever you have developed in your language of choice &#8211; it\u2019s really easy.<\/p>\n<pre><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\npublic with sharing class GenericFunctionInvoker {\n@AuraEnabled\npublic static String invoke(String functionName, String payload) {\n\/\/ Instantiate the function\nfunctions.Function function = functions.Function.get(functionName);\n\n\/\/ Invoke the function\nfunctions.FunctionInvocation invocation = function.invoke(payload);\n\n\/\/ Check if there is any error during the invocation\nif (invocation.getStatus() == functions.FunctionInvocationStatus.ERROR) {\nthrow new CalloutException(\n(invocation.getError() != null\n? invocation.getError().getMessage()\n: 'UNKNOWN')\n);\n}\n\nString response = invocation.getResponse();\n\n\/\/ Return the response to the flow\nreturn response;\n}\n}\n\n<\/pre><\/pre>\n<p>This is probably the moment when something will go wrong. How do I debug, you might ask. To view Compute Environment Logs, use this command:<\/p>\n<pre>sf env log tail -e COMPUTE_ENV_ALIAS<\/pre>\n<h2>Limits<\/h2>\n<p>No tool has unlimited power. Even though Salesforce Functions is a heavenly tool, sky is still the limit.<\/p>\n<p>There are four main things you can exceed:<\/p>\n<ul>\n<li>Function run time<br>Invoked functions can only run for so long before they time out. The limit is much higher than in apex, but it\u2019s still worth being aware of:<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>15 minutes for asynchronously invoked functions,<\/li>\n<li>2 minutes for synchronous calls.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>Payload size<br>Payloads of a certain size are too big for functions to accept. Here\u2019s the numbers:<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>12MB for asynchronously invoked function,<\/li>\n<li>6MB for synchronously invoked functions.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>Response size\n<ul>\n<li>12MB for asynchronously invoked function,<\/li>\n<li>6MB for synchronously invoked functions.<\/li>\n<\/ul>\n<\/li>\n<li>Simultaneous function invocation\n<ul>\n<li>10 functions for synchronously invoked functions.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>***<\/p>\n<p>Yes, there is no limitation to simultaneous synchronous function invocations. Have we just found a hole in.<\/p>\n<h3>Sources<\/h3>\n<ul>\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/platform\/functions\/guide\/index.html\" rel=\"nofollow\" >Get Started with Salesforce Functions<\/a><\/li>\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/platform\/functions\/guide\/configure_your_org.html\" rel=\"nofollow\" >Configure Your Salesforce Org<\/a><\/li>\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/platform\/functions\/guide\/limits.html\" rel=\"nofollow\" >Understand Functions Limits<\/a><\/li>\n<li><a href=\"https:\/\/trailhead.salesforce.com\/en\/content\/learn\/trails\/discover-salesforce-functions\" rel=\"nofollow\" >Discover Salesforce Functions<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/trailheadapps\/functions-recipes\" rel=\"nofollow\" >Functions recipes<\/a><\/li>\n<\/ul>\n<p>***<\/p>\n<p>You can find more articles about Salesforce here: <a href=\"https:\/\/sii.pl\/blog\/rola-resource-managera-w-procesie-rekrutacji-i-nie-tylko\/\">The role of the Resource Manager in the recruitment process<\/a>, <a href=\"https:\/\/sii.pl\/blog\/salesforce-b2b-commerce-lightning-narzedzie-do-budowy-platform-e-commerce\/\">Salesforce B2B Commerce Lightning \u2013 a tool for building e-commerce platforms<\/a>, and <a href=\"https:\/\/sii.pl\/blog\/en\/from-a-user-to-the-abuser-how-to-become-a-salesforce-expert\/\">From a user to the abuser \u2013 how to become a Salesforce expert.&nbsp;<\/a><\/p>\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;13800&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Salesforce Functions \u2013 what should you know about them?&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>There are some tasks Salesforce platform was simply not built for. There are limits to processing large data volumes or &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/salesforce-functions-what-should-you-know-about-them\/\">Continued<\/a><\/p>\n","protected":false},"author":362,"featured_media":19741,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1320],"tags":[1567,1368],"class_list":["post-13800","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hard-development","tag-functions","tag-salesforce-en"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Salesforce-Functions-\u2013-what-should-you-know-about-them-1.jpg","category_names":["Hard development"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/13800"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/362"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=13800"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/13800\/revisions"}],"predecessor-version":[{"id":19781,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/13800\/revisions\/19781"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/19741"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=13800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=13800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=13800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}