curl --request POST \
--url https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"text": "Partner has to be on the call for anything over £2,000."
}'import requests
url = "https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory"
payload = { "text": "Partner has to be on the call for anything over £2,000." }
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({text: 'Partner has to be on the call for anything over £2,000.'})
};
fetch('https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory', 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.teamfollowup.ai/api/native-contacts/{contactId}/memory",
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([
'text' => 'Partner has to be on the call for anything over £2,000.'
]),
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.teamfollowup.ai/api/native-contacts/{contactId}/memory"
payload := strings.NewReader("{\n \"text\": \"Partner has to be on the call for anything over £2,000.\"\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.teamfollowup.ai/api/native-contacts/{contactId}/memory")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Partner has to be on the call for anything over £2,000.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory")
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 \"text\": \"Partner has to be on the call for anything over £2,000.\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"entryId": "mem_81ba",
"caller_pref": "Partner has to be on the call for anything over £2,000."
}
}{
"success": false,
"error": "A phone number is required."
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "You do not have access to this sub-account."
}{
"success": false,
"error": "Contact not found."
}{
"success": false,
"error": "TooManyRequests"
}{
"success": false,
"error": "Contacts request failed."
}Add to contact memory
Writes what a person knows that no call could have told the agent, into the same block the post-call step writes.
The agent reads one memory rather than two, so an entry added here is on the next call exactly as an entry the call itself learned. This is the surface to use for “they are the decision maker” or “do not mention the renewal”.
Cookie-auth callers must send the x-csrf-token header.
Required API key scope: contacts:write.
curl --request POST \
--url https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"text": "Partner has to be on the call for anything over £2,000."
}'import requests
url = "https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory"
payload = { "text": "Partner has to be on the call for anything over £2,000." }
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({text: 'Partner has to be on the call for anything over £2,000.'})
};
fetch('https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory', 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.teamfollowup.ai/api/native-contacts/{contactId}/memory",
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([
'text' => 'Partner has to be on the call for anything over £2,000.'
]),
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.teamfollowup.ai/api/native-contacts/{contactId}/memory"
payload := strings.NewReader("{\n \"text\": \"Partner has to be on the call for anything over £2,000.\"\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.teamfollowup.ai/api/native-contacts/{contactId}/memory")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Partner has to be on the call for anything over £2,000.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/native-contacts/{contactId}/memory")
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 \"text\": \"Partner has to be on the call for anything over £2,000.\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"entryId": "mem_81ba",
"caller_pref": "Partner has to be on the call for anything over £2,000."
}
}{
"success": false,
"error": "A phone number is required."
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "You do not have access to this sub-account."
}{
"success": false,
"error": "Contact not found."
}{
"success": false,
"error": "TooManyRequests"
}{
"success": false,
"error": "Contacts request failed."
}Authorizations
Send your API key as Authorization: Bearer YOUR_API_KEY.
Path Parameters
The contact id.
1Query Parameters
The sub-account. It is the only thing that identifies the tenant on these routes, and it is re-checked against your access on every call. A sub-account that keeps its contacts in a CRM answers 400.
Body
The entry.
"Partner has to approve anything over £2,000."
