GetRecordDetails
Retrieves a record by ID or another configured identifier field and returns a curated field set.
Standard actions are the packaged tool implementations that ship with the core framework.
They matter because they are the fastest way to give an agent useful behavior without writing Apex. In most orgs, the first good agent should use packaged actions before anyone reaches for custom extensions.
These actions are not just utility methods. They are part of the runtime contract between:
Before building custom Apex, ask whether the behavior can already be expressed with:
GetRecordDetails for retrievalCreateRecord or UpdateRecord for controlled Salesforce changesPostChatter or SendEmail for governed outbound communicationHttpCallout for tightly bounded external REST interactionThat order matters because packaged actions already fit the runtime’s assumptions around tool contracts, user-mode behavior, and approval controls.
Every capability built on a standard action still depends on the same core fields:
Description__c tells the model when to use the toolParameters__c defines the runtime input schemaBackendConfiguration__c holds admin-owned operating settingsHITLMode__c and ExposureLevel__c control review and visibilityThe action implementation may be packaged, but the behavior the model sees is still determined by how you configure those fields. In practice, capability quality often matters more than the raw action type.
GetRecordDetails
Retrieves a record by ID or another configured identifier field and returns a curated field set.
CreateRecord
Creates a Salesforce record with field validation, FLS enforcement, and user-mode DML.
UpdateRecord
Updates a Salesforce record with object and field-level enforcement plus type coercion.
PostChatter
Posts a message to a Chatter feed with feed-type targeting, mentions, and optional topics.
SendEmail
Sends outbound email in direct-content or template mode using Salesforce email facilities.
HttpCallout
Makes a bounded REST callout through a Salesforce Named Credential.
The packaged actions work best when you want:
They work less well when you need:
| Action | What admins configure | What the model supplies |
|---|---|---|
GetRecordDetails | object, field list or field set | one identifier field |
CreateRecord | object and default field values | recordData object |
UpdateRecord | optional object type and default values | recordId and recordData |
PostChatter | feed type and target ID | messageText and optional topics |
SendEmail | variant, sender defaults, template defaults | recipients plus direct-content or template arguments |
HttpCallout | named credential, endpoint path, method, headers | path variables, query params, optional body |
| If you need to… | Usually start with… |
|---|---|
| inspect a record or a curated field set | GetRecordDetails |
| create a new Salesforce record | CreateRecord |
| change an existing Salesforce record | UpdateRecord |
| post collaboration output into Salesforce | PostChatter |
| draft or send an email outcome | SendEmail |
| call a tightly bounded external REST service | HttpCallout |
If two actions both feel plausible, usually prefer the one with the narrower business purpose. The framework behaves better when tool choice is obvious.
Good standard-action capabilities usually follow five rules:
BackendConfiguration__c, not model-generated input.{ "variant": "field_list", "objectApiName": "Contact", "defaultFields": ["Id", "FirstName", "LastName", "Email", "Phone", "Account.Name"]}{ "type": "object", "required": ["Email"], "properties": { "Email": { "type": "string", "description": "Exact email address of the contact to retrieve" } }}{ "objectApiName": "Task", "defaultFieldValues": { "Status": "Not Started", "Priority": "Normal" }}{ "type": "object", "required": ["recordData"], "properties": { "recordData": { "type": "object", "description": "Field names and values for the record to create" } }}{ "objectApiName": "Case", "defaultFieldValues": { "Origin": "AI Agent" }}{ "type": "object", "required": ["recordId", "recordData"], "properties": { "recordId": { "type": "string", "description": "Salesforce ID of the record to update" }, "recordData": { "type": "object", "description": "Field names and values to update" } }}{ "namedCredential": "Customer_API", "endpoint": "/v1/cases/{caseId}", "method": "PATCH", "timeout": 10000}{ "type": "object", "properties": { "pathVariables": { "type": "object" }, "queryParams": { "type": "object" }, "body": { "type": "object" } }}GetRecordDetailsUse this for retrieval, lookup, and context grounding.
CreateRecordUse this when the agent should initiate a new Salesforce record.
UpdateRecordUse this when the agent should change an existing record, not when it should both discover and change data in the same vague tool.
PostChatterUse this when the desired outcome is collaboration inside Salesforce rather than an external reply.
SendEmailUse this when the runtime should produce a real outbound email outcome.
HttpCalloutUse this for bounded external REST interaction, not as a catch-all integration escape hatch.
The capability description is one of the strongest signals the model sees when it decides whether to call a tool.
Good descriptions usually include:
The schema is the second major control surface. Strong schemas:
For CreateRecord, UpdateRecord, SendEmail, and HttpCallout, decide up front whether
confirmation or approval is required in your workflow.
If a capability can change records, send customer-visible content, or call an external API, the question is not just “can the model use it?” It is also “under what review conditions should it be allowed to do so?”
The model should usually supply runtime values such as a record id, search term, or body content.
Operational settings such as object type, endpoint path, timeout, default field values, or sender
identity should stay in BackendConfiguration__c under admin control.
That separation is one of the most important reasons standard actions are governable in production.
Flow is a packaged standard action typeStandard actions are the right starting point when you want safe, understandable, and configurable tooling inside the core runtime.
The best way to use them is not to expose all of them at once. It is to compose a small set of clear, narrow capabilities that the model can choose among confidently and that your team can operate with trust.