curl --request POST \
--url https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalSourceId": "external-note-123",
"sourceApp": "example-integrator",
"sourceDeepLink": "buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123",
"sourceWebLink": "https://app.buildpass.com.au/meetings/extapitoolboxmeeting01",
"title": "Site walk note",
"summaryMarkdown": "Captured decisions from the site walk.",
"detailBlocks": [
{}
],
"actionItems": [
{
"text": "Upload site photos"
}
],
"capturedStartedAt": "2026-01-15T12:00:00.000Z",
"capturedEndedAt": "2026-01-15T12:10:00.000Z",
"sourceRevision": 4503599627370496
}
'import requests
url = "https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes"
payload = {
"externalSourceId": "external-note-123",
"sourceApp": "example-integrator",
"sourceDeepLink": "buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123",
"sourceWebLink": "https://app.buildpass.com.au/meetings/extapitoolboxmeeting01",
"title": "Site walk note",
"summaryMarkdown": "Captured decisions from the site walk.",
"detailBlocks": [{}],
"actionItems": [{ "text": "Upload site photos" }],
"capturedStartedAt": "2026-01-15T12:00:00.000Z",
"capturedEndedAt": "2026-01-15T12:10:00.000Z",
"sourceRevision": 4503599627370496
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
externalSourceId: 'external-note-123',
sourceApp: 'example-integrator',
sourceDeepLink: 'buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123',
sourceWebLink: 'https://app.buildpass.com.au/meetings/extapitoolboxmeeting01',
title: 'Site walk note',
summaryMarkdown: 'Captured decisions from the site walk.',
detailBlocks: [{}],
actionItems: [{text: 'Upload site photos'}],
capturedStartedAt: '2026-01-15T12:00:00.000Z',
capturedEndedAt: '2026-01-15T12:10:00.000Z',
sourceRevision: 4503599627370496
})
};
fetch('https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'externalSourceId' => 'external-note-123',
'sourceApp' => 'example-integrator',
'sourceDeepLink' => 'buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123',
'sourceWebLink' => 'https://app.buildpass.com.au/meetings/extapitoolboxmeeting01',
'title' => 'Site walk note',
'summaryMarkdown' => 'Captured decisions from the site walk.',
'detailBlocks' => [
[
]
],
'actionItems' => [
[
'text' => 'Upload site photos'
]
],
'capturedStartedAt' => '2026-01-15T12:00:00.000Z',
'capturedEndedAt' => '2026-01-15T12:10:00.000Z',
'sourceRevision' => 4503599627370496
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes"
payload := strings.NewReader("{\n \"externalSourceId\": \"external-note-123\",\n \"sourceApp\": \"example-integrator\",\n \"sourceDeepLink\": \"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123\",\n \"sourceWebLink\": \"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01\",\n \"title\": \"Site walk note\",\n \"summaryMarkdown\": \"Captured decisions from the site walk.\",\n \"detailBlocks\": [\n {}\n ],\n \"actionItems\": [\n {\n \"text\": \"Upload site photos\"\n }\n ],\n \"capturedStartedAt\": \"2026-01-15T12:00:00.000Z\",\n \"capturedEndedAt\": \"2026-01-15T12:10:00.000Z\",\n \"sourceRevision\": 4503599627370496\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalSourceId\": \"external-note-123\",\n \"sourceApp\": \"example-integrator\",\n \"sourceDeepLink\": \"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123\",\n \"sourceWebLink\": \"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01\",\n \"title\": \"Site walk note\",\n \"summaryMarkdown\": \"Captured decisions from the site walk.\",\n \"detailBlocks\": [\n {}\n ],\n \"actionItems\": [\n {\n \"text\": \"Upload site photos\"\n }\n ],\n \"capturedStartedAt\": \"2026-01-15T12:00:00.000Z\",\n \"capturedEndedAt\": \"2026-01-15T12:10:00.000Z\",\n \"sourceRevision\": 4503599627370496\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"externalSourceId\": \"external-note-123\",\n \"sourceApp\": \"example-integrator\",\n \"sourceDeepLink\": \"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123\",\n \"sourceWebLink\": \"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01\",\n \"title\": \"Site walk note\",\n \"summaryMarkdown\": \"Captured decisions from the site walk.\",\n \"detailBlocks\": [\n {}\n ],\n \"actionItems\": [\n {\n \"text\": \"Upload site photos\"\n }\n ],\n \"capturedStartedAt\": \"2026-01-15T12:00:00.000Z\",\n \"capturedEndedAt\": \"2026-01-15T12:10:00.000Z\",\n \"sourceRevision\": 4503599627370496\n}"
response = http.request(request)
puts response.read_body{
"syncedTo": "meetingTemplateResponse",
"pageId": "<string>",
"templateResponseId": "<string>",
"id": "<string>",
"meetingId": "<string>",
"blockId": "<string>",
"updatedAt": "2023-11-07T05:31:56Z",
"externalSourceId": "<string>",
"sourceApp": "<string>"
}{
"errors": [
{
"fieldName": "name",
"message": "This field is required."
}
]
}Create or update meeting note
Create or update a meeting note using your authenticated integration and externalSourceId
curl --request POST \
--url https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalSourceId": "external-note-123",
"sourceApp": "example-integrator",
"sourceDeepLink": "buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123",
"sourceWebLink": "https://app.buildpass.com.au/meetings/extapitoolboxmeeting01",
"title": "Site walk note",
"summaryMarkdown": "Captured decisions from the site walk.",
"detailBlocks": [
{}
],
"actionItems": [
{
"text": "Upload site photos"
}
],
"capturedStartedAt": "2026-01-15T12:00:00.000Z",
"capturedEndedAt": "2026-01-15T12:10:00.000Z",
"sourceRevision": 4503599627370496
}
'import requests
url = "https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes"
payload = {
"externalSourceId": "external-note-123",
"sourceApp": "example-integrator",
"sourceDeepLink": "buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123",
"sourceWebLink": "https://app.buildpass.com.au/meetings/extapitoolboxmeeting01",
"title": "Site walk note",
"summaryMarkdown": "Captured decisions from the site walk.",
"detailBlocks": [{}],
"actionItems": [{ "text": "Upload site photos" }],
"capturedStartedAt": "2026-01-15T12:00:00.000Z",
"capturedEndedAt": "2026-01-15T12:10:00.000Z",
"sourceRevision": 4503599627370496
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
externalSourceId: 'external-note-123',
sourceApp: 'example-integrator',
sourceDeepLink: 'buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123',
sourceWebLink: 'https://app.buildpass.com.au/meetings/extapitoolboxmeeting01',
title: 'Site walk note',
summaryMarkdown: 'Captured decisions from the site walk.',
detailBlocks: [{}],
actionItems: [{text: 'Upload site photos'}],
capturedStartedAt: '2026-01-15T12:00:00.000Z',
capturedEndedAt: '2026-01-15T12:10:00.000Z',
sourceRevision: 4503599627370496
})
};
fetch('https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'externalSourceId' => 'external-note-123',
'sourceApp' => 'example-integrator',
'sourceDeepLink' => 'buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123',
'sourceWebLink' => 'https://app.buildpass.com.au/meetings/extapitoolboxmeeting01',
'title' => 'Site walk note',
'summaryMarkdown' => 'Captured decisions from the site walk.',
'detailBlocks' => [
[
]
],
'actionItems' => [
[
'text' => 'Upload site photos'
]
],
'capturedStartedAt' => '2026-01-15T12:00:00.000Z',
'capturedEndedAt' => '2026-01-15T12:10:00.000Z',
'sourceRevision' => 4503599627370496
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes"
payload := strings.NewReader("{\n \"externalSourceId\": \"external-note-123\",\n \"sourceApp\": \"example-integrator\",\n \"sourceDeepLink\": \"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123\",\n \"sourceWebLink\": \"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01\",\n \"title\": \"Site walk note\",\n \"summaryMarkdown\": \"Captured decisions from the site walk.\",\n \"detailBlocks\": [\n {}\n ],\n \"actionItems\": [\n {\n \"text\": \"Upload site photos\"\n }\n ],\n \"capturedStartedAt\": \"2026-01-15T12:00:00.000Z\",\n \"capturedEndedAt\": \"2026-01-15T12:10:00.000Z\",\n \"sourceRevision\": 4503599627370496\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalSourceId\": \"external-note-123\",\n \"sourceApp\": \"example-integrator\",\n \"sourceDeepLink\": \"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123\",\n \"sourceWebLink\": \"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01\",\n \"title\": \"Site walk note\",\n \"summaryMarkdown\": \"Captured decisions from the site walk.\",\n \"detailBlocks\": [\n {}\n ],\n \"actionItems\": [\n {\n \"text\": \"Upload site photos\"\n }\n ],\n \"capturedStartedAt\": \"2026-01-15T12:00:00.000Z\",\n \"capturedEndedAt\": \"2026-01-15T12:10:00.000Z\",\n \"sourceRevision\": 4503599627370496\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.buildpass.global/builders/{builderId}/meetings/{meetingId}/notes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"externalSourceId\": \"external-note-123\",\n \"sourceApp\": \"example-integrator\",\n \"sourceDeepLink\": \"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123\",\n \"sourceWebLink\": \"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01\",\n \"title\": \"Site walk note\",\n \"summaryMarkdown\": \"Captured decisions from the site walk.\",\n \"detailBlocks\": [\n {}\n ],\n \"actionItems\": [\n {\n \"text\": \"Upload site photos\"\n }\n ],\n \"capturedStartedAt\": \"2026-01-15T12:00:00.000Z\",\n \"capturedEndedAt\": \"2026-01-15T12:10:00.000Z\",\n \"sourceRevision\": 4503599627370496\n}"
response = http.request(request)
puts response.read_body{
"syncedTo": "meetingTemplateResponse",
"pageId": "<string>",
"templateResponseId": "<string>",
"id": "<string>",
"meetingId": "<string>",
"blockId": "<string>",
"updatedAt": "2023-11-07T05:31:56Z",
"externalSourceId": "<string>",
"sourceApp": "<string>"
}{
"errors": [
{
"fieldName": "name",
"message": "This field is required."
}
]
}page document (schema version 1) with a
positive, increasing sourceRevision. Stale revisions and conflicting retries
return HTTP 409. Repeating an unchanged revision is idempotent. A deleted note
requires a newer revision to restore it.
Older senders can continue using summaryMarkdown, detailBlocks, and
actionItems. The backend converts these into Page content. Omitted fields
retain existing content; an explicit empty detailBlocks array clears details.
A summary-only edit retains existing photos.
The response includes the note id, meeting meetingId, prefixed pageId,
templateResponseId, syncedTo: "meetingTemplateResponse", and updatedAt.
The template response remains a real, readable legacy projection.
Notes are identified by your authenticated integration and externalSourceId. Reusing the same ID updates your note; another integration can use that ID independently. sourceApp records the source application and does not grant ownership.Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
"buil_clgbsb90b001qjy0f0eo1hspp"
"extapitoolboxmeeting01"
Body
- Option 1
- Option 2
Canonical page writes require sourceRevision; legacy fields remain supported. The meeting owns its note. Editing a historically shared form detaches that meeting first.
Your source record ID, scoped to the authenticated integration. When omitted, a new ID is generated and returned; reuse it for subsequent updates and deletion.
"external-note-123"
Identifier for the source application. Omission preserves the existing source app, or uses external for a new note. This label does not grant ownership.
"example-integrator"
"buildpass://meetings/extapitoolboxmeeting01/notes/external-note-123"
"https://app.buildpass.com.au/meetings/extapitoolboxmeeting01"
"Site walk note"
"Captured decisions from the site walk."
"2026-01-15T12:00:00.000Z"
"2026-01-15T12:10:00.000Z"
Authoritative snapshot. Maximum 500 blocks across the whole tree and four Page levels including root. Source block IDs are unique among siblings.
Show child attributes
Show child attributes
Required when page is supplied. Omit page to retain legacy Markdown behavior.
1 <= x <= 9007199254740991Response
The created or updated meeting note
meetingTemplateResponse ^page_^mnote_Source record ID to reuse for subsequent updates and deletion. Generated when omitted on creation.