SlideShare a Scribd company logo
Contract-first API
development
The journey that led to Spot
@fwouts
François Wouts
Software EngineerSoftware EngineerDeveloper Happiness Engineer
Airtasker has three client apps
Cross-functional teams
�
�🏾
��🏻 💻��🏼 💻��🏼 💻������🏼
UX PM
Typical
development process
��🏼 💻Done! The endpoint is /bookings.
��🏻♂Let's launch bookings on Web!PM
…
��🏼 💻OK, I'll implement an API endpoint to fetch bookings.
��🏼 💻Let me add this to the endpoint.
� 👌
�
�🏾
��
Where do I find the scheduled date?
��🏼 💻I've added `scheduled_date`.
It's an int timestamp but it can be null too.
…
🚀
✅
1 month later
��🏻♂Let's launch bookings on iOS!
��🏼 💻/bookings
��🏼 💻What's the endpoint called?
��🏼 💻👌
PM
🚀💥
��🏼 💻It's expected for cancelled bookings.
��🏼 💻Why would it return null?
📱💥
JSON deserialisation error
Expected int, got null for property scheduled_date
��🏼 💻😰
What happened?
💥 iOS app crashed due to unexpected response payload
🚫 Web engineer blocked until API implemented
🚧 API had to be reworked
Why did this happen?
⚠ API was not explicitly documented ⚠
💔 Client engineers were not consulted
Contract-first
development process
��🏻♂Let's launch bookings on Web!
��🏼 💻Here is a draft API contract.
PM
…
��🏼 💻OK, I'll start designing an API to fetch bookings.
Draft API contract
�
�🏾
��
How about adding scheduled_date too?
��🏼 💻👍 I added scheduled_date of type int or null.
��🏼 💻Done!
Suggestion: scheduled_date of type string
��🏻 💻
�
�🏾
����🏻 💻✅ ✅ ✅
��🏼 💻Thanks! I'll start implementing now.
��🏼 💻👍 I've added a pagination cursor.
Will the endpoint be paginated?
��🏼 💻
REST API documentation formats
Sharing a doc
Simple and helpful
Very collaborative
Leads to a better API
- Details can be missed
- Informal review process
- Easily gets out of date
OpenAPI
(Swagger)
OpenAPI
(Swagger)
POST /users
{
"email": "f@zenc.io",
"password": "hunter2"
}
Example: A simple API
201 Created
{
"user_id": "f123"
}
OpenAPI (Swagger) definitions:
CreateUserRequest:
type: "object"
properties:
email:
type: "string"
password:
type: "string"
CreateUserResponse:
type: "object"
properties:
user_id:
type: "string"
paths:
/users:
post:
operationId: "createUser"
parameters:
- in: "body"
name: "body"
required: true
schema:
$ref: "#/definitions/CreateUserRequest"
responses:
"201":
schema:
$ref: "#/definitions/CreateUserResponse"
definitions:
CreateUserRequest:
type: "object"
properties:
email:
type: "string"
password:
type: "string"
required:
- "email"
- "password"
CreateUserResponse:
type: "object"
properties:
user_id:
type: "string"
required:
- "user_id"
OpenAPI (Swagger)
Structured
Official format
Can describe most REST APIs (JSON or XML)
- Fairly complex (spec = 56 pages long)
- Difficult to write by hand
- Difficult to review diffs
Source:
openapi.tools
apidays LIVE Australia 2020 - Contract-first API development with Spot by Francois Wout
● Designed for editing
● Still hard to review OpenAPI diffs
GUI editors
�
�🏾
��🏻 💻
��
��🏼 💻
��
Our REST API is JSON
● JSON = JavaScript Object Notation
● JavaScript types = TypeScript
JSON TypeScript
var payload = {
"name": "Spot",
"stars": 151
}
type Payload = {
name: string,
stars: number
}
Introducing Spot
https://github.com/airtasker/spot
POST /users
{
"email": "f@zenc.io",
"password": "hunter2"
}
Example: A simple API
201 Created
{
"user_id": "f123"
}
@endpoint({
method: "POST",
path: "/users"
})
class CreateUser {
@request
request(@body body: CreateUserRequest) {}
@response({ status: 201 })
success(@body body: CreateUserResponse) {}
}
type CreateUserResponse = {
user_id: string;
}
type CreateUserRequest = {
email: string;
password: string;
}
paths:
/users:
post:
operationId: "createUser"
parameters:
- in: "body"
name: "body"
required: true
schema:
$ref: "#/definitions/CreateUserRequest"
responses:
"201":
schema:
$ref: "#/definitions/CreateUserResponse"
definitions:
CreateUserRequest:
type: "object"
properties:
email:
type: "string"
password:
type: "string"
required:
- "email"
- "password"
CreateUserResponse:
type: "object"
properties:
user_id:
type: "string"
required:
- "user_id"
OpenAPI for comparisonSpot (TypeScript)
type CreateUserRequest = {
email: string;
password: string;
location?: Location;
}
type Location = {
suburb: string | null;
country: Country;
}
type Country = 'AU' | 'UK' | 'FR';
TypeScript is (almost) intuitive
omittable field
required but nullable
string enum
components:
schemas:
Country:
type: string
enum:
- AU
- UK
- FR
CreateUserRequest:
type: object
properties:
email:
type: string
password:
type: string
location:
$ref: '#/components/schemas/Location'
required:
- email
- password
Location:
type: object
properties:
suburb:
type: string
nullable: true
country:
$ref: '#/components/schemas/Country'
required:
- suburb
- country
Developer experience
apidays LIVE Australia 2020 - Contract-first API development with Spot by Francois Wout
Spot
Structured
Easy to write
Easy to review diffs
Editor autocomplete
- Limited to JSON
Spot Workflow
1. Draft API contract with Spot (e.g. in VS Code)
2. Send a PR to interested engineers to gather feedback
3. Merge the PR
4. Then in parallel:
○ API engineer implements the new API
○ Client engineers implement new features based on the API
Upfront API design facilitates parallel development
What about OpenAPI?
✅ Spot generates OpenAPI!
Tooling
● Documentation
○ spot docs api.ts
● Client code generation
○ leveraging OpenAPI client generators (e.g. SwiftGen)
○ no more implementation mistakes!
● API contract testing
○ https://github.com/airtasker/spot/wiki/Contract-Testing
● Linting based on API guidelines
○ spot lint api.ts
● Mock API server
○ spot mock api.ts
Probably.
● No need to be familiar with TypeScript
○ quickly adopted at Airtasker by Ruby, Kotlin, Swift engineers
● Easy to integrate into your existing PR review process
● ⚠ Spot is only for JSON REST APIs
○ alternative to GraphQL, gRPC and Thrift
○ Spot is inspired by gRPC
● It's still early days (our docs need some ❤)
Is Spot good for my team?
Want to learn more?
Spot is open source!
https://github.com/airtasker/spot
Thank you!
@fwouts
Come work with me at Airtasker!
We're hiring:
● Senior Software Engineers
● VP of Engineering
https://fwouts.com

More Related Content

PDF
apidays LIVE Australia 2020 - API Design in Fintech: Challenges and Opportuni...
PDF
apidays LIVE Australia 2020 - Evaluating the usability of security APIs by Dr...
PDF
apidays LIVE Australia 2020 - Federating API Development at Australia’s large...
PDF
Rest api best practices – comprehensive handbook
PDF
apidays LIVE Australia 2020 - The Evolution of APIs: Events and the AsyncAPI ...
PPTX
Open Event API
PDF
apidays LIVE Hong Kong 2021 - Multi-Protocol APIs at Scale in Adidas by Jesus...
PDF
Api clarity webinar
apidays LIVE Australia 2020 - API Design in Fintech: Challenges and Opportuni...
apidays LIVE Australia 2020 - Evaluating the usability of security APIs by Dr...
apidays LIVE Australia 2020 - Federating API Development at Australia’s large...
Rest api best practices – comprehensive handbook
apidays LIVE Australia 2020 - The Evolution of APIs: Events and the AsyncAPI ...
Open Event API
apidays LIVE Hong Kong 2021 - Multi-Protocol APIs at Scale in Adidas by Jesus...
Api clarity webinar

What's hot (20)

PDF
apidays LIVE Australia 2020 - Building a scalable API platform for an IoT eco...
PDF
apidays LIVE Australia 2021 - From apps to APIs: how no-code is transforming ...
PDF
apidays LIVE Australia 2020 - From micro to macro-coordination through domain...
PDF
apidays LIVE Hong Kong 2021 - GraphQL : Beyond APIs, graph your enterprise by...
PDF
Essential Ingredients for a Successful API Program
PDF
[API World 2021 ] - Understanding Cloud Native Deployment
PPTX
Executing on API Developer Experience
PDF
API Security Webinar : Security Guidelines for Providing and Consuming APIs
PPTX
apidays LIVE LONDON - Discovering API Version differences with ease by Jaap B...
PDF
apidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
PDF
Building an API Security Strategy
PDF
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
PPTX
API Best Practices
PDF
apidays LIVE London 2021 - Getting started with Event-Driven APIs by Hugo Gue...
PPTX
What's an api
PDF
APIdays Singapore 2019 - Airbnb's Great Migration: Service APIs at scale, Jes...
PPTX
Public API
PPTX
Pure APIs: Development workflows for successful API integrations
PPTX
Operational API design anti-patterns (Jason Harmon)
PPTX
apidays LIVE New York - API Lifecycle Management - Avoiding Breaches By Secur...
apidays LIVE Australia 2020 - Building a scalable API platform for an IoT eco...
apidays LIVE Australia 2021 - From apps to APIs: how no-code is transforming ...
apidays LIVE Australia 2020 - From micro to macro-coordination through domain...
apidays LIVE Hong Kong 2021 - GraphQL : Beyond APIs, graph your enterprise by...
Essential Ingredients for a Successful API Program
[API World 2021 ] - Understanding Cloud Native Deployment
Executing on API Developer Experience
API Security Webinar : Security Guidelines for Providing and Consuming APIs
apidays LIVE LONDON - Discovering API Version differences with ease by Jaap B...
apidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
Building an API Security Strategy
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
API Best Practices
apidays LIVE London 2021 - Getting started with Event-Driven APIs by Hugo Gue...
What's an api
APIdays Singapore 2019 - Airbnb's Great Migration: Service APIs at scale, Jes...
Public API
Pure APIs: Development workflows for successful API integrations
Operational API design anti-patterns (Jason Harmon)
apidays LIVE New York - API Lifecycle Management - Avoiding Breaches By Secur...
Ad

Similar to apidays LIVE Australia 2020 - Contract-first API development with Spot by Francois Wout (20)

PDF
GraphQL: The Missing Link Between Frontend and Backend Devs
PPTX
API Workshop: Deep dive into REST APIs
PDF
APIdays Paris 2019 - API Descriptions as Product Code by Phil Sturgeon, Stopl...
PDF
How to Create the API Document from Real API and Localization
PPTX
API Documentation -- Presentation to East Bay STC Chapter
PPTX
API Documentation presentation to East Bay STC Chapter
PPTX
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
PDF
GraphQL: Enabling a new generation of API developer tools
PDF
OpenAPI development with Python
PDF
Build Great Networked APIs with Swift, OpenAPI, and gRPC
PDF
Parse cloud code
PDF
Building APIs in an easy way using API Platform
PPTX
REST API Best Practices & Implementing in Codeigniter
PPTX
API workshop: Introduction to APIs (TC Camp)
PDF
Design Web Api
PDF
Crafting APIs
PDF
Practices and tools for building better APIs
PDF
Practices and tools for building better API (JFall 2013)
ODP
WordPress as a Platform - talk to Bristol Open Source Meetup, 2014-12-08
PDF
Playing with parse.com
GraphQL: The Missing Link Between Frontend and Backend Devs
API Workshop: Deep dive into REST APIs
APIdays Paris 2019 - API Descriptions as Product Code by Phil Sturgeon, Stopl...
How to Create the API Document from Real API and Localization
API Documentation -- Presentation to East Bay STC Chapter
API Documentation presentation to East Bay STC Chapter
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
GraphQL: Enabling a new generation of API developer tools
OpenAPI development with Python
Build Great Networked APIs with Swift, OpenAPI, and gRPC
Parse cloud code
Building APIs in an easy way using API Platform
REST API Best Practices & Implementing in Codeigniter
API workshop: Introduction to APIs (TC Camp)
Design Web Api
Crafting APIs
Practices and tools for building better APIs
Practices and tools for building better API (JFall 2013)
WordPress as a Platform - talk to Bristol Open Source Meetup, 2014-12-08
Playing with parse.com
Ad

More from apidays (20)

PDF
apidays Munich 2025 - The Physics of Requirement Sciences Through Application...
PDF
apidays Munich 2025 - Developer Portals, API Catalogs, and Marketplaces, Miri...
PDF
apidays Munich 2025 - Making Sense of AI-Ready APIs in a Buzzword World, Andr...
PDF
apidays Munich 2025 - Integrate Your APIs into the New AI Marketplace, Senthi...
PDF
apidays Munich 2025 - The Double Life of the API Product Manager, Emmanuel Pa...
PDF
apidays Munich 2025 - Let’s build, debug and test a magic MCP server in Postm...
PDF
apidays Munich 2025 - The life-changing magic of great API docs, Jens Fischer...
PDF
apidays Munich 2025 - Automating Operations Without Reinventing the Wheel, Ma...
PDF
apidays Munich 2025 - Geospatial Artificial Intelligence (GeoAI) with OGC API...
PPTX
apidays Munich 2025 - GraphQL 101: I won't REST, until you GraphQL, Surbhi Si...
PPTX
apidays Munich 2025 - Effectively incorporating API Security into the overall...
PPTX
apidays Munich 2025 - Federated API Management and Governance, Vince Baker (D...
PPTX
apidays Munich 2025 - Agentic AI: A Friend or Foe?, Merja Kajava (Aavista Oy)
PPTX
apidays Munich 2025 - Streamline & Secure LLM Traffic with APISIX AI Gateway ...
PPTX
apidays Munich 2025 - Building Telco-Aware Apps with Open Gateway APIs, Subhr...
PPTX
apidays Munich 2025 - Building an AWS Serverless Application with Terraform, ...
PDF
apidays Helsinki & North 2025 - REST in Peace? Hunting the Dominant Design fo...
PDF
apidays Helsinki & North 2025 - Monetizing AI APIs: The New API Economy, Alla...
PDF
apidays Helsinki & North 2025 - How (not) to run a Graphql Stewardship Group,...
PDF
apidays Helsinki & North 2025 - APIs in the healthcare sector: hospitals inte...
apidays Munich 2025 - The Physics of Requirement Sciences Through Application...
apidays Munich 2025 - Developer Portals, API Catalogs, and Marketplaces, Miri...
apidays Munich 2025 - Making Sense of AI-Ready APIs in a Buzzword World, Andr...
apidays Munich 2025 - Integrate Your APIs into the New AI Marketplace, Senthi...
apidays Munich 2025 - The Double Life of the API Product Manager, Emmanuel Pa...
apidays Munich 2025 - Let’s build, debug and test a magic MCP server in Postm...
apidays Munich 2025 - The life-changing magic of great API docs, Jens Fischer...
apidays Munich 2025 - Automating Operations Without Reinventing the Wheel, Ma...
apidays Munich 2025 - Geospatial Artificial Intelligence (GeoAI) with OGC API...
apidays Munich 2025 - GraphQL 101: I won't REST, until you GraphQL, Surbhi Si...
apidays Munich 2025 - Effectively incorporating API Security into the overall...
apidays Munich 2025 - Federated API Management and Governance, Vince Baker (D...
apidays Munich 2025 - Agentic AI: A Friend or Foe?, Merja Kajava (Aavista Oy)
apidays Munich 2025 - Streamline & Secure LLM Traffic with APISIX AI Gateway ...
apidays Munich 2025 - Building Telco-Aware Apps with Open Gateway APIs, Subhr...
apidays Munich 2025 - Building an AWS Serverless Application with Terraform, ...
apidays Helsinki & North 2025 - REST in Peace? Hunting the Dominant Design fo...
apidays Helsinki & North 2025 - Monetizing AI APIs: The New API Economy, Alla...
apidays Helsinki & North 2025 - How (not) to run a Graphql Stewardship Group,...
apidays Helsinki & North 2025 - APIs in the healthcare sector: hospitals inte...

Recently uploaded (20)

PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Encapsulation theory and applications.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
KodekX | Application Modernization Development
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Machine learning based COVID-19 study performance prediction
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
A Presentation on Artificial Intelligence
NewMind AI Monthly Chronicles - July 2025
Building Integrated photovoltaic BIPV_UPV.pdf
Encapsulation theory and applications.pdf
Empathic Computing: Creating Shared Understanding
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
Diabetes mellitus diagnosis method based random forest with bat algorithm
“AI and Expert System Decision Support & Business Intelligence Systems”
Digital-Transformation-Roadmap-for-Companies.pptx
KodekX | Application Modernization Development
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
The Rise and Fall of 3GPP – Time for a Sabbatical?
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Understanding_Digital_Forensics_Presentation.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Machine learning based COVID-19 study performance prediction
CIFDAQ's Market Insight: SEC Turns Pro Crypto
20250228 LYD VKU AI Blended-Learning.pptx
A Presentation on Artificial Intelligence

apidays LIVE Australia 2020 - Contract-first API development with Spot by Francois Wout

  • 2. François Wouts Software EngineerSoftware EngineerDeveloper Happiness Engineer
  • 3. Airtasker has three client apps
  • 4. Cross-functional teams � �🏾 ��🏻 💻��🏼 💻��🏼 💻������🏼 UX PM
  • 6. ��🏼 💻Done! The endpoint is /bookings. ��🏻♂Let's launch bookings on Web!PM … ��🏼 💻OK, I'll implement an API endpoint to fetch bookings.
  • 7. ��🏼 💻Let me add this to the endpoint. � 👌 � �🏾 �� Where do I find the scheduled date? ��🏼 💻I've added `scheduled_date`. It's an int timestamp but it can be null too. …
  • 9.
  • 11. ��🏻♂Let's launch bookings on iOS! ��🏼 💻/bookings ��🏼 💻What's the endpoint called? ��🏼 💻👌 PM
  • 13. ��🏼 💻It's expected for cancelled bookings. ��🏼 💻Why would it return null? 📱💥 JSON deserialisation error Expected int, got null for property scheduled_date ��🏼 💻😰
  • 14. What happened? 💥 iOS app crashed due to unexpected response payload 🚫 Web engineer blocked until API implemented 🚧 API had to be reworked
  • 15. Why did this happen? ⚠ API was not explicitly documented ⚠ 💔 Client engineers were not consulted
  • 17. ��🏻♂Let's launch bookings on Web! ��🏼 💻Here is a draft API contract. PM … ��🏼 💻OK, I'll start designing an API to fetch bookings.
  • 19. � �🏾 �� How about adding scheduled_date too? ��🏼 💻👍 I added scheduled_date of type int or null. ��🏼 💻Done! Suggestion: scheduled_date of type string ��🏻 💻
  • 20. � �🏾 ����🏻 💻✅ ✅ ✅ ��🏼 💻Thanks! I'll start implementing now. ��🏼 💻👍 I've added a pagination cursor. Will the endpoint be paginated? ��🏼 💻
  • 22. Sharing a doc Simple and helpful Very collaborative Leads to a better API - Details can be missed - Informal review process - Easily gets out of date
  • 25. POST /users { "email": "f@zenc.io", "password": "hunter2" } Example: A simple API 201 Created { "user_id": "f123" }
  • 26. OpenAPI (Swagger) definitions: CreateUserRequest: type: "object" properties: email: type: "string" password: type: "string" CreateUserResponse: type: "object" properties: user_id: type: "string" paths: /users: post: operationId: "createUser" parameters: - in: "body" name: "body" required: true schema: $ref: "#/definitions/CreateUserRequest" responses: "201": schema: $ref: "#/definitions/CreateUserResponse" definitions: CreateUserRequest: type: "object" properties: email: type: "string" password: type: "string" required: - "email" - "password" CreateUserResponse: type: "object" properties: user_id: type: "string" required: - "user_id"
  • 27. OpenAPI (Swagger) Structured Official format Can describe most REST APIs (JSON or XML) - Fairly complex (spec = 56 pages long) - Difficult to write by hand - Difficult to review diffs
  • 30. ● Designed for editing ● Still hard to review OpenAPI diffs GUI editors � �🏾 ��🏻 💻 �� ��🏼 💻 ��
  • 31. Our REST API is JSON ● JSON = JavaScript Object Notation ● JavaScript types = TypeScript JSON TypeScript var payload = { "name": "Spot", "stars": 151 } type Payload = { name: string, stars: number }
  • 33. POST /users { "email": "f@zenc.io", "password": "hunter2" } Example: A simple API 201 Created { "user_id": "f123" }
  • 34. @endpoint({ method: "POST", path: "/users" }) class CreateUser { @request request(@body body: CreateUserRequest) {} @response({ status: 201 }) success(@body body: CreateUserResponse) {} } type CreateUserResponse = { user_id: string; } type CreateUserRequest = { email: string; password: string; } paths: /users: post: operationId: "createUser" parameters: - in: "body" name: "body" required: true schema: $ref: "#/definitions/CreateUserRequest" responses: "201": schema: $ref: "#/definitions/CreateUserResponse" definitions: CreateUserRequest: type: "object" properties: email: type: "string" password: type: "string" required: - "email" - "password" CreateUserResponse: type: "object" properties: user_id: type: "string" required: - "user_id" OpenAPI for comparisonSpot (TypeScript)
  • 35. type CreateUserRequest = { email: string; password: string; location?: Location; } type Location = { suburb: string | null; country: Country; } type Country = 'AU' | 'UK' | 'FR'; TypeScript is (almost) intuitive omittable field required but nullable string enum components: schemas: Country: type: string enum: - AU - UK - FR CreateUserRequest: type: object properties: email: type: string password: type: string location: $ref: '#/components/schemas/Location' required: - email - password Location: type: object properties: suburb: type: string nullable: true country: $ref: '#/components/schemas/Country' required: - suburb - country
  • 38. Spot Structured Easy to write Easy to review diffs Editor autocomplete - Limited to JSON
  • 39. Spot Workflow 1. Draft API contract with Spot (e.g. in VS Code) 2. Send a PR to interested engineers to gather feedback 3. Merge the PR 4. Then in parallel: ○ API engineer implements the new API ○ Client engineers implement new features based on the API Upfront API design facilitates parallel development
  • 40. What about OpenAPI? ✅ Spot generates OpenAPI!
  • 41. Tooling ● Documentation ○ spot docs api.ts ● Client code generation ○ leveraging OpenAPI client generators (e.g. SwiftGen) ○ no more implementation mistakes! ● API contract testing ○ https://github.com/airtasker/spot/wiki/Contract-Testing ● Linting based on API guidelines ○ spot lint api.ts ● Mock API server ○ spot mock api.ts
  • 42. Probably. ● No need to be familiar with TypeScript ○ quickly adopted at Airtasker by Ruby, Kotlin, Swift engineers ● Easy to integrate into your existing PR review process ● ⚠ Spot is only for JSON REST APIs ○ alternative to GraphQL, gRPC and Thrift ○ Spot is inspired by gRPC ● It's still early days (our docs need some ❤) Is Spot good for my team?
  • 43. Want to learn more? Spot is open source! https://github.com/airtasker/spot
  • 44. Thank you! @fwouts Come work with me at Airtasker! We're hiring: ● Senior Software Engineers ● VP of Engineering https://fwouts.com