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.
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
| Aspect | Contract |
|---|---|
| Transport | HTTPS POST with header Content-Type: application/json. |
| Endpoint | A single HTTPS URL that you host and provide to us. Both event types are delivered to the same URL. |
| Event type | Every payload has a top-level event field, either call_completion or agreement_signed. Route on this field, not on the presence of other fields. |
| Correlation | Both events for the same matter carry the same usage_id. Use it to link a signed agreement back to its call. |
| Independence | The 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 values | A 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. |
| Timestamps | All timestamps are UTC in ISO-8601 format, for example 2026-09-15T20:00:00Z. |
| Character encoding | UTF-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-keyheader 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
{
"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
| Field | Type | Meaning |
|---|---|---|
event | string | Always call_completion for this event. Route on this value. |
usage_id | string | Correlation key for the matter. The signed-agreement event for the same matter carries the same value. |
engagement_id | string | Identifies the engagement the event belongs to. |
call_information
| Field | Type | Meaning |
|---|---|---|
call_start | string (UTC ISO-8601) or null | When the call began. |
call_end | string (UTC ISO-8601) or null | When the call ended. |
call_disposition | string or null | The outcome the agent recorded for the call. |
agent_notes | string or null | Free-text notes the agent recorded. |
ai_summary | string or null | A generated summary of the call. |
call_id | string or null | Unique identifier for the call. |
recording_link | string (URL) or null | Link to the call recording. |
direction | string or null | Call 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.
| Field | Type | Meaning |
|---|---|---|
case_type | string or null | The category of the legal matter. |
calling_on_behalf_of | string or null | Who the caller is calling on behalf of, for example Self. |
what_is_your_relation_to_them | string or null | The caller's relationship to the injured party. |
injured_party_first_name | string or null | Injured party first name. |
injured_party_last_name | string or null | Injured party last name. |
your_name_the_caller | string or null | The caller's own name. |
date_of_birth | string or null | Injured party date of birth. |
best_callback_number | string or null | Best number to reach the caller. |
backup_phone_or_emergency_contact | string or null | Backup phone or emergency contact. |
email | string or null | Contact email supplied during the questionnaire. |
mailing_address | string or null | Mailing street address. |
mailing_city | string or null | Mailing city. |
mailing_state | string or null | Mailing state. |
mailing_postalzip | string or null | Mailing postal or ZIP code. |
incident_date | string or null | Date the incident occurred. |
incident_approximate_time | string or null | Approximate time of the incident. |
incident_city | string or null | City where the incident occurred. |
incident_state | string or null | State where the incident occurred. |
incident_zip | string or null | Postal or ZIP code of the incident location. |
incident_location | string or null | Description of the exact incident location. |
how_did_it_happen | string or null | How the incident happened. |
injury_description | string or null | Description of the injuries. |
intake_information.client_information
| Field | Type | Meaning |
|---|---|---|
firstName | string or null | Client first name. |
lastName | string or null | Client last name. |
phone | string or null | Client phone number. |
email | string or null | Client 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.
| Field | Type | Meaning |
|---|---|---|
question | string | The question identifier. |
answer | string or null | The recorded answer. |
7. Event: agreement_signed
7.1 Example payload
{
"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
| Field | Type | Meaning |
|---|---|---|
event | string | Always agreement_signed for this event. Route on this value. |
agreement_information.agreement_status | string or null | Status of the signed document, for example completed. |
agreement_information.agreement_url | string (URL) or null | Link to the agreement document. Retrieve the document yourself from this URL; we deliver the link, not the file. |
usage_id | string | Correlation key. Matches the call event for the same matter. |
engagement_id | string | Identifies the engagement the event belongs to. |
An agreement event carries no call or intake data.
8. What you need to implement
- Host an HTTPS endpoint that accepts POST requests with
Content-Type: application/json. - Validate the
x-api-keyheader on every request; reject requests without the correct token. - Read the
eventfield and route to your call or agreement handler. - Parse the payload, treating any field as possibly
null. - Store the event, then return HTTP 200 promptly.
- De-duplicate on the pair (
usage_id,event) so a retried delivery is accepted only once. - 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.