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: "" 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" 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 partnerships" operationId: "getCompaniesPartnership" description: "" security: - {} parameters: - name: "companyId" 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/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" "403": description: "Forbidden - Not authorized for this company" 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" "401": description: "Unauthorized" "403": description: "Forbidden - Not authorized for this company" 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" "404": description: "Job offer not found or not owned by company" "401": description: "Unauthorized" "403": description: "Forbidden - Not authorized for this company" 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" "401": description: "Unauthorized" "403": description: "Forbidden - Not authorized for this company" /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" tags: - "companies" - "job-offers" - "promotions" 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" "403": description: "Forbidden - Event has ended" "404": description: "Not Found - Company, partnership, or job offer not found" "409": description: "Conflict - Job offer already promoted with status pending/approved" /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" tags: - "companies" - "job-offers" - "promotions" 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" /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" /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" /orgs/{orgSlug}/events/{eventSlug}/integrations/{provider}/{usage}/{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: "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" - 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}/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: "Create sponsoring option" operationId: "postOrgsEventsPacksOptions" 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/AttachOptionsToPack" required: true responses: "400": description: "Bad Request" content: application/json: schema: $ref: "#/components/schemas/ErrorResponse" "201": description: "Created" content: '*/*': schema: type: "object" /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: "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" content: application/json: schema: type: "array" items: $ref: "#/components/schemas/PartnershipItem" /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}/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" 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" 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"