cross-team-interfaces
Comprehensive guide to defining and managing cross-team interfaces including APIs, events, data schemas, and process contracts for independent team operation
Installation
Suivez les instructions du dépôt pour votre agent. Consultez les fichiers et dépendances avant l’installation.
Voir la source ↗GuidesInstructions
Cross-Team Interfaces
What are Cross-Team Interfaces?
Definition: Contracts between teams that define how they interact and integrate.
Types of Interfaces
- Technical: REST APIs, GraphQL, gRPC, message queues, events
- Data: Database schemas, file formats, message formats
- Process: Handoffs, approval workflows, escalation procedures
Example
Team A (Backend) provides: User API
Team B (Mobile) consumes: User API
Interface: REST API contract
- Endpoint: GET /api/users/:id
- Response format: JSON
- Authentication: JWT token
- SLA: 99.9% uptime, <200ms latency
Why Interfaces Matter
1. Enable Independent Work
Without Clear Interface:
Mobile team: "How do I get user data?"
Backend team: "Let me check... I'll get back to you"
→ Mobile team blocked, waiting for answer
With Clear Interface:
Mobile team: Reads API documentation
→ Knows exactly how to call API
→ Can start development immediately
2. Reduce Miscommunication
Without Interface:
Mobile team expects: { "name": "John" }
Backend team returns: { "full_name": "John Doe" }
→ Integration fails, rework needed
With Interface:
API contract specifies: { "name": "John Doe" }
→ Both teams aligned, no surprises
3. Allow Parallel Development
Without Interface:
Backend team must finish API first
→ Mobile team waits
→ Sequential work (slow)
With Interface:
Teams agree on API contract
→ Backend builds real API
→ Mobile builds against mock API
→ Parallel work (fast)
4. Clear Ownership
Without Interface:
Bug in integration: "Is this a backend or mobile issue?"
→ Finger-pointing, slow resolution
With Interface:
API contract defines responsibilities
→ Backend owns API behavior
→ Mobile owns API usage
→ Clear ownership, fast resolution
Types of Interfaces
1. Technical Interfaces
REST APIs
GET /api/users/:id
POST /api/users
PUT /api/users/:id
DELETE /api/users/:id
GraphQL
query {
user(id: "123") {
id
name
email
}
}
gRPC
service UserService {
rpc GetUser (GetUserRequest) returns (User);
rpc CreateUser (CreateUserRequest) returns (User);
}
Events (Message Queue)
{
"event": "user.created",
"data": {
"id": "123",
"name": "John Doe",
"email": "john@example.com"
},
"timestamp": "2024-01-15T10:00:00Z"
}
2. Data Interfaces
Database Schema
CREATE TABLE users (
id UUID PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
File Format (CSV)
id,name,email,created_at
123,John Doe,john@example.com,2024-01-15T10:00:00Z
Message Format (JSON)
{
"version": "1.0",
"type": "user_event",
"payload": {
"user_id": "123",
"action": "login"
}
}
3. Process Interfaces
Handoff Workflow
Design Team → Engineering Team
Handoff criteria:
• Design approved by stakeholders
• All assets exported (Figma)
• Design specs documented
• Handoff meeting scheduled
Engineering accepts when:
• All criteria met
• Questions answered
• Ready to start development
Approval Workflow
Engineer → Tech Lead → Security Team → Deploy
Approval gates:
• Tech Lead: Code review approved
• Security Team: Security scan passed
• Deploy: All approvals received
Escalation Procedure
Level 1: Team lead (respond within 1 hour)
Level 2: Engineering manager (respond within 4 hours)
Level 3: VP Engineering (respond within 24 hours)
Defining Good Interfaces
1. Clear Contract (Input, Output, Behavior)
Good API Contract:
# POST /api/users
description: Create a new user
request:
content-type: application/json
body:
email: string (required, valid email)
name: string (required, 1-255 chars)
age: integer (optional, 0-150)
response:
200 OK:
content-type: application/json
body:
id: string (UUID)
email: string
name: string
age: integer | null
created_at: string (ISO 8601 timestamp)
400 Bad Request:
body:
error: string (error message)
field: string (field that failed validation)
409 Conflict:
body:
error: "Email already exists"
behavior:
- Email must be unique
- Name is trimmed of whitespace
- Age defaults to null if not provided
- created_at is set to current timestamp
2. Versioned (Avoid Breaking Changes)
Versioning Strategy:
/api/v1/users (current version)
/api/v2/users (new version)
Both versions supported for 6 months
v1 deprecated after 6 months
v1 removed after 12 months
3. Documented (API Docs, Runbooks)
Documentation Includes:
- Overview (what does this API do?)
- Authentication (how to authenticate?)
- Endpoints (all available endpoints)
- Request/response examples
- Error codes and meanings
- Rate limits
- Changelog (version history)
- Contact info (who owns this?)
4. Stable (Don't Change Frequently)
Stability Guidelines:
- Don't change existing endpoints
- Add new endpoints for new functionality
- Deprecate old endpoints (don't remove immediately)
- Communicate changes 2+ weeks in advance
5. Testable (Integration Tests)
Contract Tests:
// Consumer test (Mobile team)
test('GET /api/users/:id returns user', async () => {
const response = await api.get('/api/users/123');
expect(response.status).toBe(200);
expect(response.body).toMatchObject({
id: '123',
name: expect.any(String),
email: expect.any(String),
created_at: expect.any(String)
});
});
// Provider test (Backend team)
test('GET /api/users/:id returns 404 for non-existent user', async () => {
const response = await api.get('/api/users/nonexistent');
expect(response.status).toBe(404);
expect(response.body.error).toBe('User not found');
});
API Design for Cross-Team
RESTful Conventions
Resource-Based URLs:
GET /api/users (list users)
POST /api/users (create user)
GET /api/users/:id (get user)
PUT /api/users/:id (update user)
DELETE /api/users/:id (delete user)
HTTP Methods:
- GET: Retrieve resource (idempotent, safe)
- POST: Create resource (not idempotent)
- PUT: Update resource (idempotent)
- PATCH: Partial update (idempotent)
- DELETE: Delete resource (idempotent)
Consistent Naming
Conventions:
- Use nouns for resources (not verbs)
- Use plural nouns (
/users, not/user) - Use kebab-case for multi-word resources (
/user-profiles) - Use camelCase for JSON fields (
firstName, notfirst_name)
Good:
GET /api/users
GET /api/user-profiles
{ "firstName": "John", "lastName": "Doe" }
Bad:
GET /api/getUsers (verb in URL)
GET /api/user (singular)
{ "first_name": "John" } (snake_case)
Error Handling Standards
Error Response Format:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid email address",
"field": "email",
"details": {
"provided": "invalid-email",
"expected": "valid email format"
}
}
}
HTTP Status Codes:
- 200 OK: Success
- 201 Created: Resource created
- 400 Bad Request: Client error (validation)
- 401 Unauthorized: Not authenticated
- 403 Forbidden: Not authorized
- 404 Not Found: Resource not found
- 409 Conflict: Resource conflict (duplicate)
- 500 Internal Server Error: Server error
Authentication/Authorization
Authentication:
Authorization: Bearer <JWT_TOKEN>
JWT Token Payload:
{
"sub": "user_123",
"email": "user@example.com",
"role": "admin",
"exp": 1705315200
}
Authorization:
// Check if user has permission
if (user.role !== 'admin') {
return res.status(403).json({ error: 'Forbidden' });
}
Rate Limiting
Headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1705315200
Response (429 Too Many Requests):
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Try again in 60 seconds.",
"retry_after": 60
}
}
Interface Documentation
OpenAPI/Swagger Spec
Example:
openapi: 3.0.0
info:
title: User API
version: 1.0.0
description: API for managing users
contact:
name: Backend Team
email: backend@example.com
servers:
- url: https://api.example.com/v1
description: Production
- url: https://staging-api.example.com/v1
description: Staging
paths:
/users:
get:
summary: List users
parameters:
- name: page
in: query
schema:
type: integer
default: 1
- name: limit
in: query
schema:
type: integer
default: 20
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
users:
type: array
items:
$ref: '#/components/schemas/User'
total:
type: integer
page:
type: integer
components:
schemas:
User:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
email:
type: string
format: email
created_at:
type: string
format: date-time
Example Requests/Responses
Create User:
# Request
curl -X POST https://api.example.com/v1/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"name": "John Doe",
"email": "john@example.com"
}'
# Response (201 Created)
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Doe",
"email": "john@example.com",
"created_at": "2024-01-15T10:00:00Z"
}
Error Codes and Meanings
Error Code Reference:
| Code | HTTP Status | Meaning | Resolution |
|------|-------------|---------|------------|
| VALIDATION_ERROR | 400 | Invalid input | Check request body |
| UNAUTHORIZED | 401 | Not authenticated | Provide valid token |
| FORBIDDEN | 403 | Not authorized | Check permissions |
| NOT_FOUND | 404 | Resource not found | Check resource ID |
| CONFLICT | 409 | Resource conflict | Use different value |
| RATE_LIMIT_EXCEEDED | 429 | Too many requests | Wait and retry |
| INTERNAL_ERROR | 500 | Server error | Contact support |
Changelog (Version History)
Example:
# Changelog
## v1.1.0 (2024-02-01)
### Added
- New endpoint: GET /api/users/:id/posts
- Support for filtering users by role
### Changed
- Increased rate limit from 100 to 1000 req/hour
### Deprecated
- Field `full_name` (use `name` instead)
## v1.0.0 (2024-01-01)
### Added
- Initial release
- CRUD endpoints for users
Contact Info (Who Owns This)
Documentation Footer:
## Support
**Owner:** Backend Team
**Slack:** #backend-team
**Email:** backend@example.com
**On-call:** PagerDuty rotation
**SLA:**
- Response time: <200ms (p95)
- Uptime: 99.9%
- Support response: <1 hour (business hours)
Versioning Strategies
1. Semantic Versioning (MAJOR.MINOR.PATCH)
Format: v1.2.3
- MAJOR: Breaking changes (v1 → v2)
- MINOR: New features (backward compatible)
- PATCH: Bug fixes (backward compatible)
Example:
v1.0.0: Initial release
v1.1.0: Add new endpoint (backward compatible)
v1.1.1: Fix bug (backward compatible)
v2.0.0: Breaking change (remove field)
2. URL Versioning (/v1/, /v2/)
Format:
/api/v1/users
/api/v2/users
Pros:
- Clear and visible
- Easy to route
- Can run multiple versions simultaneously
Cons:
- URL changes
- Need to maintain multiple codebases
3. Header Versioning (Accept-Version)
Format:
GET /api/users
Accept-Version: v1
Pros:
- URL doesn't change
- More RESTful
Cons:
- Less visible
- Harder to test (need to set header)
4. Deprecation Policy (Notice Period)
Policy:
1. Announce deprecation (2 weeks notice)
2. Mark as deprecated (6 months)
3. Remove (12 months after deprecation)
Deprecation Notice:
{
"deprecated": true,
"deprecation_date": "2024-01-01",
"removal_date": "2025-01-01",
"replacement": "/api/v2/users",
"message": "This endpoint is deprecated. Please migrate to v2."
}
Breaking vs Non-Breaking Changes
Non-Breaking Changes (Safe)
Examples:
- Add new endpoint
- Add optional field to request
- Add new field to response
- Add new error code
- Increase rate limit
Example:
// Before
{
"id": "123",
"name": "John Doe"
}
// After (non-breaking: added field)
{
"id": "123",
"name": "John Doe",
"email": "john@example.com" // New field (clients can ignore)
}
Breaking Changes (Dangerous)
Examples:
- Remove endpoint
- Remove field from response
- Change field type
- Rename field
- Change error format
- Decrease rate limit
Example:
// Before
{
"id": "123",
"name": "John Doe"
}
// After (BREAKING: removed field)
{
"id": "123"
// "name" field removed (clients will break!)
}
Communicate Breaking Changes Early
Process:
- Announce: Email, Slack, documentation (2+ weeks notice)
- Deprecate: Mark old version as deprecated
- Support: Run both versions for transition period (6 months)
- Remove: Remove old version after transition period
Announcement Template:
# Breaking Change: User API v2
**What:** We're releasing User API v2 with breaking changes
**When:** February 1, 2024
**Why:** Improve consistency and add new features
**Breaking Changes:**
- Field `full_name` renamed to `name`
- Field `created` renamed to `created_at`
- Error format changed (see docs)
**Migration Guide:**
1. Update field names in your code
2. Update error handling
3. Test against staging API
4. Deploy to production
**Timeline:**
- Jan 15: v2 released (v1 still supported)
- Jul 15: v1 deprecated (6 months)
- Jan 15, 2025: v1 removed (12 months)
**Support:**
- Questions: #api-migration Slack channel
- Issues: api-support@example.com
Interface Agreements (Contracts)
What Each Team Provides
Backend Team Provides:
# User API Contract
**Endpoints:**
- GET /api/v1/users
- POST /api/v1/users
- GET /api/v1/users/:id
- PUT /api/v1/users/:id
- DELETE /api/v1/users/:id
**SLA:**
- Uptime: 99.9%
- Response time: <200ms (p95)
- Rate limit: 1000 req/hour per API key
**Support:**
- Documentation: https://docs.example.com/api
- Slack: #backend-api
- On-call: PagerDuty rotation
- Response time: <1 hour (business hours)
Mobile Team Provides:
# Mobile App Requirements
**API Usage:**
- Expected traffic: 10,000 req/day
- Peak traffic: 1,000 req/hour
- Regions: US, EU
**Requirements:**
- Authentication: JWT tokens
- Error handling: Retry with exponential backoff
- Caching: Cache responses for 5 minutes
**Testing:**
- Test against staging API before production
- Report bugs within 24 hours
SLAs (Response Time, Uptime)
Service Level Agreement:
# User API SLA
**Uptime:** 99.9% (43 minutes downtime per month)
**Response Time:**
- p50: <100ms
- p95: <200ms
- p99: <500ms
**Rate Limits:**
- Free tier: 100 req/hour
- Pro tier: 1,000 req/hour
- Enterprise: 10,000 req/hour
**Support:**
- Business hours (9am-5pm PT): <1 hour response
- After hours: <4 hour response
- Critical issues: <15 minute response (24/7)
**Penalties (if SLA breached):**
- 99.9% → 99.0%: 10% credit
- 99.0% → 95.0%: 25% credit
- <95.0%: 50% credit
Support Process (Who to Contact)
Escalation Path:
# Support Escalation
**Level 1: Slack (#backend-api)**
- For: Questions, minor issues
- Response time: <1 hour (business hours)
**Level 2: Email (api-support@example.com)**
- For: Bugs, feature requests
- Response time: <4 hours
**Level 3: PagerDuty (Critical Issues)**
- For: Production outages, security issues
- Response time: <15 minutes (24/7)
**Escalation Criteria:**
- No response in SLA time → Escalate to next level
- Production outage → Escalate immediately to Level 3
Review Process (Approvals Needed)
API Change Review:
# API Change Review Process
**For Non-Breaking Changes:**
1. Create PR with API changes
2. Update OpenAPI spec
3. Get approval from tech lead
4. Deploy to staging
5. Notify consumers (#api-changes Slack)
6. Deploy to production
**For Breaking Changes:**
1. Create RFC (Request for Comments)
2. Get approval from:
- Tech lead
- Product manager
- All API consumers
3. Create migration guide
4. Announce 2+ weeks in advance
5. Deploy v2 (keep v1 running)
6. Support both versions for 6 months
7. Deprecate v1
8. Remove v1 after 12 months
Integration Patterns
1. Synchronous (REST, gRPC)
When to Use:
- Need immediate response
- Request-response pattern
- Low latency required
Example (REST):
// Client
const user = await fetch('/api/users/123').then(r => r.json());
console.log(user.name);
// Server
app.get('/api/users/:id', async (req, res) => {
const user = await db.users.findById(req.params.id);
res.json(user);
});
Pros:
- Simple
- Immediate response
- Easy to debug
Cons:
- Tight coupling
- Synchronous (blocks until response)
- Harder to scale
2. Asynchronous (Message Queue, Events)
When to Use:
- Don't need immediate response
- Decouple producer and consumer
- High throughput needed
Example (Message Queue):
// Producer
await queue.publish('user.created', {
id: '123',
name: 'John Doe',
email: 'john@example.com'
});
// Consumer
queue.subscribe('user.created', async (message) => {
const user = message.data;
await sendWelcomeEmail(user.email);
});
Pros:
- Loose coupling
- Asynchronous (doesn't block)
- Easy to scale
Cons:
- More complex
- Eventual consistency
- Harder to debug
3. Batch (File Transfer, Scheduled Jobs)
When to Use:
- Large data transfers
- Not time-sensitive
- Periodic updates
Example (CSV Export):
// Producer (daily at midnight)
cron.schedule('0 0 * * *', async () => {
const users = await db.users.findAll();
const csv = convertToCSV(users);
await uploadToS3('users.csv', csv);
});
// Consumer (daily at 1am)
cron.schedule('0 1 * * *', async () => {
const csv = await downloadFromS3('users.csv');
const users = parseCSV(csv);
await processUsers(users);
});
Pros:
- Simple
- Handles large data
- Low real-time requirements
Cons:
- Not real-time
- File format coupling
- Error handling complex
Testing Cross-Team Integrations
1. Contract Testing (Pact)
Consumer Test (Mobile Team):
const { Pact } = require('@pact-foundation/pact');
const provider = new Pact({
consumer: 'MobileApp',
provider: 'UserAPI'
});
describe('User API', () => {
beforeAll(() => provider.setup());
afterAll(() => provider.finalize());
test('get user by ID', async () => {
await provider.addInteraction({
state: 'user 123 exists',
uponReceiving: 'a request for user 123',
withRequest: {
method: 'GET',
path: '/api/users/123'
},
willRespondWith: {
status: 200,
body: {
id: '123',
name: 'John Doe',
email: 'john@example.com'
}
}
});
const user = await api.getUser('123');
expect(user.name).toBe('John Doe');
});
});
Provider Test (Backend Team):
const { Verifier } = require('@pact-foundation/pact');
describe('User API Provider', () => {
test('verifies contract with MobileApp', async () => {
await new Verifier({
provider: 'UserAPI',
providerBaseUrl: 'http://localhost:3000',
pactUrls: ['./pacts/mobileapp-userapi.json'],
stateHandlers: {
'user 123 exists': async () => {
await db.users.create({ id: '123', name: 'John Doe' });
}
}
}).verifyProvider();
});
});
2. Integration Tests
Example:
describe('User API Integration', () => {
test('create and retrieve user', async () => {
// Create user
const createResponse = await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'John Doe',
email: 'john@example.com'
})
});
expect(createResponse.status).toBe(201);
const user = await createResponse.json();
// Retrieve user
const getResponse = await fetch(`/api/users/${user.id}`);
expect(getResponse.status).toBe(200);
const retrievedUser = await getResponse.json();
expect(retrievedUser.name).toBe('John Doe');
});
});
3. Staging Environment Tests
Process:
- Deploy to staging
- Run integration tests against staging
- Manual testing (if needed)
- Deploy to production
4. Mock Services for Development
Example (Mock API):
// mock-api.js
const express = require('express');
const app = express();
app.get('/api/users/:id', (req, res) => {
res.json({
id: req.params.id,
name: 'Mock User',
email: 'mock@example.com'
});
});
app.listen(3000);
Usage:
// Use mock in development, real in production
const apiUrl = process.env.NODE_ENV === 'development'
? 'http://localhost:3000'
: 'https://api.example.com';
Communication Channels
1. Shared Slack Channel
Purpose: Quick questions, updates, coordination
Example:
#mobile-backend-integration
Mobile Team: "What's the rate limit for /api/users?"
Backend Team: "1000 req/hour. See docs: https://..."
Mobile Team: "We're seeing 500 errors on staging"
Backend Team: "Investigating. Will update in 15 min"
2. Regular Sync Meetings
Frequency: Weekly or bi-weekly
Agenda:
Integration Sync (Wednesdays, 2pm)
1. Progress updates (10 min)
2. Blockers and issues (15 min)
3. Upcoming changes (10 min)
4. Action items (5 min)
3. Written Interface Docs
Location: Centralized documentation (Confluence, Notion, GitHub)
Contents:
- API reference
- Getting started guide
- Examples
- Changelog
- FAQs
4. Incident Escalation Path
Process:
1. Detect issue (monitoring, user report)
2. Report in Slack (#incidents)
3. Page on-call (PagerDuty)
4. Investigate and fix
5. Post-mortem (for SEV0/1)
Onboarding to Interface
Getting Started Guide
Example:
# User API Getting Started
## 1. Get API Key
1. Go to https://dashboard.example.com
2. Create account
3. Generate API key
## 2. Make First Request
```bash
curl https://api.example.com/v1/users \
-H "Authorization: Bearer YOUR_API_KEY"
3. Next Steps
- Read API Reference
- Try Interactive Playground
- Join Slack #api-support
### Sample Code
**JavaScript:**
```javascript
const axios = require('axios');
const api = axios.create({
baseURL: 'https://api.example.com/v1',
headers: {
'Authorization': `Bearer ${process.env.API_KEY}`
}
});
// Get user
const user = await api.get('/users/123');
console.log(user.data);
// Create user
const newUser = await api.post('/users', {
name: 'John Doe',
email: 'john@example.com'
});
console.log(newUser.data);
Sandbox Environment
Purpose: Test without affecting production
Example:
Production: https://api.example.com
Sandbox: https://sandbox-api.example.com
Sandbox features:
- Same API as production
- Test data (reset daily)
- No rate limits
- Free to use
Contact for Questions
Support Channels:
## Need Help?
**Documentation:** https://docs.example.com
**Slack:** #api-support
**Email:** api-support@example.com
**Office Hours:** Tuesdays 2-3pm PT (Zoom link)
Monitoring Interfaces
Usage Metrics
Track:
- Requests per second
- Requests by endpoint
- Requests by consumer
- Requests by region
Dashboard:
User API Usage (Last 24 Hours)
Total Requests: 1,234,567
Requests/Second: 14.3
Top Endpoints:
1. GET /api/users/:id (45%)
2. GET /api/users (30%)
3. POST /api/users (15%)
Top Consumers:
1. MobileApp (60%)
2. WebApp (30%)
3. Analytics (10%)
Error Rates
Track:
- 4xx errors (client errors)
- 5xx errors (server errors)
- Error rate by endpoint
- Error rate by consumer
Alert:
Alert: High Error Rate
Endpoint: GET /api/users/:id
Error rate: 15% (threshold: 5%)
Time: Last 15 minutes
Action: Investigate immediately
Latency
Track:
- p50, p95, p99 latency
- Latency by endpoint
- Latency by region
Dashboard:
User API Latency (Last 24 Hours)
p50: 85ms
p95: 180ms
p99: 450ms
Slowest Endpoints:
1. GET /api/users (p95: 250ms)
2. POST /api/users (p95: 200ms)
Breaking Change Impact
Track:
- Usage of deprecated endpoints
- Consumers still on old version
- Migration progress
Report:
Deprecation Report: /api/v1/users
Deprecated: Jan 1, 2024
Removal: Jul 1, 2024
Current Usage:
- Total requests: 10,000/day
- v1: 2,000/day (20%) ← Still using deprecated version
- v2: 8,000/day (80%)
Consumers on v1:
- LegacyApp (1,500/day)
- PartnerAPI (500/day)
Action: Contact LegacyApp and PartnerAPI to migrate
Interface Anti-Patterns
1. Undocumented Interfaces
Problem:
Mobile team: "How do I call the API?"
Backend team: "Let me check the code..."
→ No documentation, slow onboarding
Solution: Document all interfaces (OpenAPI spec, examples)
2. Frequent Breaking Changes
Problem:
Week 1: Field renamed from `name` to `full_name`
Week 2: Field renamed from `full_name` to `fullName`
Week 3: Field renamed from `fullName` to `displayName`
→ Consumers constantly breaking
Solution: Avoid breaking changes, use versioning
3. Tight Coupling (Team B Directly Queries Team A's DB)
Problem:
Mobile app directly queries backend database
→ Tight coupling, can't change schema
Solution: Use API layer (loose coupling)
4. No Versioning
Problem:
Breaking change deployed
→ All consumers break immediately
→ No way to rollback
Solution: Version all interfaces (/v1/, /v2/)
Real Cross-Team Interface Examples
Example 1: Payment Team API for Checkout Team
Interface:
# Payment API Contract
POST /api/v1/payments
description: Process a payment
request:
amount: number (in cents)
currency: string (USD, EUR, etc.)
payment_method: string (card, paypal, etc.)
customer_id: string
response:
200 OK:
payment_id: string
status: string (succeeded, failed, pending)
amount: number
currency: string
400 Bad Request:
error: string (invalid payment method, insufficient funds, etc.)
SLA:
- Response time: <500ms (p95)
- Uptime: 99.99%
- Support: #payments-team Slack
Example 2: Auth Team SSO for All Teams
Interface:
# SSO API Contract
POST /api/v1/auth/login
description: Authenticate user with email/password
request:
email: string
password: string
response:
200 OK:
access_token: string (JWT)
refresh_token: string
expires_in: number (seconds)
401 Unauthorized:
error: "Invalid credentials"
GET /api/v1/auth/me
description: Get current user
headers:
Authorization: Bearer <access_token>
response:
200 OK:
user_id: string
email: string
role: string
Example 3: Data Platform Events for Analytics
Interface:
# Event Schema
event: user.created
version: 1.0
payload:
user_id: string (UUID)
email: string
name: string
created_at: string (ISO 8601)
source: string (web, mobile, api)
event: user.updated
version: 1.0
payload:
user_id: string
fields_changed: array of strings
updated_at: string
event: user.deleted
version: 1.0
payload:
user_id: string
deleted_at: string
Templates
Template 1: API Contract
# [API Name] Contract
## Overview
[Brief description of what this API does]
## Authentication
[How to authenticate: JWT, API key, etc.]
## Endpoints
### [Endpoint Name]
**Method:** GET/POST/PUT/DELETE
**Path:** /api/v1/[resource]
**Description:** [What this endpoint does]
**Request:**
```json
{
"field1": "type (required/optional)",
"field2": "type (required/optional)"
}
Response (200 OK):
{
"field1": "type",
"field2": "type"
}
Errors:
- 400: [Description]
- 404: [Description]
- 500: [Description]
SLA
- Uptime: [percentage]
- Response time: [latency]
- Rate limit: [requests per time]
Support
- Documentation: [URL]
- Slack: [channel]
- Email: [email]
- On-call: [PagerDuty/phone]
Changelog
- v1.1.0 (2024-02-01): [Changes]
- v1.0.0 (2024-01-01): Initial release
### Template 2: Integration Checklist
```markdown
# Integration Checklist
## Pre-Integration
- [ ] API contract defined and agreed
- [ ] OpenAPI spec created
- [ ] Sample code provided
- [ ] Sandbox environment available
- [ ] Documentation published
## Development
- [ ] Consumer tests written (Pact)
- [ ] Provider tests written
- [ ] Integration tests written
- [ ] Error handling implemented
- [ ] Retry logic implemented
## Testing
- [ ] Tested against sandbox
- [ ] Tested against staging
- [ ] Load testing completed
- [ ] Security testing completed
## Deployment
- [ ] Deployed to staging
- [ ] Integration tests passing
- [ ] Deployed to production
- [ ] Monitoring configured
- [ ] Alerts configured
## Post-Deployment
- [ ] Consumers notified
- [ ] Documentation updated
- [ ] Runbook created
- [ ] On-call rotation updated
Summary
Quick Reference
Interface Types:
- Technical: REST, GraphQL, gRPC, events
- Data: Schemas, file formats, messages
- Process: Handoffs, approvals, escalations
Good Interface Characteristics:
- Clear contract (input, output, behavior)
- Versioned (avoid breaking changes)
- Documented (API docs, examples)
- Stable (don't change frequently)
- Testable (integration tests)
API Design:
- RESTful conventions (resource-based URLs)
- Consistent naming (plural nouns, camelCase)
- Error handling (standard codes and formats)
- Authentication (JWT, API keys)
- Rate limiting (prevent abuse)
Versioning:
- Semantic versioning (MAJOR.MINOR.PATCH)
- URL versioning (/v1/, /v2/)
- Deprecation policy (2 weeks notice, 6 months support)
Breaking vs Non-Breaking:
- Non-breaking: Add field, add endpoint
- Breaking: Remove field, change type, rename
- Communicate breaking changes early
Integration Patterns:
- Synchronous: REST, gRPC (immediate response)
- Asynchronous: Message queue, events (decouple)
- Batch: File transfer, scheduled jobs (large data)
Testing:
- Contract testing (Pact)
- Integration tests
- Staging environment tests
- Mock services (development)
Monitoring:
- Usage metrics (requests, consumers)
- Error rates (4xx, 5xx)
- Latency (p50, p95, p99)
- Breaking change impact
Anti-Patterns:
- Undocumented interfaces
- Frequent breaking changes
- Tight coupling (direct DB access)
- No versioning
Exemples
Consultez les exemples du dépôt source.
Voir la source ↗Historique source
- Date d’indexation
- 2026-01-20
- Mise à jour de l’index
- 2026-01-26
- Branch
- main
Les dates concernent ce répertoire. Consultez le dépôt pour l’historique du code.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!