Official beta
We are in official beta.

Destinations

Where a workflow's results can go — Dataverse rows, SQL tables, HTTP endpoints via connections, and email

5 endpoints in this category. All require X-API-Key header.


Dataverse: Create Rows

POST /api/DataverseCreateRows 1 token

Creates rows in a Dataverse (Dynamics 365 / Power Platform) table via a registry connection of type 'dataverse' owned by the calling client. The connection holds the org URL and credential — neither ever appears in the workflow definition.

As a pipeline step, connectionId passes through in the body and is resolved by the endpoint under the pipeline's run-as client (#1216). Rows land in the customer's CRM — a retry duplicates them, so callers should not blindly retry. Not available in the anonymous playground or interactive builder Run (connection steps execute server-side via webhooks/form submissions).
Parameters
NameTypeRequiredDescription
connectionId string required Registry connection id (conn_…) of type 'dataverse', owned by the calling client (manage/connections)
entitySet string required Dataverse Web API entity set name — plural, lowercase (e.g. 'contacts', 'cr123_orders')
rows array required Non-empty array of row objects; keys are Dataverse logical attribute names
fieldMap object optional Maps submission field names to destination columns: {"surname": "lastname"}. When set, ONLY mapped fields are sent — unmapped keys are dropped, and a field a row does not carry contributes no attribute at all (never a null, which would clear the column). Omit it and rows pass through exactly as before.
continueOnError boolean optional Keep creating remaining rows after one fails (result reports per-row errors) (default: false)
Request Example
JSON
{"connectionId": "conn_0123456789abcdef0123456789abcdef", "entitySet": "contacts", "rows": [{"firstname": "Ada", "lastname": "Lovelace"}]}
Response Example
JSON
{"success": true, "created": 1, "failed": 0, "results": [{"index": 0, "ok": true, "id": "guid"}]}
Code Examples
curl -X POST "https://docbutterfly.com/api/DataverseCreateRows" \
  -H "X-API-Key: df_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"connectionId": "conn_0123456789abcdef0123456789abcdef", "entitySet": "contacts", "rows": [{"firstname": "Ada", "lastname": "Lovelace"}]}'
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");

var json = @"{""connectionId"": ""conn_0123456789abcdef0123456789abcdef"", ""entitySet"": ""contacts"", ""rows"": [{""firstname"": ""Ada"", ""lastname"": ""Lovelace""}]}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://docbutterfly.com/api/DataverseCreateRows", content);
response.EnsureSuccessStatusCode();

var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json

url = "https://docbutterfly.com/api/DataverseCreateRows"
headers = {
    "X-API-Key": "df_your_api_key_here",
    "Content-Type": "application/json"
}
payload = json.loads('{"connectionId": "conn_0123456789abcdef0123456789abcdef", "entitySet": "contacts", "rows": [{"firstname": "Ada", "lastname": "Lovelace"}]}')

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()

data = response.json()
print(json.dumps(data, indent=2))
┌─────────────────────────────────────────────┐
│  Power Automate - HTTP Action               │
├─────────────────────────────────────────────┤
│                                             │
│  Method:  POST                              │
│  URI:     https://docbutterfly.com/api/DataverseCreateRows
│                                             │
│  Headers:                                   │
│    X-API-Key:    df_your_api_key_here       │
│    Content-Type: application/json           │
│                                             │
│  Body:                                      │
│    {
│      "connectionId": "conn_0123456789abcdef0123456789abcdef",
│      "entitySet": "contacts",
│      "rows": [
│        {
│          "firstname": "Ada",
│          "lastname": "Lovelace"
│        }
│      ]
│    }
│                                             │
└─────────────────────────────────────────────┘

Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/DataverseCreateRows"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as needed
Try in Testbed

SQL: Insert Rows

POST /api/SqlInsertRows 1 token

Inserts rows into a SQL table via a registry connection of type 'sqlserver', 'postgresql', or 'mysql' owned by the calling client. The dialect comes from the connection — the request is identical for all three. The connection holds the host, database, and credential; none of them ever appear in the workflow definition.

As a pipeline step, connectionId passes through in the body and is resolved by the endpoint under the pipeline's run-as client. The target database must be reachable from Azure. Inserts are a side effect — a retry duplicates rows, so callers should not blindly retry. Not available in the anonymous playground or interactive builder Run (connection steps execute server-side via webhooks/form submissions).
Parameters
NameTypeRequiredDescription
connectionId string required Registry connection id (conn_…) of type 'sqlserver', 'postgresql', or 'mysql', owned by the calling client (manage/connections)
table string required Target table name, optionally schema-qualified (e.g. 'invoices', 'dbo.Invoices', 'public.orders')
rows array required Non-empty array of row objects (max 100 per call); keys are column names
fieldMap object optional Maps submission field names to destination columns: {"Full Name": "full_name"}. When set, ONLY mapped fields are sent — unmapped keys are dropped, and a field a row does not carry contributes no column at all (never a null). Omit it and rows pass through exactly as before.
continueOnError boolean optional Keep inserting remaining rows after one fails (result reports per-row errors) (default: false)
Request Example
JSON
{"connectionId": "conn_0123456789abcdef0123456789abcdef", "table": "dbo.Invoices", "rows": [{"customer": "Acme Corp", "total": 582.62}]}
Response Example
JSON
{"success": true, "created": 1, "failed": 0, "results": [{"index": 0, "ok": true}]}
Code Examples
curl -X POST "https://docbutterfly.com/api/SqlInsertRows" \
  -H "X-API-Key: df_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"connectionId": "conn_0123456789abcdef0123456789abcdef", "table": "dbo.Invoices", "rows": [{"customer": "Acme Corp", "total": 582.62}]}'
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");

var json = @"{""connectionId"": ""conn_0123456789abcdef0123456789abcdef"", ""table"": ""dbo.Invoices"", ""rows"": [{""customer"": ""Acme Corp"", ""total"": 582.62}]}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://docbutterfly.com/api/SqlInsertRows", content);
response.EnsureSuccessStatusCode();

var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json

url = "https://docbutterfly.com/api/SqlInsertRows"
headers = {
    "X-API-Key": "df_your_api_key_here",
    "Content-Type": "application/json"
}
payload = json.loads('{"connectionId": "conn_0123456789abcdef0123456789abcdef", "table": "dbo.Invoices", "rows": [{"customer": "Acme Corp", "total": 582.62}]}')

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()

data = response.json()
print(json.dumps(data, indent=2))
┌─────────────────────────────────────────────┐
│  Power Automate - HTTP Action               │
├─────────────────────────────────────────────┤
│                                             │
│  Method:  POST                              │
│  URI:     https://docbutterfly.com/api/SqlInsertRows
│                                             │
│  Headers:                                   │
│    X-API-Key:    df_your_api_key_here       │
│    Content-Type: application/json           │
│                                             │
│  Body:                                      │
│    {
│      "connectionId": "conn_0123456789abcdef0123456789abcdef",
│      "table": "dbo.Invoices",
│      "rows": [
│        {
│          "customer": "Acme Corp",
│          "total": 582.62
│        }
│      ]
│    }
│                                             │
└─────────────────────────────────────────────┘

Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/SqlInsertRows"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as needed
Try in Testbed

Blob: Write File

POST /api/BlobWriteFile 1 token

Writes a file into an Azure Blob Storage container via a registry connection of type 'blob' owned by the calling client. The connection holds the account URL and the SAS token or storage connection string — neither ever appears in the workflow definition.

The returned URL never carries the SAS — the query string is stripped before it leaves. The connection's accountUrl is the authority: a credential naming a different account is refused, so the address an admin can review in the registry is the address we write to. Writing is a side effect — a retry re-writes the blob. Not available in the anonymous playground or interactive builder Run (connection steps execute server-side via webhooks/form submissions).
Parameters
NameTypeRequiredDescription
connectionId string required Registry connection id (conn_…) of type 'blob', owned by the calling client (manage/connections)
path string required Blob name, optionally with folder segments (e.g. 'invoices/2026/inv-1.pdf'). Max 1024 characters; no leading slash, no '..', no control characters
contentBase64 string required The file's bytes, base64-encoded (max 32 MB per call)
container string optional Overrides the connection's default container. Azure naming rules: 3-63 lowercase alphanumerics and single dashes
contentType string optional MIME type stored on the blob (default: application/octet-stream)
overwrite boolean optional Replace an existing blob at that path instead of failing with 409 (default: false)
createContainer boolean optional Create the container if it does not exist (default: false)
Request Example
JSON
{"connectionId": "conn_0123456789abcdef0123456789abcdef", "path": "invoices/2026/inv-1.pdf", "contentBase64": "JVBERi0xLjcK...", "contentType": "application/pdf"}
Response Example
JSON
{"success": true, "container": "invoices", "path": "invoices/2026/inv-1.pdf", "url": "https://acmedocs.blob.core.windows.net/invoices/2026/inv-1.pdf", "etag": "\"0x8DC…\"", "sizeBytes": 20481, "contentType": "application/pdf"}
Code Examples
curl -X POST "https://docbutterfly.com/api/BlobWriteFile" \
  -H "X-API-Key: df_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"connectionId": "conn_0123456789abcdef0123456789abcdef", "path": "invoices/2026/inv-1.pdf", "contentBase64": "JVBERi0xLjcK...", "contentType": "application/pdf"}'
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");

var json = @"{""connectionId"": ""conn_0123456789abcdef0123456789abcdef"", ""path"": ""invoices/2026/inv-1.pdf"", ""contentBase64"": ""JVBERi0xLjcK..."", ""contentType"": ""application/pdf""}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://docbutterfly.com/api/BlobWriteFile", content);
response.EnsureSuccessStatusCode();

var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json

url = "https://docbutterfly.com/api/BlobWriteFile"
headers = {
    "X-API-Key": "df_your_api_key_here",
    "Content-Type": "application/json"
}
payload = json.loads('{"connectionId": "conn_0123456789abcdef0123456789abcdef", "path": "invoices/2026/inv-1.pdf", "contentBase64": "JVBERi0xLjcK...", "contentType": "application/pdf"}')

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()

data = response.json()
print(json.dumps(data, indent=2))
┌─────────────────────────────────────────────┐
│  Power Automate - HTTP Action               │
├─────────────────────────────────────────────┤
│                                             │
│  Method:  POST                              │
│  URI:     https://docbutterfly.com/api/BlobWriteFile
│                                             │
│  Headers:                                   │
│    X-API-Key:    df_your_api_key_here       │
│    Content-Type: application/json           │
│                                             │
│  Body:                                      │
│    {
│      "connectionId": "conn_0123456789abcdef0123456789abcdef",
│      "path": "invoices/2026/inv-1.pdf",
│      "contentBase64": "JVBERi0xLjcK...",
│      "contentType": "application/pdf"
│    }
│                                             │
└─────────────────────────────────────────────┘

Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/BlobWriteFile"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as needed
Try in Testbed

SFTP: Upload File

POST /api/SftpUploadFile 1 token

Uploads a file to an SFTP server via a registry connection of type 'sftp' owned by the calling client. The connection holds the host and the password or private key — neither ever appears in the workflow definition.

Host key: when the connection sets config.hostKeyFingerprint it is ENFORCED — a mismatch aborts BEFORE authentication, so a man in the middle never sees the credential. When it is not set the connection still succeeds and the observed fingerprint comes back, so it can be pinned from a real observation rather than a guess. Uploading is a side effect — a retry re-uploads. Not available in the anonymous playground or interactive builder Run (connection steps execute server-side via webhooks/form submissions).
Parameters
NameTypeRequiredDescription
connectionId string required Registry connection id (conn_…) of type 'sftp', owned by the calling client (manage/connections)
path string required Remote path relative to the connection's rootPath (e.g. 'inbox/inv-1.pdf'). Max 1024 characters; absolute paths, '..', backslashes, empty segments and control characters are refused
contentBase64 string required The file's bytes, base64-encoded (max 32 MB per call)
overwrite boolean optional Replace an existing file at that path instead of failing with 409 (default: false)
createDirectories boolean optional Create the parent directories if they do not exist (default: false)
Request Example
JSON
{"connectionId": "conn_0123456789abcdef0123456789abcdef", "path": "inbox/inv-1.pdf", "contentBase64": "JVBERi0xLjcK...", "createDirectories": true}
Response Example
JSON
{"success": true, "path": "/upload/inbox/inv-1.pdf", "sizeBytes": 20481, "host": "sftp.acme.example", "port": 22, "hostKeyFingerprint": "SHA256:9x…", "hostKeyPinned": true}
Code Examples
curl -X POST "https://docbutterfly.com/api/SftpUploadFile" \
  -H "X-API-Key: df_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"connectionId": "conn_0123456789abcdef0123456789abcdef", "path": "inbox/inv-1.pdf", "contentBase64": "JVBERi0xLjcK...", "createDirectories": true}'
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");

var json = @"{""connectionId"": ""conn_0123456789abcdef0123456789abcdef"", ""path"": ""inbox/inv-1.pdf"", ""contentBase64"": ""JVBERi0xLjcK..."", ""createDirectories"": true}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://docbutterfly.com/api/SftpUploadFile", content);
response.EnsureSuccessStatusCode();

var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json

url = "https://docbutterfly.com/api/SftpUploadFile"
headers = {
    "X-API-Key": "df_your_api_key_here",
    "Content-Type": "application/json"
}
payload = json.loads('{"connectionId": "conn_0123456789abcdef0123456789abcdef", "path": "inbox/inv-1.pdf", "contentBase64": "JVBERi0xLjcK...", "createDirectories": true}')

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()

data = response.json()
print(json.dumps(data, indent=2))
┌─────────────────────────────────────────────┐
│  Power Automate - HTTP Action               │
├─────────────────────────────────────────────┤
│                                             │
│  Method:  POST                              │
│  URI:     https://docbutterfly.com/api/SftpUploadFile
│                                             │
│  Headers:                                   │
│    X-API-Key:    df_your_api_key_here       │
│    Content-Type: application/json           │
│                                             │
│  Body:                                      │
│    {
│      "connectionId": "conn_0123456789abcdef0123456789abcdef",
│      "path": "inbox/inv-1.pdf",
│      "contentBase64": "JVBERi0xLjcK...",
│      "createDirectories": true
│    }
│                                             │
└─────────────────────────────────────────────┘

Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/SftpUploadFile"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as needed
Try in Testbed

Service Bus: Send Messages

POST /api/ServiceBusSendMessages 1 token

Sends a batch of messages to an Azure Service Bus queue or topic via a registry connection of type 'servicebus' owned by the calling client. The connection holds the namespace and the connection string or SAS token — neither ever appears in the workflow definition.

The whole batch goes in one Service Bus REST send, so the call is all-or-nothing: either every message is queued or none is. The batch is capped at 1 MB here and your namespace's own tier may cap it lower (256 KB on standard). Send only — this endpoint does not receive, and does not do sessions, transactions or dead-letter handling. Sending is a side effect — a retry puts a second copy on the queue. Not available in the anonymous playground or interactive builder Run (connection steps execute server-side via webhooks/form submissions).
Parameters
NameTypeRequiredDescription
connectionId string required Registry connection id (conn_…) of type 'servicebus', owned by the calling client (manage/connections)
messages array required 1-100 messages. Each is either a plain string, or an object { body, contentType?, timeToLiveSeconds?, properties?, messageId?, correlationId?, sessionId?, label?, partitionKey?, replyTo?, to? }. An object body is sent as JSON text
queueOrTopic string optional Overrides the connection's default entity. May be hierarchical (e.g. 'orders/eu')
Request Example
JSON
{"connectionId": "conn_0123456789abcdef0123456789abcdef", "queueOrTopic": "orders", "messages": [{"body": {"orderId": 42}, "label": "order-created", "contentType": "application/json", "properties": {"source": "docbutterfly"}}]}
Response Example
JSON
{"success": true, "sent": 1, "namespace": "acme.servicebus.windows.net", "entity": "orders", "sizeBytes": 118}
Code Examples
curl -X POST "https://docbutterfly.com/api/ServiceBusSendMessages" \
  -H "X-API-Key: df_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"connectionId": "conn_0123456789abcdef0123456789abcdef", "queueOrTopic": "orders", "messages": [{"body": {"orderId": 42}, "label": "order-created", "contentType": "application/json", "properties": {"source": "docbutterfly"}}]}'
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");

var json = @"{""connectionId"": ""conn_0123456789abcdef0123456789abcdef"", ""queueOrTopic"": ""orders"", ""messages"": [{""body"": {""orderId"": 42}, ""label"": ""order-created"", ""contentType"": ""application/json"", ""properties"": {""source"": ""docbutterfly""}}]}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://docbutterfly.com/api/ServiceBusSendMessages", content);
response.EnsureSuccessStatusCode();

var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json

url = "https://docbutterfly.com/api/ServiceBusSendMessages"
headers = {
    "X-API-Key": "df_your_api_key_here",
    "Content-Type": "application/json"
}
payload = json.loads('{"connectionId": "conn_0123456789abcdef0123456789abcdef", "queueOrTopic": "orders", "messages": [{"body": {"orderId": 42}, "label": "order-created", "contentType": "application/json", "properties": {"source": "docbutterfly"}}]}')

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()

data = response.json()
print(json.dumps(data, indent=2))
┌─────────────────────────────────────────────┐
│  Power Automate - HTTP Action               │
├─────────────────────────────────────────────┤
│                                             │
│  Method:  POST                              │
│  URI:     https://docbutterfly.com/api/ServiceBusSendMessages
│                                             │
│  Headers:                                   │
│    X-API-Key:    df_your_api_key_here       │
│    Content-Type: application/json           │
│                                             │
│  Body:                                      │
│    {
│      "connectionId": "conn_0123456789abcdef0123456789abcdef",
│      "queueOrTopic": "orders",
│      "messages": [
│        {
│          "body": {
│            "orderId": 42
│          },
│          "label": "order-created",
│          "contentType": "application/json",
│          "properties": {
│            "source": "docbutterfly"
│          }
│        }
│      ]
│    }
│                                             │
└─────────────────────────────────────────────┘

Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/ServiceBusSendMessages"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as needed
Try in Testbed