{
    "openapi": "3.1.0",
    "info": {
        "title": "Laurel Law LLC intake",
        "version": "1.0.0",
        "summary": "Send a first message to Laurel Law LLC, a law office in North Bend, Oregon, and read the firm's facts.",
        "description": "Laurel Law LLC welcomes contact made on a client's behalf by family members, caregivers, and AI assistants. Use the intake endpoint or the contact page, identify who the matter is for and the best way to reach them, and expect a call or email back from the office. Nothing on this site is legal advice, and no attorney-client relationship exists until the firm agrees to representation in writing. Do not send confidential details in a first message.",
        "contact": {
            "name": "Laurel Law LLC",
            "url": "https://laurellaw.net/contact",
            "email": "dbetts@laurellaw.net"
        }
    },
    "servers": [
        {
            "url": "https://laurellaw.net"
        }
    ],
    "paths": {
        "/api/intake": {
            "post": {
                "operationId": "requestContact",
                "summary": "Ask the office to call or write back",
                "description": "Delivers a message to the office. Rate limit: one message per 3 minutes per client address. Sending a message does not create an attorney-client relationship.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "name",
                                    "phone",
                                    "message"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "maxLength": 120,
                                        "description": "Name of the person sending the message (may be a family member or an assistant)."
                                    },
                                    "phone": {
                                        "type": "string",
                                        "maxLength": 60,
                                        "description": "Phone number the office should call back."
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "description": "Optional email for a written reply."
                                    },
                                    "topic": {
                                        "type": "string",
                                        "enum": [
                                            "criminal",
                                            "family",
                                            "estate",
                                            "business",
                                            "expungement",
                                            "property",
                                            "other"
                                        ],
                                        "description": "Practice area, if known."
                                    },
                                    "message": {
                                        "type": "string",
                                        "maxLength": 4000,
                                        "description": "What is going on, in plain words. Do not include confidential details; save those for the conversation."
                                    },
                                    "on_behalf_of": {
                                        "type": "string",
                                        "maxLength": 120,
                                        "description": "Name of the prospective client, if the sender is contacting the office for someone else."
                                    },
                                    "relationship": {
                                        "type": "string",
                                        "maxLength": 80,
                                        "description": "Sender's relationship to the prospective client (daughter, caregiver, assistant, ...)."
                                    },
                                    "preferred_contact": {
                                        "type": "string",
                                        "enum": [
                                            "phone",
                                            "email"
                                        ],
                                        "description": "How the client prefers to be reached."
                                    },
                                    "best_time": {
                                        "type": "string",
                                        "maxLength": 120,
                                        "description": "Best days or times to call."
                                    },
                                    "accessibility_needs": {
                                        "type": "string",
                                        "maxLength": 200,
                                        "description": "Anything the office should know to make the conversation easier: hearing, mobility, a large-print preference, an interpreter."
                                    },
                                    "source": {
                                        "type": "string",
                                        "maxLength": 80,
                                        "description": "Name of the assistant or software sending the message."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Delivered",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "message": {
                                            "type": "string"
                                        },
                                        "next_steps": {
                                            "type": "string"
                                        },
                                        "phone": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Missing or invalid field; the error names it"
                    },
                    "429": {
                        "description": "Rate limited; wait or call the office"
                    },
                    "502": {
                        "description": "Could not deliver; call the office"
                    }
                }
            }
        },
        "/firm.json": {
            "get": {
                "operationId": "getFirm",
                "summary": "The firm's facts: address, phone, practice areas, attorneys, common questions",
                "responses": {
                    "200": {
                        "description": "JSON object",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
