{"openapi":"3.0.3","info":{"title":"Nuconnect Backend API","version":"1.0.0","description":"Local API docs for testing. Use the Authorize button to set a token for protected endpoints (paste the raw JWT only — do NOT include the \"Bearer \" prefix)."},"servers":[{"url":"http://localhost:3000"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/status":{"get":{"summary":"Health check","responses":{"200":{"description":"Unix timestamp as string","content":{"text/plain":{"schema":{"type":"string"}}}}}},"head":{"summary":"Health check (HEAD)","responses":{"200":{"description":"OK"}}}},"/auth/firebase":{"post":{"summary":"Exchange Firebase ID token for backend JWT","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["idToken"],"properties":{"idToken":{"type":"string"}}}}}},"responses":{"200":{"description":"Backend session token + user info"},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"}}}},"/integrations/providers":{"get":{"summary":"List supported ticketing providers","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Supported providers"},"401":{"description":"Unauthorized"}}}},"/integrations/events/{eventId}":{"get":{"summary":"List integrations configured for an event","security":[{"bearerAuth":[]}],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Event integrations"},"401":{"description":"Unauthorized"}}},"post":{"summary":"Connect or update a ticketing provider for an event","security":[{"bearerAuth":[]}],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["provider"],"properties":{"provider":{"type":"string"},"providerEventId":{"type":"string"},"accessMode":{"type":"string","example":"registered_only"},"syncMode":{"type":"string","example":"api"},"config":{"type":"object"},"metadata":{"type":"object"}}}}}},"responses":{"200":{"description":"Saved integration config"},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"}}}},"/integrations/events/{eventId}/csv/sync":{"post":{"summary":"Sync a CSV attendee roster into canonical event attendee records","security":[{"bearerAuth":[]}],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["rows"],"properties":{"fileName":{"type":"string"},"mapping":{"type":"object","additionalProperties":{"type":"string"}},"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"options":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Sync summary and run metadata"},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"}}}},"/users/profile":{"get":{"summary":"Get my profile","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"User profile"},"401":{"description":"Unauthorized"}}},"put":{"summary":"Update my profile","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"username":{"type":"string"},"first_name":{"type":"string"},"last_name":{"type":"string"},"phone_number":{"type":"string"},"location":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"job":{"type":"string"},"education":{"type":"string"},"industry":{"type":"string"},"skills":{"type":"array","items":{"type":"string"}},"bio":{"type":"string"},"avatar_url":{"type":"string"}}}}}},"responses":{"200":{"description":"Updated user record"},"401":{"description":"Unauthorized"}}}},"/users/onboard":{"put":{"summary":"Save onboarding answers and mark onboarding complete","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["onboarding_data"],"properties":{"onboarding_data":{"type":"array","items":{"type":"object","required":["id","question","answer"],"properties":{"id":{"type":"string"},"question":{"type":"string"},"answer":{}}}}}}}}},"responses":{"200":{"description":"Onboarding saved"},"400":{"description":"Invalid payload"},"401":{"description":"Unauthorized"}}}},"/users/me":{"delete":{"summary":"Delete my backend account + related data","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deletion summary"},"401":{"description":"Unauthorized"}}}},"/safety/block":{"post":{"summary":"Block a user","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["blocked_user_id"],"properties":{"blocked_user_id":{"type":"string"}}}}}},"responses":{"201":{"description":"Block created (idempotent)"},"401":{"description":"Unauthorized"}}}},"/safety/report":{"post":{"summary":"Report a user (optionally also block)","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reported_user_id","reason"],"properties":{"reported_user_id":{"type":"string"},"reason":{"type":"string"},"details":{"type":"string"},"also_block":{"type":"boolean"},"context":{"type":"object","properties":{"conversation_id":{"type":"string"},"source":{"type":"string"}}}}}}}},"responses":{"201":{"description":"Report created (and block created if requested)"},"401":{"description":"Unauthorized"}}}}}}