Custom Integrations
If you want your agent to talk to your own systems — a booking system, an internal API, a CRM without a ready-made connector — build a Custom Integration. This is a full, no-code way to define a REST API connection and specific callable actions against it.
Who does this: the interface requires no code, but the values themselves are technical — base URL, authentication, endpoints, JSON bodies. If those terms aren’t part of your day-to-day, bring in your IT team or your software vendor. The business side stays with you: which action the agent should be able to perform and which values it needs for that.
Clarify first
- Which action? Check availability, create a booking, look up order status, create a record. One action per purpose.
- Who has API access? Credentials come from your vendor or your IT.
- Which fields does the API need, and which does it return?
- How fast does it respond? For calls made during a conversation it should be a few seconds.
- Test the calls in advance outside MIA (e.g. with Postman) using real values. If the call doesn’t work there, it won’t work in MIA — and troubleshooting is considerably faster there.
1. Create the connection
-
Open Marketplace → Custom Integrations → Add custom integration.
-
Fill in:
Field Description Name A label for this connection, e.g. “Salesforce CRM API.” Description What it’s for. Base URL The root URL of the API, e.g. https://yourinstance.my.salesforce.com/services/data/v59.0.Auth type None,Bearer(a token),API Key,Basic(username/password), orHeaders(arbitrary custom headers) — then fill in the matching credential field(s). -
Save. The connection now appears under Custom Integrations.
2. Add an action
Open the connection and add an action — this is the specific API call your agent will be able to make:
| Field | Description |
|---|---|
| Display name | What shows up when attaching this action to a workflow, e.g. “Create Booking.” |
| HTTP method | GET, POST, PUT, PATCH, or DELETE. |
| Path | The endpoint path, e.g. /bookings/:bookingId or /bookings/{bookingId} — path parameters are detected automatically. |
| Headers / query params / body | Whatever the target API expects. |
| Timeout | How long to wait for a response before giving up. |
| Execution stage | In-call action (runs while the agent is still talking to the caller, so it can use the result in the conversation) or post-call action (runs after the call ends). |
| Response mode | Fire-and-forget (don’t wait for/use the response) or evaluate-data (parse the response and make specific fields available to the agent — you define each field’s name, type, and description). |
Save the action.
3. Use it in a workflow
- Open your Workflow → Integration tab → Integrations panel → Add integration.
- Select your Custom Integration and the specific action.
- If it’s an in-call action with
evaluate-data, reference the fields it returns directly in your prompt (e.g. “confirm the booking reference the tool returned”). - Save, then save and publish the workflow.
What you must add to the prompt
Attaching an action isn’t enough on its own — the agent needs to know when to use it and what happens when something goes wrong (see Writing the Prompt → Tools). These three points are forgotten most often:
- When to call it and when not. Otherwise the agent calls too early, with half the values.
- What it says while waiting. “One moment, let me check.” Without that line, silence falls.
- What happens on no response or an error. Without a fallback rule the conversation stalls. Recommended: take the request as a message and promise a callback.
For actions that create something (bookings, orders): clarify with your IT what happens on a retry. Without safeguards on your API side, duplicate records can be created.
Complete working example: connecting a CRM (Salesforce)
A common use of Custom Integrations is logging every call straight into a CRM your business already runs — for example, creating a new record in Salesforce the moment a call ends, without anyone touching Salesforce by hand. Salesforce’s REST API follows the same request/response shape shown here, so this example generalizes to most CRMs (HubSpot, Zoho, or an internal system) — just swap the base URL, auth, and field names.
Connection:
| Field | Value |
|---|---|
| Name | Salesforce CRM |
| Base URL | https://yourinstance.my.salesforce.com/services/data/v59.0 |
| Auth type | Bearer (an OAuth access token for your Salesforce org) |
Action — “Create Lead”:
| Field | Value |
|---|---|
| HTTP method | POST |
| Path | /sobjects/Lead |
| Body | { "FirstName": "...", "LastName": "...", "Phone": "...", "Email": "...", "Company": "..." } |
| Execution stage | Post-call action |
| Response mode | Evaluate-data — fields: id (string), success (boolean) |
Attached to a sales or support workflow’s Integration tab, this creates a new Salesforce Lead after every call using the properties your agent captured (caller name, phone, email), and captures back the new record’s id for reference — no manual data entry required.
With token-based authentication, clarify the token’s validity period with your IT. If it expires, the action fails from that point on without anything having changed in the Workflow. That is the most common cause of “it worked for weeks and now it doesn’t.”
The Custom Integration framework connects your agent to REST APIs you control or have credentials for. It does not publish your integration to the Marketplace for other MIA customers — it’s private to your account.