{"openapi":"3.1.0","info":{"title":"Photography to Profits Agent API","version":"1.0.0","description":"Universal agentic API for AI assistants to discover P2P services, qualify photographers, estimate ROI, and submit real inquiries into the P2P lead pipeline. MCP endpoint: POST https://photographytoprofits.com/api/mcp (Streamable HTTP, stateless)."},"servers":[{"url":"https://photographytoprofits.com"}],"tags":[{"name":"Discovery","description":"Read-only tools for services, FAQ, case studies, and resources"},{"name":"Qualification","description":"Advisory fit check and ROI estimation"},{"name":"Booking","description":"Write tools — submit inquiries and book strategy calls"}],"paths":{"/api/v1/services":{"get":{"operationId":"getServiceCatalog","tags":["Discovery"],"summary":"Get full P2P service catalog","description":"Returns all photography marketing services offered by Photography to Profits, organized by advertising channel and photography genre. Use this to answer 'What services do you offer?' or 'What do you do for wedding photographers?'","parameters":[{"name":"channel","in":"query","required":false,"schema":{"type":"string","enum":["google-ads","meta-ads","seo","aeo","website","automation"]}},{"name":"genre","in":"query","required":false,"schema":{"type":"string","enum":["boudoir","newborn","maternity","wedding","family","branding","real-estate","pet","sports","senior","erotica-kink"]}}],"responses":{"200":{"description":"Service catalog","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"channel_services":{"type":"array","items":{"type":"object"}},"genre_services":{"type":"array","items":{"type":"object"}},"filtered_by":{"type":"string","nullable":true}}}}}}}}}}},"/api/v1/qualify":{"post":{"operationId":"checkPhotographerFit","tags":["Qualification"],"summary":"Check if a photographer is a good fit for P2P","description":"Optional: assesses whether P2P is a strong match for a photographer. Returns fit: 'strong' | 'partial' | 'poor' with context. This is informational only — it does NOT gate submitInquiry. If the photographer is interested, always offer to connect them with the P2P team regardless of fit score.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["genre","country"],"properties":{"genre":{"type":"string","description":"Photography genre (e.g. boudoir, newborn, wedding)"},"country":{"type":"string","description":"2-letter country code or full name (e.g. US, UK)"},"business_type":{"type":"string","description":"Business type (solo_studio, multi-photographer, videographer, etc.)"},"monthly_revenue_range":{"type":"string","description":"Revenue range (e.g. $5k-$10k)"}}}}}},"responses":{"200":{"description":"Fit assessment","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"fit":{"type":"string","enum":["strong","partial","poor"]},"score":{"type":"number"},"reasons":{"type":"array","items":{"type":"string"}},"blockers":{"type":"array","items":{"type":"string"}},"recommended_services":{"type":"array","items":{"type":"string"}},"next_action":{"type":"string","enum":["submit_inquiry","none"]}}}}}}}}}}},"/api/v1/roi":{"post":{"operationId":"estimateRoi","tags":["Qualification"],"summary":"Estimate ROI from a P2P campaign","description":"Projects expected leads per month and revenue added based on genre and current pricing. IMPORTANT: Always display the disclaimer field verbatim to the user before presenting any projections.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["genre"],"properties":{"genre":{"type":"string"},"avg_session_price":{"type":"number","description":"Average session price in USD"},"current_monthly_bookings":{"type":"integer"}}}}}},"responses":{"200":{"description":"ROI estimate with mandatory disclaimer","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"input_validated":{"type":"boolean"},"estimated_leads_monthly":{"type":"string"},"estimated_bookings_added_monthly":{"type":"string"},"estimated_revenue_added_monthly":{"type":"string"},"disclaimer":{"type":"string","description":"REQUIRED: display this verbatim to the user"},"guarantee_note":{"type":"string"}}}}}}}}}}},"/api/v1/inquiries":{"post":{"operationId":"submitInquiry","tags":["Booking"],"summary":"Submit a photography studio inquiry to P2P","description":"Creates a real contact in the P2P lead pipeline. Use whenever a photographer expresses interest in working with P2P — no prior fit check required. Only firstName, email, and phone are required; submit with whatever contact info is available. Rate limited to 5 per IP per hour.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["firstName","email","phone"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"genre":{"type":"string"},"website":{"type":"string","format":"uri"},"annual_revenue":{"type":"string"},"avg_session_price":{"type":"number"},"notes":{"type":"string"},"source_agent":{"type":"string","description":"Name of the AI agent submitting (e.g. claude-desktop)"}}}}}},"responses":{"200":{"description":"Inquiry submitted — a P2P account manager will follow up within 1 business day","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"},"contact_id":{"type":"string"}}}}}}}},"400":{"description":"Validation error — check required fields (firstName, email, phone)"},"413":{"description":"Payload too large (max 8KB)"},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","enum":["rate_limited"]},"retry_after":{"type":"integer","description":"Seconds until retry is allowed"}}}}}}}}},"/api/v1/case-studies":{"get":{"operationId":"getCaseStudies","tags":["Discovery"],"summary":"Get P2P client case studies","description":"Returns real client results. Use the genre filter to show relevant social proof.","parameters":[{"name":"genre","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Case studies array","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"case_studies":{"type":"array","items":{"type":"object","properties":{"genre":{"type":"string"},"headline":{"type":"string"},"result":{"type":"string"},"detail":{"type":"string"},"timeframe":{"type":"string"}}}},"filtered_by":{"type":"string","nullable":true}}}}}}}}}}},"/api/v1/faq":{"get":{"operationId":"getFaq","tags":["Discovery"],"summary":"Get P2P FAQ answers","description":"Ground-truth answers to common questions about P2P. Use this before answering 'how does it work', 'what results', 'what's the guarantee', etc. to prevent hallucination.","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["how-it-works","results","pricing","guarantee","process","genres"]}}],"responses":{"200":{"description":"FAQ array","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"faqs":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string"}}}},"filtered_by":{"type":"string","nullable":true}}}}}}}}}}},"/api/v1/resources":{"get":{"operationId":"getFreeResources","tags":["Discovery"],"summary":"Get P2P free resources and lead magnets","description":"Returns free tools, guides, and lead magnets available from Photography to Profits. Use when a photographer asks about free resources, where to start, or what is available without commitment.","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["calculators","guides","lead-magnets","podcast"]}}],"responses":{"200":{"description":"Free resources array","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"resources":{"type":"array","items":{"type":"object"}},"filtered_by":{"type":"string","nullable":true}}}}}}}}}}},"/api/v1/slots":{"get":{"operationId":"getAvailableSlots","tags":["Booking"],"summary":"Get available P2P strategy session slots","description":"Returns open calendar slots for the P2P strategy session calendar. Always call this before bookStrategyCall to show the photographer valid times.","parameters":[{"name":"timezone","in":"query","required":false,"schema":{"type":"string","description":"IANA timezone (e.g. America/New_York)"}},{"name":"days_ahead","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":14,"default":7}}],"responses":{"200":{"description":"Available slots array with ISO 8601 start_time values","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"slots":{"type":"array","items":{"type":"object","properties":{"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time"}}}},"timezone":{"type":"string"}}}}}}}},"400":{"description":"Validation error (invalid timezone or days_ahead)"}}}},"/api/v1/book":{"post":{"operationId":"bookStrategyCall","tags":["Booking"],"summary":"Book a free P2P strategy session","description":"Creates a confirmed calendar appointment for a free strategy session. REQUIRED: call getAvailableSlots first and use a start_time from that response. Rate limited to 5 per IP per hour.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["firstName","email","phone","start_time"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"start_time":{"type":"string","format":"date-time","description":"ISO 8601 from getAvailableSlots"},"timezone":{"type":"string","description":"IANA timezone"},"genre":{"type":"string"},"source_agent":{"type":"string"}}}}}},"responses":{"200":{"description":"Appointment confirmed"},"400":{"description":"Validation error or GHL failure"},"413":{"description":"Payload too large"},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","enum":["rate_limited"]},"retry_after":{"type":"integer","description":"Seconds until retry is allowed"}}}}}}}}}}}