Duplicate Activity Detection Service
API Contract
REST
/api/v1/duplicate-activity-matches
6 endpoints
GET
/api/v1/duplicate-activity-matches/api/v1/duplicate-activity-matches
List all duplicate activity matches (pending review)
Public
Response Example
{
"data": [
{
"match_id": "dam-0091",
"contact_id": "contact-8821",
"existing_activity_id": "act-4411",
"pending_activity_type": "volunteer_hours",
"similarity_score": 0.97,
"detected_at": "2026-03-26T11:20:00Z",
"status": "pending"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 3
}
}
GET
/api/v1/duplicate-activity-matches/api/v1/duplicate-activity-matches/:id
Get a specific duplicate match by ID
Public
Response Example
{
"match_id": "dam-0091",
"contact_id": "contact-8821",
"existing_activity_id": "act-4411",
"existing_activity": {
"activity_id": "act-4411",
"activity_type": "volunteer_hours",
"chapter_id": "chapter-oslo",
"submitted_at": "2026-03-25T10:00:00Z",
"hours": 4
},
"pending_activity": {
"activity_type": "volunteer_hours",
"chapter_id": "chapter-bergen",
"submitted_at": "2026-03-26T11:15:00Z",
"hours": 4
},
"similarity_score": 0.97,
"detected_at": "2026-03-26T11:20:00Z",
"status": "pending"
}
POST
/api/v1/duplicate-activity-matches/api/v1/duplicate-activity-matches/check
Check a pending activity submission for duplicates across all chapters
Public
Request Example
{
"contact_id": "contact-8821",
"activity_type": "volunteer_hours",
"chapter_id": "chapter-bergen",
"submitted_at": "2026-03-26T11:15:00Z",
"hours": 4,
"description": "Community garden cleanup"
}
Response Example
{
"is_duplicate": true,
"match": {
"match_id": "dam-0091",
"existing_activity_id": "act-4411",
"similarity_score": 0.97,
"detected_at": "2026-03-26T11:20:00Z",
"status": "pending"
}
}
PUT
/api/v1/duplicate-activity-matches/api/v1/duplicate-activity-matches/:id
Update a duplicate match status (dismiss or cancel warning)
Public
Request Example
{
"status": "dismissed",
"coordinator_id": "user-coord-55",
"resolution_note": "Verified distinct events across chapters"
}
Response Example
{
"match_id": "dam-0091",
"status": "dismissed",
"coordinator_id": "user-coord-55",
"resolved_at": "2026-03-26T13:00:00Z"
}
DELETE
/api/v1/duplicate-activity-matches/api/v1/duplicate-activity-matches/:id
Remove a duplicate match record
Public
Response Example
{
"deleted": true,
"match_id": "dam-0091"
}
GET
/api/v1/duplicate-activity-matches/api/v1/duplicate-activity-matches/contact/:contactId/activities
Get all activities for a contact across all chapters
Public
Response Example
{
"data": [
{
"activity_id": "act-4411",
"contact_id": "contact-8821",
"chapter_id": "chapter-oslo",
"activity_type": "volunteer_hours",
"submitted_at": "2026-03-25T10:00:00Z",
"hours": 4
},
{
"activity_id": "act-4298",
"contact_id": "contact-8821",
"chapter_id": "chapter-stavanger",
"activity_type": "training_session",
"submitted_at": "2026-03-20T14:00:00Z",
"hours": 2
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 18
}
}