openapi: "3.1.0" info: title: "partners_connect API" description: "partners_connect API" version: "1.0.0" servers: - url: "https://partners_connect" paths: /auth/callback: get: summary: "OAuth callback endpoint" operationId: "getAuthCallback" description: "OAuth callback endpoint" security: - {} responses: "404": description: "Not Found - Invalid OAuth state" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "302": description: "Found - Redirect after successful authentication" content: text/plain: schema: type: "string" "200": description: "OK - Authentication successful, returns session" content: application/json: schema: $ref: "#/components/schemas/UserSession" /auth/login: get: summary: "Get resource" operationId: "getAuthLogin" description: "Start OAuth login flow - redirects to Google OAuth" security: - {} responses: "200": description: "OK - Login page or redirect information" content: text/html: schema: type: "string" "302": description: "Redirect to OAuth provider" /auth/logout: get: summary: "Get resource" operationId: "getAuthLogout" description: "Logout and clear session" security: - {} responses: "204": description: "No Content - Successfully logged out" /auth/me: get: summary: "Get resource" operationId: "getAuthMe" description: "Get current user information" security: - bearerAuth: [] responses: "401": description: "Unauthorized - No valid session" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/UserInfo" /companies: get: summary: "Get resource" operationId: "getCompanies" description: "List companies with paging support" security: - {} parameters: - name: "query" in: "query" required: false schema: type: "string" description: "Search companies by name" - name: "filter[status]" in: "query" required: false schema: type: "string" enum: ["active", "inactive"] description: "Filter companies by status" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (must be >= 1)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page (must be between 1 and 100)" responses: "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/PaginatedCompany" post: summary: "Create company" operationId: "postCompanies" description: "Create a new company" security: - {} requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateCompany" required: true responses: "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /companies/{companyId}: get: summary: "Get company by ID" operationId: "getCompanyById" description: "Retrieve a specific company by its UUID" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" responses: "200": description: "OK - Company retrieved successfully" content: application/json: schema: $ref: "#/components/schemas/Company" "404": description: "Not Found - Company with specified ID not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "400": description: "Bad Request - Invalid company ID format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" put: summary: "Update company" operationId: "putCompanyById" description: "Update an existing company with partial or complete data" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateCompany" required: true responses: "200": description: "OK - Company updated successfully" content: application/json: schema: $ref: "#/components/schemas/Company" "400": description: "Bad Request - Invalid update data or validation errors" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Company with specified ID not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - SIRET already exists for another company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" delete: summary: "Delete company (soft delete)" operationId: "deleteCompanyById" description: "Soft delete a company by setting its status to inactive" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" responses: "204": description: "No Content - Company soft deleted successfully" "404": description: "Not Found - Company with specified ID not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "400": description: "Bad Request - Invalid company ID format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /companies/{companyId}/logo: post: summary: "Create resource" operationId: "postCompaniesLogo" description: "Upload a logo for a company" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" requestBody: content: multipart/form-data: schema: type: object properties: file: type: "string" format: binary description: "Logo file (SVG, PNG, or JPEG)" required: true responses: "400": description: "Bad Request - Invalid company ID or unsupported file type" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Logo uploaded successfully" content: application/json: schema: $ref: "#/components/schemas/Media" /companies/{companyId}/partnerships: get: summary: "List all partnerships for a company" operationId: "getCompaniesPartnership" description: "List all partnerships for a company" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: type: "array" items: $ref: "#/components/schemas/PartnershipItem" /companies/{companyId}/job-offers: get: summary: "List job offers for company" operationId: "getCompaniesJobOffers" description: "Retrieve all job offers for a specific company with pagination support" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (must be >= 1)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page (must be between 1 and 100)" responses: "200": description: "Successfully retrieved job offers" content: application/json: schema: $ref: "#/components/schemas/PaginatedJobOffer" "404": description: "Company not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Not authorized for this company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" post: summary: "Create job offer" operationId: "postCompaniesJobOffers" description: "Create a new job offer for the specified company" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateJobOffer" required: true responses: "201": description: "Job offer created successfully" content: application/json: schema: $ref: "#/components/schemas/Identifier" "400": description: "Bad Request - Invalid job offer data" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Company not found" "401": description: "Unauthorized" "403": description: "Forbidden - Not authorized for this company" /companies/{companyId}/job-offers/{jobOfferId}: get: summary: "Get job offer by ID" operationId: "getCompaniesJobOffersById" description: "Retrieve a specific job offer by its ID" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" - name: "jobOfferId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the job offer" responses: "200": description: "Successfully retrieved job offer" content: application/json: schema: $ref: "#/components/schemas/JobOfferResponse" "404": description: "Job offer not found or not owned by company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Not authorized for this company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" put: summary: "Update job offer" operationId: "putCompaniesJobOffersById" description: "Update an existing job offer with partial or complete data" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" - name: "jobOfferId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the job offer" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateJobOffer" required: true responses: "200": description: "Job offer updated successfully" content: application/json: schema: $ref: "#/components/schemas/JobOfferResponse" "400": description: "Bad Request - Invalid update data" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Job offer not found or not owned by company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Not authorized for this company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" delete: summary: "Delete job offer" operationId: "deleteCompaniesJobOffersById" description: "Delete an existing job offer" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the company" - name: "jobOfferId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the job offer" responses: "204": description: "Job offer deleted successfully" "404": description: "Job offer not found or not owned by company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Not authorized for this company" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /companies/{companyId}/partnerships/{partnershipId}/promote: post: summary: "Promote job offer to partnership" operationId: "promoteJobOfferToPartnership" description: "Company owner promotes a job offer to an active partnership with an event" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "Company unique identifier" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership unique identifier" requestBody: content: application/json: schema: $ref: "#/components/schemas/PromoteJobOfferRequest" required: true responses: "201": description: "Job offer promoted successfully" content: application/json: schema: type: "object" properties: id: type: "string" format: "uuid" "400": description: "Bad Request - Invalid request body or missing required fields" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Event has ended" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Company, partnership, or job offer not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Job offer already promoted with status pending/approved" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /companies/{companyId}/job-offers/{jobOfferId}/promotions: get: summary: "List job offer promotions" operationId: "listJobOfferPromotions" description: "List all promotions for a specific job offer across all partnerships" security: - {} parameters: - name: "companyId" in: "path" required: true schema: type: "string" format: "uuid" description: "Company unique identifier" - name: "jobOfferId" in: "path" required: true schema: type: "string" format: "uuid" description: "Job offer unique identifier" - name: "partnership_id" in: "query" required: false schema: type: "string" format: "uuid" description: "Filter by partnership ID" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number for pagination" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Items per page" responses: "200": description: "Successfully retrieved promotions" content: application/json: schema: type: "object" properties: items: type: "array" items: $ref: "#/components/schemas/JobOfferPromotionResponse" total: type: "integer" page: type: "integer" page_size: type: "integer" "404": description: "Company or job offer not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /events: get: summary: "List organization events" operationId: "getEvents" description: "List events with paging support" security: - {} parameters: - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (must be >= 1)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page (must be between 1 and 100)" responses: "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/PaginatedEventSummary" /events/{eventSlug}: get: summary: "Get resource" operationId: "getEventBySlug" description: "Get event details with organization information" security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "The slug identifier of the event" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/EventWithOrganisation" /events/{eventSlug}/agenda: get: summary: "Get public event agenda" operationId: "getEventAgendaPublic" description: "Retrieve event agenda with sessions and speakers for public consumption. No authentication required." security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug identifier" responses: "200": description: "OK - Agenda retrieved successfully" content: application/json: schema: $ref: "#/components/schemas/AgendaResponse" "404": description: "Not Found - Event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "500": description: "Internal Server Error" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /events/{eventSlug}/sponsoring/packs: get: summary: "List public sponsoring packages" operationId: "getEventsSponsoringPacks" description: "List public sponsoring packages for an event with embedded and optional options (authentication optional - publicly accessible)" security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "The slug identifier of the event" - name: "Accept-Language" in: "header" required: true schema: type: "string" description: "Language code for option translations (e.g., 'en', 'fr')" responses: "400": description: "Bad Request - Missing Accept-Language header or invalid request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event with specified slug does not exist" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - List of sponsoring packages with localized options" content: application/json: schema: type: "array" items: $ref: "#/components/schemas/SponsoringPack" /events/{eventSlug}/partnerships: post: summary: "Create resource" operationId: "postEventsPartnership" security: - {} description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/RegisterPartnership" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}: get: summary: "Get detailed partnership information" operationId: "getEventsPartnershipDetailed" security: - {} description: "Retrieve comprehensive partnership information including company, event, and process status details" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug identifier" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership unique identifier" responses: "200": description: "OK - Partnership details successfully retrieved" content: application/json: schema: $ref: "#/components/schemas/DetailedPartnershipResponse" "400": description: "Bad Request - Invalid partnership ID format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" put: summary: Update partnership contact information description: | Updates contact information fields for an existing partnership. This is a public endpoint that supports partial updates - only provided fields will be updated. All fields are optional. Updatable fields: - contact_name: Partner contact person's name - contact_role: Partner contact person's role/title - language: Preferred communication language (ISO 639-1) - phone: Contact phone number (free-form, 1-30 chars) - emails: List of contact email addresses operationId: updatePartnershipContactInfo security: - {} parameters: - name: eventSlug in: path required: true description: Unique slug identifier for the event schema: type: string example: "devlille-2025" - name: partnershipId in: path required: true description: UUID of the partnership to update schema: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" requestBody: required: true description: Contact information fields to update (all optional for partial updates) content: application/json: schema: $ref: "#/components/schemas/UpdatePartnershipContactInfo" responses: "200": description: Partnership contact information updated successfully content: application/json: schema: $ref: "#/components/schemas/DetailedPartnershipResponse" "400": description: Invalid request - validation errors content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: Event or partnership not found content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /events/{eventSlug}/partnerships/{partnershipId}/billing: get: summary: "Get partnership billing information" operationId: "getEventsPartnershipBilling" description: "" security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/CompanyBillingData" post: summary: "Create partnership billing" description: "" operationId: "postEventsPartnershipBilling" security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/CompanyBillingData" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/Identifier" put: summary: "Update partnership billing" description: "" operationId: "putEventsPartnershipBilling" security: - bearerAuth: [] parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/CompanyBillingData" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}/billing/invoice: post: summary: "Generate partnership invoice" operationId: "postEventsPartnershipBillingInvoice" security: - {} description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}/billing/quote: post: summary: "Generate partnership quote" operationId: "postEventsPartnershipBillingQuote" security: - {} description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}/signed-agreement: post: summary: "Upload signed partnership agreement" operationId: "postEventsPartnershipSignedAgreement" security: - {} description: "Upload a signed partnership agreement" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" requestBody: content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: "Signed agreement PDF file" required: true responses: "400": description: "Bad Request - Invalid file type or missing parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Signed agreement uploaded successfully" content: application/json: schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}/suggestion-approve: post: summary: "Approve partnership suggestion" operationId: "postEventsPartnershipSuggestionApprove" security: - {} description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}/suggestion-decline: post: summary: "Decline partnership suggestion" operationId: "postEventsPartnershipSuggestionDecline" security: - {} description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /events/{eventSlug}/partnerships/{partnershipId}/tickets: get: summary: "Get partnership tickets" operationId: "getEventsPartnershipTickets" security: - {} description: "" parameters: - name: "partnershipId" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: type: "array" items: $ref: "#/components/schemas/Ticket" post: summary: "Create partnership tickets" description: "" operationId: "postEventsPartnershipTickets" security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: type: "array" items: $ref: "#/components/schemas/TicketData" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/TicketOrder" /events/{eventSlug}/partnerships/{partnershipId}/tickets/{ticketId}: put: summary: "Update partnership ticket" operationId: "putEventsPartnershipTickets" security: - {} description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" - name: "ticketId" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/TicketData" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Ticket" /events/{eventSlug}/partnerships/{partnershipId}/job-offers: get: summary: "List job offers for partnership" operationId: "getPartnershipJobOffers" description: "Get paginated list of job offer promotions for a specific partnership. Public endpoint accessible without authentication." tags: - partnerships - job-offers security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership UUID" - name: "status" in: "query" required: false schema: type: "string" enum: ["pending", "approved", "declined"] description: "Filter by promotion status" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (1-indexed)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page" responses: "200": description: "OK - Successfully retrieved job offer promotions" content: application/json: schema: $ref: "#/components/schemas/PaginatedJobOfferPromotion" "400": description: "Bad Request - Invalid query parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /events/{eventSlug}/partnerships/{partnershipId}/speakers/{speakerId}: post: summary: "Attach speaker to partnership" operationId: "attachSpeakerToPartnership" description: "Associate a speaker with a partnership. Partnership must be validated first." tags: - partnerships - speakers security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug identifier" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership unique identifier" - name: "speakerId" in: "path" required: true schema: type: "string" format: "uuid" description: "Speaker unique identifier" responses: "201": description: "Created - Speaker successfully attached to partnership" content: application/json: schema: $ref: "#/components/schemas/SpeakerPartnership" "400": description: "Bad Request - Invalid partnership ID format or speaker and partnership from different events" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Partnership not validated" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership or speaker not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Speaker already attached to this partnership" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" delete: summary: "Detach speaker from partnership" operationId: "detachSpeakerFromPartnership" description: "Remove association between a speaker and a partnership." tags: - partnerships - speakers security: - {} parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug identifier" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership unique identifier" - name: "speakerId" in: "path" required: true schema: type: "string" format: "uuid" description: "Speaker unique identifier" responses: "204": description: "No Content - Speaker successfully detached from partnership" "404": description: "Not Found - Partnership, speaker, or association not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /providers: get: summary: "List providers" operationId: "getProviders" security: - {} description: "List all providers with optional filtering and sorting" parameters: - name: "org_slug" in: "query" required: false schema: type: "string" description: "Filter providers by organization slug" - name: "query" in: "query" required: false schema: type: "string" description: "Search providers by name (case-insensitive)" - name: "sort" in: "query" required: false schema: type: "string" enum: ["name", "createdAt", "creation", "created"] default: "createdAt" description: "Sort by field (default: createdAt)" - name: "direction" in: "query" required: false schema: type: "string" enum: ["asc", "desc"] default: "asc" description: "Sort direction (default: asc)" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (must be >= 1)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page (must be between 1 and 100)" responses: "200": description: "OK - Paginated list of providers" content: application/json: schema: $ref: "#/components/schemas/PaginatedProvider" post: summary: "Create new provider" description: "Create a new provider (requires authentication and organizer status)" operationId: "postProviders" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateProvider" required: true responses: "201": description: "Created - Provider created successfully" content: application/json: schema: type: "object" properties: id: type: "string" format: "uuid" description: "UUID of the created provider" required: - "id" "400": description: "Bad Request - Invalid input data" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User is not an organizer of any event" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs: post: summary: "Create new organization" operationId: "postOrgs" security: - bearerAuth: [] description: "" requestBody: content: application/json: schema: $ref: "#/components/schemas/Organisation" required: true responses: "201": description: "Created" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}: get: summary: "Get organization details" operationId: "getOrgs" security: - {} description: "" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Organisation" put: summary: "Update organization" operationId: "putOrgs" security: - bearerAuth: [] description: "" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/Organisation" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Organisation" /orgs/{orgSlug}/providers: post: summary: "Create provider" operationId: "postOrgsProviders" description: "Create a new provider within organization scope (requires organization membership)" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateProvider" required: true responses: "201": description: "Created - Provider created successfully" content: application/json: schema: $ref: "#/components/schemas/Provider" "400": description: "Bad Request - Invalid request body" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User not member of organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/providers/{providerId}: put: summary: "Update provider" operationId: "putOrgsProviders" description: "Update provider within organization scope (requires organization membership)" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "providerId" in: "path" required: true schema: type: "string" format: "uuid" description: "Provider UUID" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateProvider" required: true responses: "200": description: "OK - Provider updated successfully" content: application/json: schema: $ref: "#/components/schemas/Provider" "400": description: "Bad Request - Invalid request body" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User not member of organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Provider not found or not owned by organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" delete: summary: "Delete provider" operationId: "deleteOrgsProviders" description: "Delete provider after detaching from all events (requires organization membership)" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "providerId" in: "path" required: true schema: type: "string" format: "uuid" description: "Provider UUID" responses: "204": description: "No Content - Provider deleted successfully" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User not member of organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Provider not found or not owned by organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Provider still attached to events (must detach first)" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events: get: summary: "Get organization details" operationId: "getOrgsEvents" description: "List events for an organization (paginated)" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "page" in: "query" required: false schema: type: "integer" default: 1 minimum: 1 description: "Page number (default: 1)" - name: "page_size" in: "query" required: false schema: type: "integer" default: 20 minimum: 1 maximum: 100 description: "Number of items per page (default: 20)" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/PaginatedEventSummary" post: summary: "Create organization event" description: "Create a new event for an organization" operationId: "postOrgsEvents" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateEvent" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}: put: summary: "Update event" operationId: "putOrgsEvents" security: - bearerAuth: [] description: "" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateEvent" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/booth-plan: post: summary: "Upload booth plan" operationId: "postOrgsEventsBoothPlan" description: "Upload booth plan image for an event" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: multipart/form-data: schema: type: object properties: file: type: "string" format: binary description: "Booth plan image file (PNG, JPEG, GIF)" required: true responses: "400": description: "Bad Request - Invalid event slug or missing file" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "415": description: "Unsupported Media Type - Invalid file format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created - Booth plan image uploaded successfully" content: application/json: schema: type: object properties: url: type: string description: "URL of the uploaded booth plan image" required: - "url" /orgs/{orgSlug}/events/{eventSlug}/integrations: get: summary: "List event integrations" operationId: "getOrgsEventsIntegrations" description: "Retrieve all integrations configured for an event" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" security: - bearerAuth: [] responses: "200": description: "OK - List of integrations retrieved successfully" content: application/json: schema: type: "array" items: $ref: "#/components/schemas/Integration" "400": description: "Bad Request - Invalid parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/integrations/{provider}/{usage}: post: summary: "Create event integration" operationId: "postOrgsEventsIntegrations" description: "Register an integration for an event" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "provider" in: "path" required: true schema: type: "string" enum: ["mailjet", "slack", "qonto", "billetweb", "webhook", "openplanner"] description: "Integration provider type" - name: "usage" in: "path" required: true schema: type: "string" enum: ["notification", "billing", "ticketing", "webhook", "agenda"] description: "Integration usage purpose" security: - bearerAuth: [] requestBody: content: application/json: schema: type: "object" description: "Integration configuration data (varies by provider)" required: true responses: "201": description: "Created - Integration registered successfully" content: application/json: schema: $ref: "#/components/schemas/Identifier" "400": description: "Bad Request - Invalid provider, usage, or configuration" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Integration with same provider and usage already exists for this event" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/integrations/{integrationId}: delete: summary: "Delete event integration" operationId: "deleteOrgsEventsIntegrations" description: "Remove an integration from an event" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "integrationId" in: "path" required: true schema: type: "string" format: "uuid" description: "Integration unique identifier" security: - bearerAuth: [] responses: "204": description: "No Content - Integration deleted successfully" "400": description: "Bad Request - Invalid parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Integration or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/integrations/{integrationId}/status: get: summary: "get status of event integration" operationId: "getStatusIntegration" description: "Get status of event integration" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "integrationId" in: "path" required: true schema: type: "string" format: "uuid" description: "Integration unique identifier" security: - bearerAuth: [ ] responses: "200": description: "No Content - Integration deleted successfully" "401": description: "Unauthorized" content: application/json: schema: type: "object" properties: status: type: "boolean" /orgs/{orgSlug}/events/{eventSlug}/options: get: summary: "Get organization details" operationId: "getOrgsEventsOptions" description: "List sponsoring options for an event" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "Accept-Language" in: "header" required: false schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: type: "array" items: $ref: "#/components/schemas/SponsoringOption" post: summary: "Create sponsoring option" description: "Create a new sponsoring option" operationId: "postOrgsEventsOptions" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateSponsoringOption" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/options/{optionId}: delete: summary: "Delete sponsoring option" operationId: "deleteOrgsEventsOptions" security: - bearerAuth: [] description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "optionId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "204": description: "No Content" content: '*/*': schema: type: "object" put: summary: "Update sponsoring option" description: "" operationId: "putOrgsEventsOptions" security: - bearerAuth: [] parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "optionId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateSponsoringOption" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/packs: get: summary: "Get organization details" operationId: "getOrgsEventsPacks" description: "List sponsoring packs for an event" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "Accept-Language" in: "header" required: false schema: type: "string" default: "en" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: type: "array" items: $ref: "#/components/schemas/SponsoringPack" post: summary: "Create sponsoring pack" operationId: "postOrgsEventsPacks" description: "Create a new sponsoring pack" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateSponsoringPack" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/packs/{packId}: delete: summary: "Delete sponsoring pack" operationId: "deleteOrgsEventsPacks" security: - bearerAuth: [] description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "packId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "204": description: "No Content" content: '*/*': schema: type: "object" put: summary: "Update sponsoring pack" operationId: "putOrgsEventsPacks" security: - bearerAuth: [] description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "packId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateSponsoringPack" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/packs/{packId}/options: post: summary: "Synchronize sponsoring pack options" operationId: "postOrgsEventsPacksOptions" security: - bearerAuth: [] description: | Synchronizes the complete set of options for a sponsoring pack. This endpoint accepts a complete configuration of required and optional options and ensures the pack's final state exactly matches the submitted configuration by: - Removing options not included in the request - Adding new options from the request - Updating requirement status (required ↔ optional) for existing options The operation is atomic - all changes succeed or all fail. The operation is idempotent - submitting the same configuration multiple times produces the same result. Both required and optional lists can be empty to remove all options from the pack. parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "packId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/AttachOptionsToPack" required: true responses: "201": description: "Options synchronized successfully" "400": description: "Bad Request - Invalid request body" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Invalid or missing authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Options do not belong to event" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Pack or options not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Duplicate option in required and optional lists" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/packs/{packId}/options/{optionId}: delete: summary: "Delete sponsoring option" operationId: "deleteOrgsEventsPacksOptions" security: - bearerAuth: [] description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "packId" in: "path" required: true schema: type: "string" - name: "optionId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "204": description: "No Content" content: '*/*': schema: type: "object" /orgs/{orgSlug}/events/{eventSlug}/communication: get: summary: "Get organization details" operationId: "getOrgsEventsCommunication" description: "Get communication plan for all partnerships of an event, grouped by status" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" security: - bearerAuth: [] responses: "400": description: "Bad Request - Missing or invalid parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/CommunicationPlan" /orgs/{orgSlug}/events/{eventSlug}/external-link: post: summary: "Add external link" operationId: "postOrgsEventsExternalLink" description: "Attach a new external link to an event" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateEventExternalLink" required: true responses: "400": description: "Bad Request - Invalid input or validation error" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Authentication required" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created - External link created successfully" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" format: "uuid" description: "UUID of the created external link" /orgs/{orgSlug}/events/{eventSlug}/external-link/{linkId}: delete: summary: "Delete external link" operationId: "deleteOrgsEventsExternalLink" description: "Remove an external link by its ID" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "linkId" in: "path" required: true schema: type: "string" format: "uuid" description: "UUID of the external link to delete" security: - bearerAuth: [] responses: "400": description: "Bad Request - Invalid UUID format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Authentication required" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - External link, event or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "204": description: "No Content - External link deleted successfully" /orgs/{orgSlug}/events/{eventSlug}/agenda: post: summary: "Fetch and update agenda from agenda integration" operationId: "updateEventAgenda" description: "Trigger fetch and storage of event agenda data from agenda integration. Requires organization write permissions." security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" responses: "201": description: "Created - Agenda fetched and updated successfully" "401": description: "Unauthorized - Authentication required" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Insufficient permissions" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "500": description: "Internal Server Error - Failed to fetch agenda from OpenPlanner" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships: get: summary: "Get partnership list" operationId: "getOrgsEventsPartnership" description: "List partnerships for an event with filtering options" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "filter[pack_id]" in: "query" required: false schema: type: "string" description: "Filter by sponsoring pack ID" - name: "filter[validated]" in: "query" required: false schema: type: "boolean" description: "Filter by validation status" - name: "filter[suggestion]" in: "query" required: false schema: type: "boolean" description: "Filter by suggestion status" - name: "filter[paid]" in: "query" required: false schema: type: "boolean" description: "Filter by payment status" - name: "filter[agreement-generated]" in: "query" required: false schema: type: "boolean" description: "Filter by agreement generation status" - name: "filter[agreement-signed]" in: "query" required: false schema: type: "boolean" description: "Filter by agreement signature status" - name: "filter[organiser]" in: "query" required: false schema: type: "string" format: "email" description: "Filter by assigned organiser email address (case-insensitive)" - name: "filter[declined]" in: "query" required: false schema: type: "boolean" description: >- Filter by declined status. When absent or false (default), declined partnerships (those with a non-null declinedAt timestamp) are excluded from results. When true, declined partnerships are included alongside active ones. NOTE: This changes the default behaviour — previously declined partnerships were returned by default. Existing callers that need the old behaviour must pass filter[declined]=true. - name: "direction" in: "query" required: false schema: type: "string" default: "asc" enum: ["asc", "desc"] description: "Sort direction" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Returns paginated partnership list with metadata including available filters and organisers" content: application/json: schema: $ref: "#/components/schemas/PartnershipListResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}: delete: operationId: "deletePartnership" summary: "Delete an unvalidated partnership" description: | Deletes a partnership that has not been finalized (validated or declined). Only partnerships where both validatedAt and declinedAt are null can be deleted. Requires edit permission on the organization that owns the event. Performs a hard delete with no audit trail. tags: - "Partnerships" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true description: "Organization slug identifier" schema: type: "string" example: "devlille" - name: "eventSlug" in: "path" required: true description: "Event slug identifier" schema: type: "string" example: "devlille-2025" - name: "partnershipId" in: "path" required: true description: "Partnership UUID identifier" schema: type: "string" format: "uuid" example: "650e8400-e29b-41d4-a716-446655440000" responses: "204": description: "Partnership successfully deleted (no content returned)" "401": description: "Unauthorized - Missing or invalid authentication token, or user lacks edit permission" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership does not exist" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Partnership is finalized (validated or declined) and cannot be deleted" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/agreement: post: summary: "Generate partnership agreement" operationId: "postOrgsEventsPartnershipAgreement" description: "Generate a partnership agreement PDF" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Agreement generated successfully" content: application/json: schema: type: object properties: url: type: string description: "URL to the generated agreement PDF" required: - "url" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/billing/{billingStatus}: post: summary: "Update partnership billing status" operationId: "postOrgsEventsPartnershipBilling" security: - bearerAuth: [] description: "Update the billing status of a partnership." parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug identifier" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership unique identifier" - name: "billingStatus" in: "path" required: true schema: type: "string" enum: ["pending", "sent", "paid"] description: "New billing status for the partnership" - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug identifier" responses: "400": description: "Bad Request - Invalid billing status value, partnership ID format, or event slug." content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" example: "Request parameter billingStatus couldn't be parsed/converted to InvoiceStatus" "401": description: "Unauthorized - Authentication required or user not authorized for this organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership, event, or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Billing status updated successfully" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/booth-location: put: summary: "Update organization" operationId: "putOrgsEventsPartnershipBoothLocation" description: "Assign booth location to a partnership" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/BoothLocationRequest" required: true responses: "400": description: "Bad Request - Invalid parameters or empty location" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - Booth location already assigned to another partnership" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Booth location assigned successfully" content: application/json: schema: $ref: "#/components/schemas/BoothLocationResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/suggestion: post: summary: "Create partnership suggestion" operationId: "postOrgsEventsPartnershipSuggestion" security: - bearerAuth: [] description: "" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/SuggestPartnership" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/validate: post: summary: "Validate partnership" operationId: "postOrgsEventsPartnershipValidate" description: "Validate a partnership request" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/decline: post: summary: "Decline partnership" operationId: "postOrgsEventsPartnershipDecline" description: "Decline a partnership request" parameters: - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" - name: "orgSlug" in: "path" required: true schema: type: "string" security: - bearerAuth: [] responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/Identifier" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/communication/publication: put: summary: "Update organization" operationId: "putOrgsEventsPartnershipCommunicationPublication" description: "Schedule publication date for partnership communication" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PublicationDateRequest" required: true responses: "400": description: "Bad Request - Invalid date format or missing parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Publication date scheduled successfully" content: application/json: schema: $ref: "#/components/schemas/PublicationDateResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/communication/support: put: summary: "Update organization" operationId: "putOrgsEventsPartnershipCommunicationSupport" description: "Upload visual support material for partnership communication" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" - name: "eventSlug" in: "path" required: true schema: type: "string" - name: "partnershipId" in: "path" required: true schema: type: "string" security: - bearerAuth: [] requestBody: content: image/png: schema: type: string format: binary image/jpeg: schema: type: string format: binary image/gif: schema: type: string format: binary image/svg+xml: schema: type: string format: binary image/webp: schema: type: string format: binary required: true responses: "400": description: "Bad Request - Missing parameters or empty content" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "415": description: "Unsupported Media Type - Invalid image format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Visual support uploaded successfully" content: application/json: schema: $ref: "#/components/schemas/SupportUploadResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/job-offers: get: summary: "List job offers for partnership" operationId: "listPartnershipJobOffers" description: "Get paginated list of job offer promotions for a specific partnership. Public endpoint accessible without authentication." tags: - partnerships - job-offers security: - {} parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership UUID" - name: "status" in: "query" required: false schema: type: "string" enum: ["pending", "approved", "declined"] description: "Filter by promotion status" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (1-indexed)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page" responses: "200": description: "OK - Successfully retrieved job offer promotions" content: application/json: schema: type: "object" properties: items: type: "array" items: $ref: "#/components/schemas/JobOfferPromotionResponse" page: type: "integer" minimum: 1 pageSize: type: "integer" minimum: 1 totalItems: type: "integer" minimum: 0 totalPages: type: "integer" minimum: 0 "400": description: "Bad Request - Invalid query parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/job-offers: get: summary: "List all job offers for event" operationId: "listEventJobOfferPromotions" description: "Get paginated list of all job offer promotions for an event. Requires organization edit permissions." tags: - events - job-offers security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "status" in: "query" required: false schema: type: "string" enum: ["pending", "approved", "declined"] description: "Filter by promotion status" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (1-indexed)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page" responses: "200": description: "OK - Successfully retrieved job offer promotions" content: application/json: schema: type: "object" properties: items: type: "array" items: $ref: "#/components/schemas/JobOfferPromotionResponse" page: type: "integer" minimum: 1 pageSize: type: "integer" minimum: 1 totalItems: type: "integer" minimum: 0 totalPages: type: "integer" minimum: 0 "400": description: "Bad Request - Invalid query parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User does not have edit permissions" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/job-offers/{promotionId}/approve: post: summary: "Approve job offer promotion" operationId: "approveJobOfferPromotion" description: "Approve a pending job offer promotion. Requires organization edit permissions. Sends notification to company." tags: - partnerships - job-offers security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership UUID" - name: "promotionId" in: "path" required: true schema: type: "string" format: "uuid" description: "Promotion UUID" requestBody: content: application/json: schema: type: "object" properties: {} required: true responses: "200": description: "OK - Job offer promotion approved successfully" content: application/json: schema: $ref: "#/components/schemas/JobOfferPromotionResponse" "400": description: "Bad Request - Invalid promotion state or parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User does not have edit permissions" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Promotion, partnership, or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Promotion already processed" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/job-offers/{promotionId}/decline: post: summary: "Decline job offer promotion" operationId: "declineJobOfferPromotion" description: "Decline a pending job offer promotion with optional reason. Requires organization edit permissions. Sends notification to company." tags: - partnerships - job-offers security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership UUID" - name: "promotionId" in: "path" required: true schema: type: "string" format: "uuid" description: "Promotion UUID" requestBody: content: application/json: schema: $ref: "#/components/schemas/DeclineJobOfferRequest" required: true responses: "200": description: "OK - Job offer promotion declined successfully" content: application/json: schema: $ref: "#/components/schemas/JobOfferPromotionResponse" "400": description: "Bad Request - Invalid promotion state or parameters" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User does not have edit permissions" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Promotion, partnership, or event not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Promotion already processed" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/organiser: post: summary: "Assign organiser to partnership" operationId: "postPartnershipOrganiser" description: "Assign an organiser to manage a specific partnership. The organiser must be a member of the organization with edit permissions." parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership ID" requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/AssignOrganiserRequest" security: - bearerAuth: [] responses: "400": description: "Bad Request - Invalid request body or email format" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - No valid session" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User lacks edit permission or is not an organization member" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership or user not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Organiser successfully assigned" content: application/json: schema: $ref: "#/components/schemas/PartnershipOrganiserResponse" delete: summary: "Remove organiser from partnership" operationId: "deletePartnershipOrganiser" description: "Remove the assigned organiser from a partnership" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership ID" security: - bearerAuth: [] responses: "401": description: "Unauthorized - No valid session" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Organiser successfully removed" content: application/json: schema: $ref: "#/components/schemas/PartnershipOrganiserResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/pricing: put: summary: "Update partnership price overrides" operationId: "putPartnershipPricing" description: | Update price overrides for the sponsoring pack and/or individual options on a partnership. All fields are optional – omitting a key leaves the existing override unchanged. Setting a field to null clears the override (reverts to catalogue price). Requires organiser permission for the organization. parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership ID" requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdatePartnershipPricingRequest" security: - bearerAuth: [] responses: "200": description: "OK - Price overrides updated; returns the full updated partnership detail" content: application/json: schema: $ref: "#/components/schemas/PartnershipDetail" "400": description: "Bad Request - Invalid request body (e.g. negative price)" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - No valid session or insufficient org permission" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event, partnership, or option not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Pack price override requested but partnership has no validated sponsoring pack" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/email-history: get: summary: "Get email history for partnership" operationId: "getPartnershipEmailHistory" description: | Retrieve paginated email history for a specific partnership. Returns all emails sent to the partnership, ordered by most recent first. Each record includes full email details (subject, body, sender) and per-recipient delivery status. Requires organiser permission for the organization. tags: - "Partnerships" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership ID" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (1-based)" - name: "pageSize" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page" responses: "401": description: "Unauthorized - No valid session or insufficient permissions" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK - Email history retrieved successfully" content: application/json: schema: type: "object" properties: items: type: "array" items: $ref: "#/components/schemas/PartnershipEmailHistoryResponse" page: type: "integer" description: "Current page number" page_size: type: "integer" description: "Number of items per page" total: type: "integer" format: "int64" description: "Total number of email history records" required: - items - page - page_size - total /orgs/{orgSlug}/events/{eventSlug}/partnerships/{partnershipId}/trigger/webhook: post: summary: "Trigger webhook for partnership" operationId: "postPartnershipTriggerWebhook" description: "Manually trigger webhook for a specific partnership. Requires webhook integration to be configured." tags: - "Partnerships" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "partnershipId" in: "path" required: true schema: type: "string" format: "uuid" description: "Partnership ID" responses: "204": description: "No Content - Webhook triggered successfully" "401": description: "Unauthorized - No valid session or insufficient permissions" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Partnership not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/partnerships/email: post: summary: "Send email to filtered partnerships" operationId: "postPartnershipEmail" description: | Send an email to partnerships matching filter criteria. Each partnership receives an individual email (no grouping by organizer). The email subject is prefixed with the event name. Requires edit permission on the organization. Requires Mailjet integration to be configured for the event's organization. tags: - "Partnerships" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug identifier" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug identifier" - name: "filter[validated]" in: "query" required: false schema: type: "boolean" description: "Filter by validation status (true = validated, false = not validated)" - name: "filter[paid]" in: "query" required: false schema: type: "boolean" description: "Filter by payment status (true = paid, false = unpaid)" - name: "filter[pack_id]" in: "query" required: false schema: type: "string" format: "uuid" description: "Filter by sponsoring pack UUID" - name: "filter[suggestion]" in: "query" required: false schema: type: "boolean" description: "Filter by suggestion status (true = suggested by organizer)" - name: "filter[agreement-generated]" in: "query" required: false schema: type: "boolean" description: "Filter by agreement generation status" - name: "filter[agreement-signed]" in: "query" required: false schema: type: "boolean" description: "Filter by agreement signature status" - name: "filter[organiser]" in: "query" required: false schema: type: "string" format: "email" description: "Filter by assigned organiser email address for targeted bulk emails" - name: "filter[declined]" in: "query" required: false schema: type: "boolean" description: >- Filter by declined status for email recipients. When absent or false (default), declined partnerships are excluded from the email recipient list. When true, declined partnerships are included as recipients. requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/SendPartnershipEmailRequest" responses: "200": description: "OK - Emails sent successfully" content: application/json: schema: $ref: "#/components/schemas/SendPartnershipEmailResponse" "401": description: "Unauthorized - Missing or invalid authentication token, or user lacks edit permission" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - No partnerships match the filter criteria, or Mailjet integration not configured" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "503": description: "Service Unavailable - Mailjet API failure during email sending" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/events/{eventSlug}/providers: get: summary: "List event providers" operationId: "getOrgsEventsProviders" description: "List providers attached to an event with pagination (requires organization membership)" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" - name: "page" in: "query" required: false schema: type: "integer" minimum: 1 default: 1 description: "Page number (must be >= 1)" - name: "page_size" in: "query" required: false schema: type: "integer" minimum: 1 maximum: 100 default: 20 description: "Number of items per page (must be between 1 and 100)" responses: "200": description: "OK - Paginated list of event providers" content: application/json: schema: $ref: "#/components/schemas/PaginatedProvider" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - User not member of organization" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" post: summary: "Create new provider" operationId: "postOrgsEventsProviders" description: "Attach providers to an event (requires event write access)" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateByIdentifiers" required: true responses: "200": description: "OK - Providers attached successfully" content: application/json: schema: type: "array" items: type: "string" format: "uuid" description: "List of successfully attached provider UUIDs" "400": description: "Bad Request - Invalid provider IDs or empty list" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - No write access to the event" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" delete: summary: "Remove providers from event" operationId: "deleteOrgsEventsProviders" description: "Remove providers from an event (requires event write access)" security: - bearerAuth: [] parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" description: "Organization slug" - name: "eventSlug" in: "path" required: true schema: type: "string" description: "Event slug" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateByIdentifiers" required: true responses: "200": description: "OK - Providers detached successfully" content: application/json: schema: type: "array" items: type: "string" format: "uuid" description: "List of successfully detached provider UUIDs" "400": description: "Bad Request - Invalid provider IDs or empty list" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized - Missing or invalid authentication" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "403": description: "Forbidden - No write access to the event" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found - Event or organization not found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" /orgs/{orgSlug}/users: get: summary: "Get organization details" operationId: "getOrgsUsers" security: - bearerAuth: [] description: "" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: type: "array" items: $ref: "#/components/schemas/User" /orgs/{orgSlug}/users/grant: post: summary: "Create resource" operationId: "postOrgsUsersGrant" security: - bearerAuth: [] description: "" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/GrantPermissionRequest" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: '*/*': schema: type: "string" examples: Example#1: value: "Permissions granted" /orgs/{orgSlug}/users/revoke: post: summary: "Revoke user permissions" operationId: "postOrgsUsersRevoke" security: - bearerAuth: [] description: "Revoke edit permissions for multiple users on an organisation" parameters: - name: "orgSlug" in: "path" required: true schema: type: "string" requestBody: content: application/json: schema: $ref: "#/components/schemas/RevokePermissionRequest" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "401": description: "Unauthorized" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "404": description: "Not Found" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "409": description: "Conflict - Cannot revoke last editor's own access" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "200": description: "OK" content: application/json: schema: $ref: "#/components/schemas/RevokeUsersResult" /users/me/events: get: summary: "List organization events" operationId: "getUsersMeEvents" security: - bearerAuth: [] description: "" responses: "200": description: "OK" content: '*/*': schema: type: "array" items: $ref: "#/components/schemas/EventSummary" /users/me/orgs: get: summary: "Get resource" operationId: "getUsersMeOrgs" security: - bearerAuth: [] description: "" responses: "200": description: "OK" content: '*/*': schema: type: "array" items: $ref: "#/components/schemas/OrganisationItem" components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: "Authentication token obtained through OAuth flow" schemas: UserSession: $ref: "../schemas/user_session.schema.json" UserInfo: $ref: "../schemas/user_info.schema.json" Address: $ref: "../schemas/address.schema.json" Media: $ref: "../schemas/media.schema.json" Company: $ref: "../schemas/company.schema.json" Social: $ref: "../schemas/social.schema.json" CreateCompany: $ref: "../schemas/create_company.schema.json" UpdateCompany: $ref: "../schemas/update_company.schema.json" Identifier: $ref: "../schemas/identifier.schema.json" Contact: $ref: "../schemas/contact.schema.json" PartnershipItem: $ref: "../schemas/partnership_item.schema.json" EventSummary: $ref: "../schemas/event_summary.schema.json" CreateEvent: $ref: "../schemas/create_event.schema.json" Event: $ref: "../schemas/event.schema.json" EventDisplay: $ref: "../schemas/event_display.schema.json" CreateEventExternalLink: $ref: "../schemas/create_event_external_link.schema.json" Organisation: $ref: "../schemas/organisation.schema.json" EventWithOrganisation: $ref: "../schemas/event_with_organisation.schema.json" RegisterPartnership: $ref: "../schemas/register_partnership.schema.json" UpdatePartnershipContactInfo: $ref: "../schemas/update_partnership_request.schema.json" CompanyBillingData: $ref: "../schemas/company_billing_data.schema.json" TicketData: $ref: "../schemas/ticket_data.schema.json" Ticket: $ref: "../schemas/ticket.schema.json" TicketOrder: $ref: "../schemas/ticket_order.schema.json" SponsoringOption: $ref: "../schemas/sponsoring_option.schema.json" TranslatedLabel: $ref: "../schemas/translated_label.schema.json" CreateSponsoringOption: $ref: "../schemas/create_sponsoring_option.schema.json" SponsoringPack: $ref: "../schemas/sponsoring_pack.schema.json" CreateSponsoringPack: $ref: "../schemas/create_sponsoring_pack.schema.json" AttachOptionsToPack: $ref: "../schemas/attach_options_to_pack.schema.json" SuggestPartnership: $ref: "../schemas/suggest_partnership.schema.json" User: $ref: "../schemas/user.schema.json" GrantPermissionRequest: $ref: "../schemas/grant_permission_request.schema.json" RevokePermissionRequest: $ref: "../schemas/revoke_permission_request.schema.json" RevokeUsersResult: $ref: "../schemas/revoke_users_result.schema.json" OrganisationItem: $ref: "../schemas/organisation_item.schema.json" Provider: $ref: "../schemas/provider.schema.json" CreateProvider: $ref: "../schemas/create_provider.schema.json" UpdateProvider: $ref: "../schemas/update_provider.schema.json" ErrorResponse: $ref: "../schemas/error_response.schema.json" BoothLocationRequest: $ref: "../schemas/booth_location_request.schema.json" BoothLocationResponse: $ref: "../schemas/booth_location_response.schema.json" PublicationDateRequest: $ref: "../schemas/publication_date_request.schema.json" PublicationDateResponse: $ref: "../schemas/publication_date_response.schema.json" SupportUploadResponse: $ref: "../schemas/support_upload_response.schema.json" CommunicationItem: $ref: "../schemas/communication_item.schema.json" CommunicationPlan: $ref: "../schemas/communication_plan.schema.json" PaginatedEventSummary: $ref: "../schemas/paginated_event_summary.schema.json" PaginatedCompany: $ref: "../schemas/paginated_company.schema.json" PaginatedProvider: $ref: "../schemas/paginated_provider.schema.json" PaginatedJobOffer: $ref: "../schemas/paginated_job_offer.schema.json" PaginatedJobOfferPromotion: $ref: "../schemas/paginated_job_offer_promotion.schema.json" CreateJobOffer: $ref: "../schemas/create_job_offer.schema.json" UpdateJobOffer: $ref: "../schemas/update_job_offer.schema.json" JobOfferResponse: $ref: "../schemas/job_offer_response.schema.json" CreateByIdentifiers: $ref: "../schemas/create_by_identifiers.schema.json" PromoteJobOfferRequest: $ref: "../schemas/promote_job_offer.schema.json" JobOfferPromotionResponse: $ref: "../schemas/job_offer_promotion_response.schema.json" DeclineJobOfferRequest: $ref: "../schemas/decline_job_offer_promotion.schema.json" DetailedPartnershipResponse: $ref: "../schemas/detailed_partnership_response.schema.json" PartnershipDetail: $ref: "../schemas/partnership_detail.schema.json" AssignOrganiserRequest: $ref: "../schemas/assign_organiser_request.schema.json" PartnershipOrganiserResponse: $ref: "../schemas/partnership_organiser_response.schema.json" PartnershipEmailHistoryResponse: $ref: "../schemas/partnership_email_history_response.schema.json" RecipientStatusResponse: $ref: "../schemas/recipient_status_response.schema.json" PartnershipProcessStatus: $ref: "../schemas/partnership_process_status.schema.json" PartnershipPhases: $ref: "../schemas/partnership_phases.schema.json" Session: $ref: "../schemas/session.schema.json" Speaker: $ref: "../schemas/speaker.schema.json" AgendaResponse: $ref: "../schemas/agenda_response.schema.json" SpeakerPartnership: $ref: "../schemas/speaker_partnership.schema.json" Integration: $ref: "../schemas/integration.schema.json" SendPartnershipEmailRequest: $ref: "../schemas/send_partnership_email_request.schema.json" SendPartnershipEmailResponse: $ref: "../schemas/send_partnership_email_response.schema.json" PaginationMetadata: $ref: "../schemas/pagination_metadata.schema.json" FilterDefinition: $ref: "../schemas/filter_definition.schema.json" FilterValue: $ref: "../schemas/filter_value.schema.json" PartnershipListResponse: $ref: "../schemas/partnership_list_response.schema.json" UpdatePartnershipPricingRequest: $ref: "../schemas/update_partnership_pricing_request.schema.json"