Skip to main content

Frontline Data-Out Integration Guide

This document describes everything required to receive Frontline data-out events. A developer can build and operate the receiving endpoint from this document alone.

note

Frontline was previously named Intake360. The product and the data contract are unchanged.

1. Overview

Frontline delivers two kinds of event to an endpoint that you host:

  • A completed intake call (call_completion).
  • A signed agreement (agreement_signed).

We send each event to your endpoint as a JSON POST over HTTPS as soon as it occurs. You acknowledge receipt with HTTP 200. That is the entire contract.

2. How delivery works

AspectContract
TransportHTTPS POST with header Content-Type: application/json.
EndpointA single HTTPS URL that you host and provide to us. Both event types are delivered to the same URL.
Event typeEvery payload has a top-level event field, either call_completion or agreement_signed. Route on this field, not on the presence of other fields.
CorrelationBoth events for the same matter carry the same usage_id. Use it to link a signed agreement back to its call.
IndependenceThe signed agreement is a separate, later event. It does not arrive for every matter, and it may arrive before or after you expect. Do not wait for it and do not treat its absence as an error.
Null valuesA field we do not have a value for is sent as an explicit null. Fields are never omitted, so your parser can rely on the keys always being present.
TimestampsAll timestamps are UTC in ISO-8601 format, for example 2026-09-15T20:00:00Z.
Character encodingUTF-8.

3. Authentication

Every request carries a token that we generate and issue to you. It is sent in the x-api-key request header on every delivery.

  • Validate the x-api-key header on every incoming request. Reject any request that is missing the header or presents the wrong value.
  • Keep the token secret. Do not log it or expose it.
  • Rotation is available on manual request. There is no automatic rotation at this time. To rotate, ask us and we will issue a new token for you to put into effect.

:::warning Validate on every request An endpoint that accepts unauthenticated POSTs will accept anything the public internet sends it. Check the header before you parse the body. :::

4. The response we require

Return HTTP 200 once you have received and stored the event.

  • Return 200 as soon as the payload is safely received. Do not wait for your downstream processing to complete.
  • Any response other than HTTP 200, or no response within our timeout, is treated as a failed delivery and is retried. See Retry behaviour below.

5. Retry behaviour

If a delivery does not return HTTP 200, we retry it.

  • Up to 5 attempts over approximately 20 minutes.
  • If all attempts fail, the delivery is marked failed and we stop retrying it.
  • Because deliveries are retried, the same event may reach you more than once.

:::info De-duplication Treat the pair (usage_id, event) as the unique key for an event, and safely ignore a duplicate you have already accepted. :::

6. Event: call_completion

6.1 Example payload

call_completion
{
"event": "call_completion",
"call_information": {
"call_start": "2026-09-15T20:00:00Z",
"call_end": "2026-09-15T20:07:30Z",
"call_disposition": "Qualified",
"agent_notes": "Caller was rear-ended; no police report.",
"ai_summary": "Inbound caller reported a motor vehicle accident and is seeking representation.",
"call_id": "CALL-9001",
"recording_link": "https://recordings.example.com/CALL-9001",
"direction": "Inbound"
},
"intake_information": {
"standard_questions": {
"case_type": "Motor Vehicle Accident",
"calling_on_behalf_of": "Self",
"what_is_your_relation_to_them": null,
"injured_party_first_name": "Jane",
"injured_party_last_name": "Doe",
"your_name_the_caller": null,
"date_of_birth": "2000-10-05",
"best_callback_number": "5555550147",
"backup_phone_or_emergency_contact": null,
"email": "jane.doe@example.com",
"mailing_address": "123 Main St",
"mailing_city": "Denver",
"mailing_state": "CO",
"mailing_postalzip": "80202",
"incident_date": "2026-09-03",
"incident_approximate_time": "14:30",
"incident_city": "Denver",
"incident_state": "CO",
"incident_zip": "80202",
"incident_location": "Intersection of 1st and Main",
"how_did_it_happen": "Rear-ended at a red light.",
"injury_description": "Neck and lower back pain."
},
"client_information": {
"firstName": "Jane",
"lastName": "Doe",
"phone": "5555550147",
"email": "jane.doe@example.com"
},
"custom_questions": [
{ "question": "currently_represented", "answer": "No" },
{ "question": "received_medical_care", "answer": "Yes" }
]
},
"usage_id": "12345",
"engagement_id": "13"
}

6.2 Field definitions

Top level

FieldTypeMeaning
eventstringAlways call_completion for this event. Route on this value.
usage_idstringCorrelation key for the matter. The signed-agreement event for the same matter carries the same value.
engagement_idstringIdentifies the engagement the event belongs to.

call_information

FieldTypeMeaning
call_startstring (UTC ISO-8601) or nullWhen the call began.
call_endstring (UTC ISO-8601) or nullWhen the call ended.
call_dispositionstring or nullThe outcome the agent recorded for the call.
agent_notesstring or nullFree-text notes the agent recorded.
ai_summarystring or nullA generated summary of the call.
call_idstring or nullUnique identifier for the call.
recording_linkstring (URL) or nullLink to the call recording.
directionstring or nullCall direction, for example Inbound or Outbound.

intake_information.standard_questions

A fixed set of intake fields. All keys below are always present; a field with no answer is null.

FieldTypeMeaning
case_typestring or nullThe category of the legal matter.
calling_on_behalf_ofstring or nullWho the caller is calling on behalf of, for example Self.
what_is_your_relation_to_themstring or nullThe caller's relationship to the injured party.
injured_party_first_namestring or nullInjured party first name.
injured_party_last_namestring or nullInjured party last name.
your_name_the_callerstring or nullThe caller's own name.
date_of_birthstring or nullInjured party date of birth.
best_callback_numberstring or nullBest number to reach the caller.
backup_phone_or_emergency_contactstring or nullBackup phone or emergency contact.
emailstring or nullContact email supplied during the questionnaire.
mailing_addressstring or nullMailing street address.
mailing_citystring or nullMailing city.
mailing_statestring or nullMailing state.
mailing_postalzipstring or nullMailing postal or ZIP code.
incident_datestring or nullDate the incident occurred.
incident_approximate_timestring or nullApproximate time of the incident.
incident_citystring or nullCity where the incident occurred.
incident_statestring or nullState where the incident occurred.
incident_zipstring or nullPostal or ZIP code of the incident location.
incident_locationstring or nullDescription of the exact incident location.
how_did_it_happenstring or nullHow the incident happened.
injury_descriptionstring or nullDescription of the injuries.

intake_information.client_information

FieldTypeMeaning
firstNamestring or nullClient first name.
lastNamestring or nullClient last name.
phonestring or nullClient phone number.
emailstring or nullClient email address.

intake_information.custom_questions

An array of firm-specific questionnaire items that fall outside the standard set. Empty array when there are none.

FieldTypeMeaning
questionstringThe question identifier.
answerstring or nullThe recorded answer.

7. Event: agreement_signed

7.1 Example payload

agreement_signed
{
"event": "agreement_signed",
"agreement_information": {
"agreement_status": "completed",
"agreement_url": "https://app.pandadoc.com/s/abc123"
},
"usage_id": "12345",
"engagement_id": "13"
}

7.2 Field definitions

FieldTypeMeaning
eventstringAlways agreement_signed for this event. Route on this value.
agreement_information.agreement_statusstring or nullStatus of the signed document, for example completed.
agreement_information.agreement_urlstring (URL) or nullLink to the agreement document. Retrieve the document yourself from this URL; we deliver the link, not the file.
usage_idstringCorrelation key. Matches the call event for the same matter.
engagement_idstringIdentifies the engagement the event belongs to.

An agreement event carries no call or intake data.

8. What you need to implement

  1. Host an HTTPS endpoint that accepts POST requests with Content-Type: application/json.
  2. Validate the x-api-key header on every request; reject requests without the correct token.
  3. Read the event field and route to your call or agreement handler.
  4. Parse the payload, treating any field as possibly null.
  5. Store the event, then return HTTP 200 promptly.
  6. De-duplicate on the pair (usage_id, event) so a retried delivery is accepted only once.
  7. Link a signed agreement to its call using usage_id.

Need help?

Integration questions, credential rotation, and endpoint changes go through your Attorney Assistant account contact.