Skip to main content

Leads and Showings

Webhook 

The ShowMojo Webhook allows you to receive real-time notifications about lead and showing events via HTTP POST.

Overview​

This webhook is triggered whenever a lead or showing is created, updated, or changed. The webhook will POST a JSON payload to the configured endpoint URL in ShowMojo.

Configuration can be found in the Leads Webhook section.

With a webhook and a programmer, you can export data almost anywhere. Even platforms like Zapier or Podio might be enough — no custom code required.


Security​

Every request is signed. Two headers carry the signature:

  • X-ShowMojo-Timestamp: Unix time, in seconds, when ShowMojo sent the request
  • X-ShowMojo-Signature: lowercase hex HMAC-SHA256 of <timestamp>.<raw request body>, keyed with your webhook's signing secret

Find the signing secret, or generate a new one, in the Leads Webhook section.

To verify a request:

  1. Read the raw request body before parsing it as JSON.
  2. Compute HMAC-SHA256 of the X-ShowMojo-Timestamp value, a ., and the raw body, with the signing secret as the key, and hex-encode it.
  3. Compare the result with X-ShowMojo-Signature using a constant-time comparison.
  4. Reject requests whose timestamp is more than five minutes old.

Ruby (Rails):

def showmojo_request?(request, secret)
timestamp = request.headers['X-ShowMojo-Timestamp'].to_s
expected = OpenSSL::HMAC.hexdigest('SHA256', secret, "#{timestamp}.#{request.raw_post}")

(Time.now.to_i - timestamp.to_i).abs <= 300 &&
ActiveSupport::SecurityUtils.secure_compare(expected, request.headers['X-ShowMojo-Signature'].to_s)
end

Node.js:

const crypto = require('crypto');

function isShowMojoRequest(rawBody, headers, secret) {
const timestamp = headers['x-showmojo-timestamp'] || '';
const signature = headers['x-showmojo-signature'] || '';
const expected = crypto.createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex');

return Math.abs(Date.now() / 1000 - Number(timestamp)) <= 300 &&
signature.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}

Deprecated: HTTPS endpoints configured before request signing was introduced still receive Authorization: Bearer <API token>. Endpoints configured since then never receive it, and the header will be removed for all endpoints. Verify the signature instead and do not rely on the Bearer token.

Delivery and retries​

  • ShowMojo sends each event once and waits up to 15 seconds for your response.
  • Respond with 200 OK. Any other status, including other 2xx codes, a timeout or a connection error, counts as a failed attempt.
  • A failed attempt is retried up to 5 times, after 5, 15, 45, 135 and 405 minutes (about 10 hours in total). After the last retry the event is dropped and not sent again.
  • If 5 events exhaust their retries within 24 hours, the webhook is disabled and the account owner receives an email. Fix the endpoint, then re-enable the webhook in the Leads Webhook section. Events that occur while it is disabled are not sent.

Replay and duplicates​

  • Every event has a unique, increasing event.id. A retry carries the same event.id. Its body is rebuilt at send time, so it may reflect a later state of the lead or showing, and the signature headers are computed fresh for each attempt.
  • Keep the event.id values you have processed and ignore a request whose id you have already seen.
  • Reject requests whose X-ShowMojo-Timestamp is more than five minutes old, so a captured request cannot be replayed later.
  • Out-of-order delivery is possible, for example when an earlier event is retried after a later one succeeded. Use event.id to order events.

Notes​

  • HTTPS is strongly preferred
  • Some fields may be null (especially timestamps)

Actions Reference​

All 169 values of event.action, with the meaning shown in the ShowMojo showing history
event.actionMeaning
acceptAccepted
acceptance_reminderShowtime acceptance reminder sent
acceptance_reminder_approversShowtime acceptance reminder sent to approvers
acceptance_reminder_owner_agentShowtime acceptance reminder sent to you
acceptance_requestShowtime acceptance requested
accept_for_everyoneShowtime accepted for everyone
accept_for_meShowtime accepted
additional_document_receivedDocument received
additional_document_requestedDocument manually requested
additional_document_request_sentDocument requested
ai_web_conversation_endedAI web chat conversation
annual_follow_up_emailAnnual follow up email sent
answer_resentAnswer to prospect question resent
answer_security_questionsAnswer security questions
answer_security_questions_third_failureThird failed attempt to answer security questions within 24 hours
appfolio_user_assignment_failedUser assignment failed in AppFolio due to user permissions
applicant_transitioned_from_residentResident transitioned to applicant
applicant_transitioned_to_residentApplicant transitioned to resident
assign_unclaimed_showing_to_ownerAssign unclaimed showing to account owner
auto_cancel_no_replyAuto-canceled due to no reply
auto_create_by_smsShowing auto-created by SMS
blacklisted_asn_passed_anti_fraud_checksAccess code not distributed because the showing was flagged for potential fraudulent activity
blacklisted_asn_passed_only_location_verificationAccess code not distributed because the showing was flagged for potential fraudulent activity
blacklisted_prospectEmail and phone blacklisted
call_redirectedRedirected
call_redirect_endedLive call
call_transferred_from_cciLive call was transferred from Live Answer to Property Manager
call_transferred_to_cciLive call was transferred to Live Answer
call_transferred_to_regular_queueLive call transferred to regular queue
call_transferred_to_self_show_escalation_queueLive call transferred to self-show escalation queue
cancelCanceled
cancel_identity_verification_failedCanceled because identity verification failed
cancel_noticeCancel notice sent
cancel_phone_or_email_blacklistedCanceled because phone or email is blacklisted
cancel_warningCancel warning sent
cci_prospect_asked_questionProspect question submitted
cci_screening_criteria_not_metScreening criteria was not met when scheduled via Live Answer
claimedClaimed
claim_requestClaim requested
confirmConfirmed
confirm_automaticallyAutomatically confirmed
confirm_insecured_lockboxProperty NOT secured reported
confirm_lockbox_outcome_no_showProspect did not make showing
confirm_requestConfirm requested
confirm_secured_lockboxProperty secured reported
confirm_secured_lockbox_requestConfirm secured property requested
createShowing created
declineShowtime rejected
decline_proposed_timesProposed showtimes rejected
document_auto_approved_because_not_reviewed_in_timeDocument auto-approved because was not reviewed in time
document_receivedDocument for verification sent
document_rejectedDocument rejected
document_request_resentDocument request resent
document_verification_requestDocument verification request sent
document_verifiedDocument verified
dont_follow_upFollow up stopped
do_follow_upFollow up started
email_address_updatedEmail address changed to
email_application_criteria_linkEmailed application criteria link
email_apply_now_linkEmailed application link
email_delivery_failedEmail delivery failed
email_linkEmailed a link
email_on_new_active_listingNew active listing email sent
email_on_off_market_listingListing off market nurturing email sent
email_on_reannounce_new_listingNew listing reannouncement email sent
email_on_rent_reductionRent reduction email sent
emergency_reschedule_requestEmergency reschedule requested
flagged_as_fraudulentFlagged as fraudulent
follow_autoreplyFollowed auto-reply
follow_up_rescheduleFollow up reschedule request sent
fraud_or_scam_report_sentSent report about potential fraud activity to agent
hideHidden
identity_verification_failedIdentity verification failed
identity_verification_failed_auth_attempts_limit_exceededIdentity verification failed (exceeded limit of Precise ID Authentication attempted)
identity_verification_failed_recently_failedIdentity verification failed (recently failed Precise ID)
identity_verification_passedIdentity verification passed
identity_verification_requestedIdentity verification requested
identity_verification_skipped_recently_passedIdentity verification skipped (recently passed Precise ID)
inquiredInquired
inquired_about_multi_unitInquired about multi unit property
inquired_about_off_market_listingInquired about off market listing
instant_schedule_call_attemptedAI Instant Schedule call attempt
instant_schedule_handoffAI Instant Schedule handed off to an agent
instant_schedule_initiatedAI Instant Schedule initiated
last_reminderReminder sent
lead_converted_by_cciLead was converted to showing
lead_createdLead created
lead_created_by_off_market_update_processLead created by adding an applicant in Required Listing Updates
lead_showing_denied_custom_questionShowing denied (didn't meet requirements)
lead_showing_denied_incomeShowing denied (didn't meet income requirement)
lead_showing_denied_move_in_dateShowing denied (didn't meet move-in date requirement)
lead_showing_denied_petsShowing denied (didn't meet pet requirements)
lead_updatedLead updated
left_voicemailVoicemail
location_verification_auto_triggeredLocation verification anti-fraud measure added
location_verification_based_on_scheduling_anomalyLocation verification added based on scheduling anomaly
lockbox_code_distributedAccess code was sent to the prospect
lockbox_code_requestedAccess code requested
lockbox_showing_startedSelf-showing started
notified_showtimes_availableNotified that showtimes are available
outgoing_call_completedOutgoing call completed
outgoing_call_startedOutgoing call started
pet_screening_sentPet screening request sent
phone_for_lockbox_phone_call_verification_assignedPhone number for Phone Call Verification assigned
phone_number_changedPhone number changed
phone_verification_call_access_code_distributedAccess code via verification call was sent to the prospect
phone_verification_call_access_code_distributed_after_no_answerAccess code via verification call distributed after no phone answer
phone_verification_call_access_denied_during_callAccess denied during verification call
phone_verification_call_hung_up_before_answerVerification call hung up before answered
phone_verification_call_not_answeredVerification call not answered
pre_screen_completedPre-screen completed
pre_screen_overriddenPre-screen overridden
pre_screen_reminder_sentPre-screen reminder sent
pre_screen_request_sentPre-screen request sent
pre_showing_reminder_sentPre-showing reminder sent
proposed_timesProposed times
proposed_times_accpt_request_sentProposed times acceptance request sent
prospect_arrived_too_lateProspect arrived at showing too late
prospect_question_processed_with_answerInquiry reviewed and answered
prospect_question_processed_with_forwardingInquiry forwarded for an answer
prospect_question_processed_with_no_answerInquiry had no question
question_answeredProspect question answered
reply_needed_score_updatedReply needed score was updated
report_sharedReport shared
report_unsharedStop sharing report
requested_application_criteriaRequested application criteria
requested_availability_notificationRequested availability notification
reschedule_requestReschedule requested
reschedule_request_on_answers_not_receivedReschedule requested because answers not received
reschedule_request_on_document_not_receivedReschedule requested because document not received
reschedule_request_on_document_not_verifiedReschedule requested because document not verified
restoreRestored
screening_requestedApplicant screening requested
screening_request_automaticallyApplicant screening requested automatically
screening_request_email_sentApplicant screening request sent
screening_request_text_sentApplicant screening request sent
second_year_follow_up_emailSecond year follow up email sent
send_upcoming_showingsSend upcoming showings link
sent_access_code_email_fallbackAccess code emailed (SMS fallback)
sent_answers_requestAnswers request sent
sent_autoreplyAuto-reply sent
sent_autoreply_followupSent auto-reply follow-up
sent_document_and_answers_requestDocument and answers request sent
sent_document_requestDocument request sent
sent_follow_upFollow up sent
sent_self_showing_follow_upSelf-showing follow up sent
set_no_showReported as a no show
showing_denied_custom_questionShowing denied and canceled
showing_denied_custom_question_reasonProspect didn't meet requirements
showing_denied_incomeShowing denied and canceled
showing_denied_income_reasonProspect didn't meet income requirement
showing_denied_move_in_dateShowing denied and canceled
showing_denied_move_in_date_reasonProspect didn't meet move-in date requirement
showing_denied_petsShowing denied and canceled
showing_denied_pets_reasonProspect didn't meet pet requirements
showing_feedbackFeedback was left
showing_mismatched_custom_questionScheduling restrictor overridden for pre-scheduled showing (didn't meet requirements)
showing_mismatched_incomeScheduling restrictor overridden for pre-scheduled showing (didn't meet income requirement)
showing_mismatched_move_in_dateScheduling restrictor overridden for pre-scheduled showing (didn't meet move-in date requirement)
showing_mismatched_petsScheduling restrictor overridden for pre-scheduled showing (didn't meet pet requirements)
showing_with_disabled_location_verification_passed_checkLocation verification was not completed because it was disabled on the listing
text_application_criteria_linkTexted application criteria link
text_apply_now_linkTexted application link
text_linkTexted a link
third_party_applicant_addedApplicant applied outside of ShowMojo
uncancelUncanceled
unconfirmUnconfirmed
undo_no_showUndone a no show
updateShowing updated

Supported Time Zones​

Click to expand the full list
American Samoa
International Date Line West
Midway Island
Hawaii
Alaska
Pacific Time (US & Canada)
Tijuana
Arizona
Chihuahua
Mazatlan
Mountain Time (US & Canada)
Central America
Central Time (US & Canada)
Guadalajara
Mexico City
Monterrey
Saskatchewan
Bogota
Eastern Time (US & Canada)
Indiana (East)
Lima
Quito
Atlantic Time (Canada)
Caracas
Georgetown
La Paz
Santiago
Newfoundland
Brasilia
Buenos Aires
Greenland
Mid-Atlantic
Azores
Cape Verde Is.
Casablanca
Dublin
Edinburgh
Lisbon
London
Monrovia
UTC
Amsterdam
Belgrade
Berlin
Bern
Bratislava
Brussels
Budapest
Copenhagen
Ljubljana
Madrid
Paris
Prague
Rome
Sarajevo
Skopje
Stockholm
Vienna
Warsaw
West Central Africa
Zagreb
Athens
Bucharest
Cairo
Harare
Helsinki
Jerusalem
Kyiv
Pretoria
Riga
Sofia
Tallinn
Vilnius
Baghdad
Istanbul
Kuwait
Minsk
Moscow
Nairobi
Riyadh
St. Petersburg
Volgograd
Tehran
Abu Dhabi
Baku
Muscat
Tbilisi
Yerevan
Kabul
Ekaterinburg
Islamabad
Karachi
Tashkent
Chennai
Kolkata
Mumbai
New Delhi
Sri Jayawardenepura
Kathmandu
Almaty
Astana
Dhaka
Urumqi
Rangoon
Bangkok
Hanoi
Jakarta
Krasnoyarsk
Novosibirsk
Beijing
Chongqing
Hong Kong
Irkutsk
Kuala Lumpur
Perth
Singapore
Taipei
Ulaan Bataar
Osaka
Sapporo
Seoul
Tokyo
Yakutsk
Adelaide
Darwin
Brisbane
Canberra
Guam
Hobart
Melbourne
Port Moresby
Sydney
Vladivostok
Magadan
New Caledonia
Solomon Is.
Auckland
Fiji
Kamchatka
Marshall Is.
Wellington
Nuku'alofa
Samoa
Tokelau Is.

Request​

Responses​

Successfully received