Tallyfy’s API lets you retrieve a paginated and filterable list of external guest users in your organization through a GET request that supports search by email and optional completion statistics and returns detailed guest profiles including access history and task performance data.
Get guest
GET /organizations/{org_id}/guests/{guest_email}
This endpoint retrieves details for a specific guest, identified by their email address.
Replace {org_id} with your Organization ID and {guest_email} with the URL-encoded email address of the guest (e.g., user%40example.com).
| Header | Value | Required |
|---|---|---|
Authorization | Bearer {your_access_token} | Yes |
Accept | application/json | Yes |
X-Tallyfy-Client | APIClient | Yes |
| Parameter | Type | Description |
|---|---|---|
with | string | Include extra data. Use stats for guest completion statistics. |
const accessToken = 'YOUR_PERSONAL_ACCESS_TOKEN';const orgId = 'YOUR_ORGANIZATION_ID';const guestEmail = 'guest.to.get@example.com';const encodedEmail = encodeURIComponent(guestEmail);
const queryParams = '?with=stats';const apiUrl = `https://go.tallyfy.com/api/organizations/${orgId}/guests/${encodedEmail}${queryParams}`;
const headers = new Headers();headers.append('Authorization', `Bearer ${accessToken}`);headers.append('Accept', 'application/json');headers.append('X-Tallyfy-Client', 'APIClient');
fetch(apiUrl, { method: 'GET', headers }).then(response => { return response.json().then(data => { if (!response.ok) { console.error(`Failed to get guest ${guestEmail}:`, data); throw new Error(`HTTP error! status: ${response.status}`); } return data; });}).then(data => { console.log(`Successfully retrieved guest ${guestEmail}:`); console.log(JSON.stringify(data, null, 2));}).catch(error => { console.error(`Error getting guest ${guestEmail}:`, error.message);});import requestsimport jsonimport osfrom urllib.parse import quote
access_token = os.environ.get('TALLYFY_ACCESS_TOKEN', 'YOUR_PERSONAL_ACCESS_TOKEN')org_id = os.environ.get('TALLYFY_ORG_ID', 'YOUR_ORGANIZATION_ID')guest_email = 'guest.to.get@example.com'encoded_email = quote(guest_email)
api_url = f'https://go.tallyfy.com/api/organizations/{org_id}/guests/{encoded_email}'
headers = { 'Authorization': f'Bearer {access_token}', 'Accept': 'application/json', 'X-Tallyfy-Client': 'APIClient'}
params = { 'with': 'stats' }
response = Nonetry: response = requests.get(api_url, headers=headers, params=params) response.raise_for_status() guest_data = response.json() print(f'Successfully retrieved guest {guest_email}:') print(json.dumps(guest_data, indent=4))except requests.exceptions.HTTPError as http_err: print(f'HTTP error getting guest {guest_email}: {http_err}') if response is not None: print(f'Response Body: {response.text}')except requests.exceptions.RequestException as req_err: print(f'Request failed getting guest {guest_email}: {req_err}')except json.JSONDecodeError: print(f'Failed to decode JSON response for guest {guest_email}') if response is not None: print(f'Response Text: {response.text}')import java.net.URI;import java.net.URLEncoder;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.io.IOException;import java.nio.charset.StandardCharsets;
public class GetGuest { public static void main(String[] args) { String accessToken = System.getenv().getOrDefault("TALLYFY_ACCESS_TOKEN", "YOUR_PERSONAL_ACCESS_TOKEN"); String orgId = System.getenv().getOrDefault("TALLYFY_ORG_ID", "YOUR_ORGANIZATION_ID"); String guestEmail = "guest.to.get@example.com"; String encodedEmail = URLEncoder.encode(guestEmail, StandardCharsets.UTF_8);
String apiUrl = String.format( "https://go.tallyfy.com/api/organizations/%s/guests/%s?with=stats", orgId, encodedEmail);
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(apiUrl)) .header("Authorization", "Bearer " + accessToken) .header("Accept", "application/json") .header("X-Tallyfy-Client", "APIClient") .GET() .build();
try { HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() == 200 || response.statusCode() == 201) { System.out.println("Successfully retrieved guest " + guestEmail + ":"); System.out.println(response.body()); } else { System.err.println("Failed to get guest " + guestEmail + ". Status: " + response.statusCode()); System.err.println("Response Body: " + response.body()); } } catch (IOException | InterruptedException e) { System.err.println("Request failed: " + e.getMessage()); Thread.currentThread().interrupt(); } }}package main
import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" "os" "time")
func main() { accessToken := os.Getenv("TALLYFY_ACCESS_TOKEN") if accessToken == "" { accessToken = "YOUR_PERSONAL_ACCESS_TOKEN" } orgId := os.Getenv("TALLYFY_ORG_ID") if orgId == "" { orgId = "YOUR_ORGANIZATION_ID" } email := "guest.to.get@example.com"
encodedEmail := url.PathEscape(email) apiUrl := fmt.Sprintf( "https://go.tallyfy.com/api/organizations/%s/guests/%s?with=stats", orgId, encodedEmail)
client := &http.Client{Timeout: 15 * time.Second} req, err := http.NewRequest("GET", apiUrl, nil) if err != nil { fmt.Printf("Error creating request: %v\n", err) return }
req.Header.Set("Authorization", "Bearer "+accessToken) req.Header.Set("Accept", "application/json") req.Header.Set("X-Tallyfy-Client", "APIClient")
resp, err := client.Do(req) if err != nil { fmt.Printf("Error executing request: %v\n", err) return } defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Printf("Error reading response body: %v\n", err) return }
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { fmt.Printf("Failed to get guest. Status: %d\nBody: %s\n", resp.StatusCode, string(body)) return }
fmt.Printf("Successfully retrieved guest %s:\n", email) var prettyJSON bytes.Buffer if err := json.Indent(&prettyJSON, body, "", " "); err == nil { fmt.Println(prettyJSON.String()) } else { fmt.Println(string(body)) }}#include <iostream>#include <string>#include <cpprest/http_client.h>#include <cpprest/json.h>
using namespace web;using namespace web::http;using namespace web::http::client;using namespace web::json;
pplx::task<void> GetTallyfyGuest(const utility::string_t& guestEmail){ utility::string_t accessToken = U("YOUR_PERSONAL_ACCESS_TOKEN"); utility::string_t orgId = U("YOUR_ORGANIZATION_ID");
uri_builder builder(U("https://go.tallyfy.com/api/organizations/")); builder.append_path(orgId); builder.append_path(U("guests")); builder.append_path(uri::encode_uri(guestEmail, uri::components::path)); builder.append_query(U("with"), U("stats")); utility::string_t apiUrl = builder.to_string();
http_client client(apiUrl); http_request request(methods::GET);
request.headers().add(U("Authorization"), U("Bearer ") + accessToken); request.headers().add(U("Accept"), U("application/json")); request.headers().add(U("X-Tallyfy-Client"), U("APIClient"));
return client.request(request).then([guestEmail](http_response response) { utility::string_t emailW = guestEmail; return response.extract_json().then([response, emailW](pplx::task<value> task) { try { value const & body = task.get(); if (response.status_code() == status_codes::OK || response.status_code() == status_codes::Created) { std::wcout << L"Successfully retrieved guest " << emailW << L":\n" << body.serialize() << std::endl; } else { std::wcerr << L"Failed to get guest " << emailW << L". Status: " << response.status_code() << L"\nResponse: " << body.serialize() << std::endl; } } catch (const std::exception& e) { std::wcerr << L"Error: " << e.what() << std::endl; } }); });}
int main() { try { GetTallyfyGuest(U("guest.to.get@example.com")).wait(); } catch (const std::exception &e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}// Requires C++ REST SDK (Casablanca)using System;using System.Net.Http;using System.Net.Http.Headers;using System.Threading.Tasks;using System.Text.Json;using System.Web;
public class TallyfyGuestGetter{ private static readonly HttpClient client = new HttpClient();
public static async Task GetGuestAsync(string guestEmail) { var accessToken = Environment.GetEnvironmentVariable("TALLYFY_ACCESS_TOKEN") ?? "YOUR_PERSONAL_ACCESS_TOKEN"; var orgId = Environment.GetEnvironmentVariable("TALLYFY_ORG_ID") ?? "YOUR_ORGANIZATION_ID"; var encodedEmail = Uri.EscapeDataString(guestEmail); var apiUrl = $"https://go.tallyfy.com/api/organizations/{orgId}/guests/{encodedEmail}?with=stats";
try { using var request = new HttpRequestMessage(HttpMethod.Get, apiUrl); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); request.Headers.Add("X-Tallyfy-Client", "APIClient");
HttpResponseMessage response = await client.SendAsync(request); string responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode) { Console.WriteLine($"Successfully retrieved guest {guestEmail}:"); using var doc = JsonDocument.Parse(responseBody); Console.WriteLine(JsonSerializer.Serialize(doc.RootElement, new JsonSerializerOptions { WriteIndented = true })); } else { Console.WriteLine($"Failed to get guest {guestEmail}. Status: {response.StatusCode}"); Console.WriteLine($"Response: {responseBody}"); } } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } }
// static async Task Main(string[] args) => await GetGuestAsync("guest.to.get@example.com");}A successful request returns a 201 Created status code and a JSON object containing a data property with the guest’s details.
{ "data": { "id": 1234, "email": "guest.to.get@example.com", "last_accessed_at": "2025-05-15T10:00:00Z", "last_known_ip": "192.168.1.1", "last_known_country": "US", "details": { "status": "active", "phone_1": "+1234567890", "phone_2": null, "timezone": "America/New_York", "image_url": null, "contact_url": null, "company_url": "https://example.com", "opportunity_url": null, "company_name": "Guest Company", "opportunity_name": null, "external_sync_source": null, "external_date_creation": null, "cadence_days": null, "associated_members": null, "last_city": "New York", "last_country": "US", "last_accessed_at": "2025-05-15T10:00:00Z", "disabled_at": null, "disabled_by": null, "reactivated_at": null, "reactivated_by": null }, "first_name": "Specific", "last_name": "Guest", "created_at": "2025-01-10T08:30:00Z", "deleted_at": null, "link": "https://go.tallyfy.com/...", "stats": {} }}If the guest email isn’t found or you lack permission, you’ll get a 404 Not Found or 403 Forbidden error.
Tallyfy’s DELETE endpoint at
/organizations/[org_id]/guests/[guest_email] removes a guest by their URL-encoded email address and detaches them from all tasks and the organization while soft-deleting the record if they have no other org memberships. Code Samples > Managing guests
Tallyfy’s API lets you manage external guest users—who participate in tasks without full accounts—by creating listing retrieving updating and deleting them using their URL-encoded email address as the identifier across organization-scoped endpoints.
Tallyfy’s API lets you add external guests to your organization via a POST request with just an email address (plus optional profile fields like name and company) and it automatically links existing global guests instead of creating duplicates.
Was this helpful?
About Tallyfy
- 2025 Tallyfy, Inc.
- Privacy Policy
- Terms of Use
- Report Issue
- Trademarks