openapi: 3.2.0 info: contact: email: support@aiapplyd.com name: AI Applyd url: https://aiapplyd.com description: 'The AI Applyd API runs the whole job hunt for you: it matches you to roles that fit your profile, rewrites your resume for each posting, writes the cover letter the form asks for, and auto-applies across the major applicant tracking systems.' license: name: Proprietary url: https://aiapplyd.com/legal/terms title: AI Applyd Notifications API version: 115c47ce servers: - description: Current environment url: https://api.aiapplyd.com/api/v1 security: - BearerAuth: [] tags: - name: Notifications paths: /notifications/push-token: post: tags: - Notifications summary: Register Push Token description: 'Register (or move) an Expo push token to the authenticated user''s account. Idempotent: re-registering the same token MOVES it rather than creating a duplicate.' requestBody: content: application/json: schema: $ref: '#/components/schemas/RegisterPushTokenRequest' responses: '200': description: Push token registered content: application/json: schema: $ref: '#/components/schemas/PushTokenResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postNotificationsPushToken /notifications/push-token/unregister: post: tags: - Notifications summary: Unregister Push Token description: Drop an Expo push token from the authenticated user's account. Called on sign-out - a token left registered means the next person holding the phone receives the previous user's notifications. requestBody: content: application/json: schema: $ref: '#/components/schemas/DeletePushTokenRequest' responses: '200': description: Push token unregistered content: application/json: schema: $ref: '#/components/schemas/PushTokenResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: postNotificationsPushTokenUnregister /notifications: get: tags: - Notifications summary: List Notification Feed description: List up to 30 active durable notifications for the authenticated user, newest first. Pass the last visible row id as cursor to fetch older rows; unreadCount always covers all active rows, including rows outside the current page. Payloads are strict machine facts; clients own localized presentation and navigation. parameters: - schema: type: string pattern: ^[1-9]\d{0,15}$ description: Owned notification row id at the end of the previous page example: '42' required: false description: Owned notification row id at the end of the previous page name: cursor in: query responses: '200': description: Active notification feed retrieved content: application/json: schema: $ref: '#/components/schemas/NotificationFeedResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: getNotifications /notifications/read: patch: tags: - Notifications summary: Mark Notifications Read description: Mark up to 50 active notification rows read. Only rows owned by the authenticated user are touched. requestBody: content: application/json: schema: $ref: '#/components/schemas/NotificationIdsRequest' responses: '200': description: Notification read state updated content: application/json: schema: $ref: '#/components/schemas/NotificationMutationResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: patchNotificationsRead /notifications/dismiss: patch: tags: - Notifications summary: Dismiss Notifications description: Dismiss up to 50 active notification rows. Only rows owned by the authenticated user are touched. requestBody: content: application/json: schema: $ref: '#/components/schemas/NotificationIdsRequest' responses: '200': description: Notifications dismissed content: application/json: schema: $ref: '#/components/schemas/NotificationMutationResponse' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ApiErrorResponse' operationId: patchNotificationsDismiss components: schemas: ApplicationSubmittedNotificationContent: type: object properties: kind: type: string enum: - application_submitted payload: $ref: '#/components/schemas/ApplicationSubmittedNotificationPayload' required: - kind - payload additionalProperties: false NotificationMutationData: type: object properties: updated: type: integer minimum: 0 required: - updated additionalProperties: false NotificationIdsRequest: type: object properties: ids: type: array items: type: integer exclusiveMinimum: 0 minItems: 1 maxItems: 50 description: Owned notification row ids to update. Foreign IDs are ignored. example: - 41 - 42 required: - ids additionalProperties: false EmployerReceiptConfirmedNotificationContent: type: object properties: kind: type: string enum: - employer_receipt_confirmed payload: $ref: '#/components/schemas/EmployerReceiptConfirmedNotificationPayload' required: - kind - payload additionalProperties: false DocumentTranslationReadyNotificationContent: type: object properties: kind: type: string enum: - document_translation_ready payload: $ref: '#/components/schemas/DocumentTranslationReadyNotificationPayload' required: - kind - payload additionalProperties: false DocumentAtsScoredNotificationPayload: type: object properties: documentId: type: integer description: Owned user_document row id example: 42 exclusiveMinimum: 0 overallScore: type: number minimum: 0 maximum: 100 description: Persisted ATS score from 0 to 100 example: 84 required: - documentId - overallScore additionalProperties: false NotificationFeedData: type: object properties: items: type: array items: $ref: '#/components/schemas/NotificationFeedItem' maxItems: 30 nextCursor: type: - integer - 'null' exclusiveMinimum: 0 unreadCount: type: integer minimum: 0 required: - items - unreadCount additionalProperties: false NotificationMutationResponse: type: object properties: data: $ref: '#/components/schemas/NotificationMutationData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response NotificationFeedItem: oneOf: - allOf: - $ref: '#/components/schemas/ApplicationReadyToSendNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/ApplicationSubmittedNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/EmployerReceiptConfirmedNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/ApplicationFailedNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/MatchesReadyNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/AchievementUnlockedNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/DocumentUploadedNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/DocumentAtsScoredNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false - allOf: - $ref: '#/components/schemas/DocumentTranslationReadyNotificationContent' - type: object properties: createdAt: type: string description: Database timestamp when this machine fact was first recorded id: type: integer description: Durable notification row id example: 42 exclusiveMinimum: 0 readAt: type: - string - 'null' description: Timestamp when the user read this row, or null while unread required: - createdAt - id - readAt additionalProperties: false ApplicationReadyToSendNotificationPayload: type: object properties: applicationResultId: type: integer description: Owned application_result row id example: 1540 exclusiveMinimum: 0 company: type: string minLength: 1 maxLength: 200 description: Employer name as it was at the moment of the event example: Trading 212 jobTitle: type: string minLength: 1 maxLength: 200 description: Job title as it was at the moment of the event example: Staff Frontend Engineer required: - applicationResultId - company - jobTitle additionalProperties: false DocumentTranslationReadyNotificationPayload: type: object properties: documentId: type: integer description: Owned user_document row id example: 42 exclusiveMinimum: 0 targetLanguage: type: string minLength: 1 maxLength: 50 description: Stable translation target value used by the document request example: German required: - documentId - targetLanguage additionalProperties: false EmployerReceiptConfirmedNotificationPayload: type: object properties: applicationResultId: type: integer description: Owned application_result row id example: 1540 exclusiveMinimum: 0 company: type: string minLength: 1 maxLength: 200 description: Employer name as it was at the moment of the event example: Trading 212 jobTitle: type: string minLength: 1 maxLength: 200 description: Job title as it was at the moment of the event example: Staff Frontend Engineer required: - applicationResultId - company - jobTitle additionalProperties: false MatchesReadyNotificationPayload: type: object properties: count: type: integer description: How many newly scored matches arrived in this batch example: 24 exclusiveMinimum: 0 required: - count additionalProperties: false RegisterPushTokenRequest: type: object properties: platform: type: string enum: - ios - android - web - unknown description: Operating system of the device holding the push token example: ios token: type: string minLength: 1 maxLength: 200 pattern: ^Expo(?:nent)?PushToken\[[^\][\s]+\]$ description: Expo push token issued by getExpoPushTokenAsync() example: ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx] required: - token additionalProperties: false MatchesReadyNotificationContent: type: object properties: kind: type: string enum: - matches_ready payload: $ref: '#/components/schemas/MatchesReadyNotificationPayload' required: - kind - payload additionalProperties: false DeletePushTokenRequest: type: object properties: token: type: string minLength: 1 maxLength: 200 pattern: ^Expo(?:nent)?PushToken\[[^\][\s]+\]$ description: Expo push token issued by getExpoPushTokenAsync() example: ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx] required: - token additionalProperties: false AchievementUnlockedNotificationPayload: type: object properties: achievementKey: type: string enum: - account_created - resume_uploaded - first_save - first_application - ten_applications - first_reply - first_interview - first_offer description: Stable identifier for an unlockable achievement example: first_application required: - achievementKey additionalProperties: false ApplicationReadyToSendNotificationContent: type: object properties: kind: type: string enum: - application_ready_to_send payload: $ref: '#/components/schemas/ApplicationReadyToSendNotificationPayload' required: - kind - payload additionalProperties: false NotificationFeedResponse: type: object properties: data: $ref: '#/components/schemas/NotificationFeedData' meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response ApiErrorResponse: type: object properties: error: type: object properties: code: type: string context: oneOf: - type: object properties: errorType: type: string enum: - validation field: type: string fieldErrors: type: array items: type: object properties: code: type: string expected: type: string field: type: string message: type: string received: type: string required: - field - message schemaName: type: string required: - errorType - type: object properties: attemptedEmail: type: string format: email errorType: type: string enum: - authentication failureReason: type: string enum: - invalid_credentials - account_locked - expired_token - token_expired - missing_token - invalid_token - session_expired description: Reason for authentication failure example: token_expired ipAddress: type: string operation: type: string service: type: string userAgent: type: string required: - errorType - type: object properties: actualPermission: type: string errorType: type: string enum: - authorization requiredPermission: type: string resource: type: string resourceId: type: string userId: type: string required: - errorType - type: object properties: constraint: type: string errorType: type: string enum: - database operation: type: string enum: - insert - update - delete - select - batch - transaction - migration description: Type of database operation example: select resourceId: type: string sqlState: type: string table: type: string userId: type: string required: - errorType - type: object properties: endpoint: type: string errorType: type: string enum: - external_service httpStatus: type: number operation: type: string resourceId: type: string responseTime: type: number retryAttempt: type: integer service: type: string serviceName: type: string userId: type: string required: - errorType - type: object properties: errorType: type: string enum: - resource resource: type: string resourceId: type: string service: type: string userId: type: string required: - errorType - type: object properties: errorType: type: string enum: - rate_limit limit: type: number resetTime: type: string windowMs: type: number required: - errorType - type: object properties: configKey: type: string errorType: type: string enum: - configuration operation: type: string service: type: string required: - errorType description: Type-safe error context information example: errorType: validation fieldErrors: - field: email message: Invalid email format details: oneOf: - type: object properties: detailType: type: string enum: - validation validationErrors: type: array items: type: object properties: code: type: string field: type: string message: type: string required: - field - message required: - detailType - validationErrors additionalProperties: false - type: object properties: detailType: type: string enum: - service_error originalError: type: string serviceName: type: string required: - detailType - serviceName additionalProperties: false - type: object properties: currentSize: type: number detailType: type: string enum: - batch originalError: type: string statementCount: type: number required: - detailType additionalProperties: false - type: object properties: detailType: type: string enum: - rate_limit limit: type: number resetTime: type: string windowMs: type: number required: - detailType - limit - resetTime - windowMs additionalProperties: false - type: object properties: conflictingField: type: string detailType: type: string enum: - resource resourceId: anyOf: - type: string - type: number resourceType: type: string required: - detailType additionalProperties: false - type: object properties: detailType: type: string enum: - generic info: type: string required: - detailType additionalProperties: false - type: object properties: currentTokens: type: integer minimum: 0 detailType: type: string enum: - insufficient_tokens requiredTokens: type: integer minimum: 0 required: - currentTokens - detailType - requiredTokens additionalProperties: false message: type: string validation: type: array items: type: object properties: code: type: string field: type: string message: type: string required: - field - message additionalProperties: false required: - code - message additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - false required: - error - success additionalProperties: false ApplicationFailedNotificationContent: type: object properties: kind: type: string enum: - application_failed payload: $ref: '#/components/schemas/ApplicationFailedNotificationPayload' required: - kind - payload additionalProperties: false DocumentUploadedNotificationContent: type: object properties: kind: type: string enum: - document_uploaded payload: $ref: '#/components/schemas/DocumentUploadedNotificationPayload' required: - kind - payload additionalProperties: false ResponseMetadata: type: object properties: duration: type: number description: Request duration in milliseconds example: 150 exclusiveMinimum: 0 performance: type: object properties: dbQueries: type: integer minimum: 0 totalDbTime: type: number minimum: 0 description: Performance metrics (preview/local only) requestId: type: string description: Unique request identifier example: req_abc123 timestamp: type: string format: date-time description: ISO 8601 timestamp example: '2026-09-25T17:29:47.224Z' version: type: string description: API version example: v1 AchievementUnlockedNotificationContent: type: object properties: kind: type: string enum: - achievement_unlocked payload: $ref: '#/components/schemas/AchievementUnlockedNotificationPayload' required: - kind - payload additionalProperties: false ApplicationSubmittedNotificationPayload: type: object properties: applicationResultId: type: integer description: Owned application_result row id example: 1540 exclusiveMinimum: 0 company: type: string minLength: 1 maxLength: 200 description: Employer name as it was at the moment of the event example: Trading 212 jobTitle: type: string minLength: 1 maxLength: 200 description: Job title as it was at the moment of the event example: Staff Frontend Engineer required: - applicationResultId - company - jobTitle additionalProperties: false ApplicationFailedNotificationPayload: type: object properties: applicationResultId: type: integer description: Owned application_result row id example: 1540 exclusiveMinimum: 0 company: type: string minLength: 1 maxLength: 200 description: Employer name as it was at the moment of the event example: Trading 212 jobTitle: type: string minLength: 1 maxLength: 200 description: Job title as it was at the moment of the event example: Staff Frontend Engineer required: - applicationResultId - company - jobTitle additionalProperties: false DocumentAtsScoredNotificationContent: type: object properties: kind: type: string enum: - document_ats_scored payload: $ref: '#/components/schemas/DocumentAtsScoredNotificationPayload' required: - kind - payload additionalProperties: false PushTokenResponse: type: object properties: data: type: object properties: success: type: boolean enum: - true required: - success additionalProperties: false meta: $ref: '#/components/schemas/ResponseMetadata' success: type: boolean enum: - true required: - data - success additionalProperties: false description: Successful API response DocumentUploadedNotificationPayload: type: object properties: documentId: type: integer description: Owned user_document row id example: 42 exclusiveMinimum: 0 documentType: type: string enum: - cover_letter - resume - custom - tailored_resume - translation - match_report description: Type of document (cover letter, resume, custom, tailored resume, translation, or match report) example: cover_letter required: - documentId - documentType additionalProperties: false securitySchemes: BearerAuth: description: 'Session token from signing in to AI Applyd, sent as `Authorization: Bearer `.' scheme: bearer type: http