curl -X POST "https://api.tktchurch.com/v1/newsletters/123e4567-e89b-12d3-a456-426614174000/track" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
const trackNewsletter = async (accessToken, newsletterId) => {
const response = await fetch(
`https://api.tktchurch.com/v1/newsletters/${newsletterId}/track`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`
}
}
);
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.reason);
}
};
// Usage
try {
await trackNewsletter(
'eyJhbGciOiJIUzI1NiIs...',
'123e4567-e89b-12d3-a456-426614174000'
);
console.log('Newsletter tracked successfully');
} catch (error) {
console.error('Failed to track newsletter:', error.message);
}
func trackNewsletter(accessToken: String, newsletterId: UUID) async throws {
var urlRequest = URLRequest(url: URL(string: "https://api.tktchurch.com/v1/newsletters/\(newsletterId)/track")!)
urlRequest.httpMethod = "POST"
urlRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let (_, response) = try await URLSession.shared.data(for: urlRequest)
guard let httpResponse = response as? HTTPURLResponse else {
throw URLError(.badServerResponse)
}
if httpResponse.statusCode != 200 {
throw URLError(.badServerResponse)
}
}
// Usage
do {
try await trackNewsletter(
accessToken: "eyJhbGciOiJIUzI1NiIs...",
newsletterId: UUID(uuidString: "123e4567-e89b-12d3-a456-426614174000")!
)
print("Newsletter tracked successfully")
} catch {
print("Failed to track newsletter:", error.localizedDescription)
}
class NewsletterService(private val client: OkHttpClient) {
suspend fun trackNewsletter(accessToken: String, newsletterId: String) {
val request = Request.Builder()
.url("https://api.tktchurch.com/v1/newsletters/$newsletterId/track")
.post(RequestBody.create(null, ByteArray(0)))
.header("Authorization", "Bearer $accessToken")
.build()
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) {
val error = response.body?.string()?.fromJson<ErrorResponse>()
throw Exception(error?.reason ?: "Failed to track newsletter")
}
}
}
}
// Usage
try {
newsletterService.trackNewsletter(
"eyJhbGciOiJIUzI1NiIs...",
"123e4567-e89b-12d3-a456-426614174000"
)
println("Newsletter tracked successfully")
} catch (e: Exception) {
println("Failed to track newsletter: ${e.message}")
}
import axios from 'axios';
const trackNewsletter = async (
accessToken: string,
newsletterId: string
): Promise<void> => {
try {
await axios.post(
`https://api.tktchurch.com/v1/newsletters/${newsletterId}/track`,
null,
{
headers: {
'Authorization': `Bearer ${accessToken}`
},
}
);
} catch (error) {
if (axios.isAxiosError(error)) {
throw new Error(error.response?.data?.error?.reason || 'Failed to track newsletter');
}
throw error;
}
};
// Usage
try {
await trackNewsletter(
'eyJhbGciOiJIUzI1NiIs...',
'123e4567-e89b-12d3-a456-426614174000'
);
console.log('Newsletter tracked successfully');
} catch (error) {
console.error('Failed to track newsletter:', error.message);
}
{
"error": {
"status": 400,
"reason": "Invalid newsletter ID format"
}
}
{
"error": {
"status": 401,
"reason": "Invalid or expired access token"
}
}
{
"error": {
"status": 403,
"reason": "Missing required permission: readNewsletter"
}
}
{
"error": {
"status": 404,
"reason": "Newsletter not found"
}
}
Newsletters
Track Newsletter
Track a newsletter view/receipt
POST
/
newsletters
/
{newsletterId}
/
track
curl -X POST "https://api.tktchurch.com/v1/newsletters/123e4567-e89b-12d3-a456-426614174000/track" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
const trackNewsletter = async (accessToken, newsletterId) => {
const response = await fetch(
`https://api.tktchurch.com/v1/newsletters/${newsletterId}/track`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`
}
}
);
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.reason);
}
};
// Usage
try {
await trackNewsletter(
'eyJhbGciOiJIUzI1NiIs...',
'123e4567-e89b-12d3-a456-426614174000'
);
console.log('Newsletter tracked successfully');
} catch (error) {
console.error('Failed to track newsletter:', error.message);
}
func trackNewsletter(accessToken: String, newsletterId: UUID) async throws {
var urlRequest = URLRequest(url: URL(string: "https://api.tktchurch.com/v1/newsletters/\(newsletterId)/track")!)
urlRequest.httpMethod = "POST"
urlRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let (_, response) = try await URLSession.shared.data(for: urlRequest)
guard let httpResponse = response as? HTTPURLResponse else {
throw URLError(.badServerResponse)
}
if httpResponse.statusCode != 200 {
throw URLError(.badServerResponse)
}
}
// Usage
do {
try await trackNewsletter(
accessToken: "eyJhbGciOiJIUzI1NiIs...",
newsletterId: UUID(uuidString: "123e4567-e89b-12d3-a456-426614174000")!
)
print("Newsletter tracked successfully")
} catch {
print("Failed to track newsletter:", error.localizedDescription)
}
class NewsletterService(private val client: OkHttpClient) {
suspend fun trackNewsletter(accessToken: String, newsletterId: String) {
val request = Request.Builder()
.url("https://api.tktchurch.com/v1/newsletters/$newsletterId/track")
.post(RequestBody.create(null, ByteArray(0)))
.header("Authorization", "Bearer $accessToken")
.build()
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) {
val error = response.body?.string()?.fromJson<ErrorResponse>()
throw Exception(error?.reason ?: "Failed to track newsletter")
}
}
}
}
// Usage
try {
newsletterService.trackNewsletter(
"eyJhbGciOiJIUzI1NiIs...",
"123e4567-e89b-12d3-a456-426614174000"
)
println("Newsletter tracked successfully")
} catch (e: Exception) {
println("Failed to track newsletter: ${e.message}")
}
import axios from 'axios';
const trackNewsletter = async (
accessToken: string,
newsletterId: string
): Promise<void> => {
try {
await axios.post(
`https://api.tktchurch.com/v1/newsletters/${newsletterId}/track`,
null,
{
headers: {
'Authorization': `Bearer ${accessToken}`
},
}
);
} catch (error) {
if (axios.isAxiosError(error)) {
throw new Error(error.response?.data?.error?.reason || 'Failed to track newsletter');
}
throw error;
}
};
// Usage
try {
await trackNewsletter(
'eyJhbGciOiJIUzI1NiIs...',
'123e4567-e89b-12d3-a456-426614174000'
);
console.log('Newsletter tracked successfully');
} catch (error) {
console.error('Failed to track newsletter:', error.message);
}
{
"error": {
"status": 400,
"reason": "Invalid newsletter ID format"
}
}
{
"error": {
"status": 401,
"reason": "Invalid or expired access token"
}
}
{
"error": {
"status": 403,
"reason": "Missing required permission: readNewsletter"
}
}
{
"error": {
"status": 404,
"reason": "Newsletter not found"
}
}
This endpoint requires authentication and the
readNewsletter permission.Path Parameters
string
required
The UUID of the newsletter to track
Response
Returns HTTP 200 OK on successful tracking.Error Responses
object
Common error cases:
- 400 Bad Request: Invalid newsletter ID format
- 401 Unauthorized: Missing or invalid access token
- 403 Forbidden: Missing required permission
- 404 Not Found: Newsletter not found
curl -X POST "https://api.tktchurch.com/v1/newsletters/123e4567-e89b-12d3-a456-426614174000/track" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
const trackNewsletter = async (accessToken, newsletterId) => {
const response = await fetch(
`https://api.tktchurch.com/v1/newsletters/${newsletterId}/track`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`
}
}
);
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.reason);
}
};
// Usage
try {
await trackNewsletter(
'eyJhbGciOiJIUzI1NiIs...',
'123e4567-e89b-12d3-a456-426614174000'
);
console.log('Newsletter tracked successfully');
} catch (error) {
console.error('Failed to track newsletter:', error.message);
}
func trackNewsletter(accessToken: String, newsletterId: UUID) async throws {
var urlRequest = URLRequest(url: URL(string: "https://api.tktchurch.com/v1/newsletters/\(newsletterId)/track")!)
urlRequest.httpMethod = "POST"
urlRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let (_, response) = try await URLSession.shared.data(for: urlRequest)
guard let httpResponse = response as? HTTPURLResponse else {
throw URLError(.badServerResponse)
}
if httpResponse.statusCode != 200 {
throw URLError(.badServerResponse)
}
}
// Usage
do {
try await trackNewsletter(
accessToken: "eyJhbGciOiJIUzI1NiIs...",
newsletterId: UUID(uuidString: "123e4567-e89b-12d3-a456-426614174000")!
)
print("Newsletter tracked successfully")
} catch {
print("Failed to track newsletter:", error.localizedDescription)
}
class NewsletterService(private val client: OkHttpClient) {
suspend fun trackNewsletter(accessToken: String, newsletterId: String) {
val request = Request.Builder()
.url("https://api.tktchurch.com/v1/newsletters/$newsletterId/track")
.post(RequestBody.create(null, ByteArray(0)))
.header("Authorization", "Bearer $accessToken")
.build()
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) {
val error = response.body?.string()?.fromJson<ErrorResponse>()
throw Exception(error?.reason ?: "Failed to track newsletter")
}
}
}
}
// Usage
try {
newsletterService.trackNewsletter(
"eyJhbGciOiJIUzI1NiIs...",
"123e4567-e89b-12d3-a456-426614174000"
)
println("Newsletter tracked successfully")
} catch (e: Exception) {
println("Failed to track newsletter: ${e.message}")
}
import axios from 'axios';
const trackNewsletter = async (
accessToken: string,
newsletterId: string
): Promise<void> => {
try {
await axios.post(
`https://api.tktchurch.com/v1/newsletters/${newsletterId}/track`,
null,
{
headers: {
'Authorization': `Bearer ${accessToken}`
},
}
);
} catch (error) {
if (axios.isAxiosError(error)) {
throw new Error(error.response?.data?.error?.reason || 'Failed to track newsletter');
}
throw error;
}
};
// Usage
try {
await trackNewsletter(
'eyJhbGciOiJIUzI1NiIs...',
'123e4567-e89b-12d3-a456-426614174000'
);
console.log('Newsletter tracked successfully');
} catch (error) {
console.error('Failed to track newsletter:', error.message);
}
{
"error": {
"status": 400,
"reason": "Invalid newsletter ID format"
}
}
{
"error": {
"status": 401,
"reason": "Invalid or expired access token"
}
}
{
"error": {
"status": 403,
"reason": "Missing required permission: readNewsletter"
}
}
{
"error": {
"status": 404,
"reason": "Newsletter not found"
}
}
