{"openapi":"3.0.3","info":{"title":"airsource API","version":"1.0.0","description":"REST API to sync sales data between any source and destination. Build custom integrations with OAuth, webhooks, and real-time sync.","contact":{"name":"airsource Support","email":"support@airsource.io","url":"https://airsource.io/contact"}},"servers":[{"url":"https://airsource.io","description":"Production"}],"security":[{"bearerAuth":[]}],"paths":{"/api/integrations":{"post":{"summary":"Create integration (customer onboarding)","operationId":"createIntegration","tags":["Integration"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingInput"}}}},"responses":{"201":{"description":"Integration created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationCreatedResponse"}}}},"400":{"description":"Invalid input"},"500":{"description":"Server error"}}}},"/api/integrations/{id}/retry":{"post":{"summary":"Retry / manually re-run sync","operationId":"retrySync","tags":["Integration"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Integration ID"}],"responses":{"200":{"description":"Sync queued"},"404":{"description":"Integration not found"}}}},"/api/schema/infer":{"post":{"summary":"Infer AI field mapping","operationId":"inferSchema","tags":["Schema"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InferRequest"}}}},"responses":{"200":{"description":"Inferred mapping","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldMapping"}}}}}}},"/api/schema/infer/apply":{"post":{"summary":"Persist inferred mapping","operationId":"applySchema","tags":["Schema"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyMappingRequest"}}}},"responses":{"200":{"description":"Mapping saved"},"400":{"description":"Invalid mapping"}}}},"/api/auth/{provider}/start":{"get":{"summary":"Start OAuth flow","operationId":"authStart","tags":["Auth"],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["stripe","airtable","shopify","ebay","google"]}}],"responses":{"302":{"description":"Redirect to OAuth provider"}}}},"/api/auth/{provider}/callback":{"get":{"summary":"OAuth callback handler","operationId":"authCallback","tags":["Auth"],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"}},{"name":"code","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to dashboard on success"},"400":{"description":"OAuth error"}}}},"/api/dashboard/integrations":{"get":{"summary":"List integrations","operationId":"listIntegrations","tags":["Dashboard"],"responses":{"200":{"description":"Integration list","content":{"application/json":{"schema":{"type":"object","properties":{"integrations":{"type":"array","items":{"$ref":"#/components/schemas/Integration"}}}}}}}}}},"/api/dashboard/sync-logs/{integration_id}":{"get":{"summary":"Get sync history for an integration","operationId":"getSyncLogs","tags":["Dashboard"],"parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sync log entries","content":{"application/json":{"schema":{"type":"object","properties":{"logs":{"type":"array","items":{"$ref":"#/components/schemas/SyncLog"}}}}}}}}}},"/api/dashboard/mappings/{integration_id}":{"get":{"summary":"Get field mappings","operationId":"getMappings","tags":["Dashboard"],"parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Mapping config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldMapping"}}}}}},"patch":{"summary":"Update field mappings","operationId":"updateMappings","tags":["Dashboard"],"parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldMapping"}}}},"responses":{"200":{"description":"Mapping updated"},"400":{"description":"Invalid mapping"}}}},"/api/stripe/webhook":{"post":{"summary":"Receive Stripe webhook events","operationId":"stripeWebhook","tags":["Webhook"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Stripe event payload"}}}},"responses":{"200":{"description":"Webhook received"},"400":{"description":"Invalid signature"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Magic Link session token"},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key (future use)"}},"schemas":{"Integration":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string","example":"stripe"},"destination":{"type":"string","example":"airtable"},"status":{"type":"string","enum":["active","paused","error"]},"created_at":{"type":"string","format":"date-time"}},"required":["id","source","destination","status"]},"OnboardingInput":{"type":"object","properties":{"email":{"type":"string","format":"email"},"source":{"type":"string","example":"stripe"},"destination":{"type":"string","example":"airtable"},"source_credentials":{"type":"object","additionalProperties":true},"destination_credentials":{"type":"object","additionalProperties":true}},"required":["email","source","destination"]},"IntegrationCreatedResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"integration_id":{"type":"string"},"message":{"type":"string"}}},"FieldMapping":{"type":"object","properties":{"integration_id":{"type":"string"},"mappings":{"type":"array","items":{"type":"object","properties":{"source_field":{"type":"string"},"destination_field":{"type":"string"},"transform":{"type":"string","nullable":true}}}}}},"InferRequest":{"type":"object","properties":{"integration_id":{"type":"string"},"sample_records":{"type":"array","items":{"type":"object"}}},"required":["integration_id"]},"ApplyMappingRequest":{"type":"object","properties":{"integration_id":{"type":"string"},"mappings":{"$ref":"#/components/schemas/FieldMapping/properties/mappings"}},"required":["integration_id","mappings"]},"Subscription":{"type":"object","properties":{"id":{"type":"string"},"customer_email":{"type":"string"},"plan":{"type":"string","enum":["starter","pro","enterprise"]},"status":{"type":"string"}}},"SyncLog":{"type":"object","properties":{"id":{"type":"string"},"integration_id":{"type":"string"},"status":{"type":"string","enum":["success","error","partial"]},"records_synced":{"type":"integer"},"error_message":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time"}}}}}}