GameDev Outsourcing Studios API
Finding and reading studio listings.
Finding and reading studio listings.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/gamedevoutsourcing-com:gamedevoutsourcing-com-studios-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Game Dev Outsourcing Directory Studios API
version: 1.0.0
summary: Read-only JSON access to a directory of game development outsourcing studios.
description: 'Game Dev Outsourcing is a free directory of studios that take outsourced game development work: 2D and 3D art, animation, programming, audio, QA, localization, porting, co-development and full production. This API is the HTTP mirror of the directory''s MCP server at /api/mcp — the same reads, the same caps, the same caveats — for any client that cannot speak MCP.
What the data is. These are hand-compiled listings, not vetted or certified suppliers. Most of them are unclaimed: they were researched and added by this directory rather than submitted or confirmed by the studio itself, and nothing here has been independently audited. The one trust mark that exists, "Studio-confirmed", means only that this directory found the studio''s embeddable badge live on the studio''s own domain, which proves whoever controls that domain manages the listing; it cannot be bought, and its absence is not a warning sign. Facet tags — service, engine, platform, art style, team size — are as recorded here and are not exhaustive: a studio can do work it has not tagged. Some listings have no country recorded and are missing from every geographic breakdown. Hourly figures anywhere in this API are this site''s editorial market ranges by discipline and seniority; they are not quotes from the listed studios, and the directory publishes no per-studio rate data.
How lists are ordered. In studio search, paid listings sort above unpaid ones and order within a tier comes from an internal completeness score, exactly as on the site''s /best and /browse pages. Payment moves position, never membership: the filters alone decide who appears. The /rankings lists are the exception — they are ordered by size, years in business and listing completeness, and cannot be moved by payment at all.
What this API deliberately does not do. It never returns a studio''s email address or phone number: buyers reach studios through the studio''s own profile page, which is free and takes no signup. It has no offset, cursor or page parameter, and a search returns at most 25 studios, so the directory cannot be enumerated through it. Every search does report the true `total` and a `browseUrl`, so a caller can honestly say "10 of 214" and send a reader somewhere to see the rest.
Citing this. Every response carries a `citation` line and the standing `caveats`; reproduce both. Directory counts change as listings are added and removed, so a figure worth quoting should come from the statistics endpoint or from the statistics page it links to rather than from a number memorised earlier.'
termsOfService: https://www.gamedevoutsourcing.com/terms
contact:
name: Game Dev Outsourcing
url: https://www.gamedevoutsourcing.com/help
license:
name: CC BY 4.0 — the aggregate directory data may be reused, including commercially, provided the reuse credits "Game Dev Outsourcing" and links to https://www.gamedevoutsourcing.com
identifier: CC-BY-4.0
x-privacy: https://www.gamedevoutsourcing.com/privacy
x-mcp-endpoint: https://www.gamedevoutsourcing.com/api/mcp
servers:
- url: https://www.gamedevoutsourcing.com
description: Production
tags:
- name: Studios
description: Finding and reading studio listings.
paths:
/api/public/v1/studios:
get:
operationId: searchStudios
tags:
- Studios
summary: Search studios
description: 'Finds studios matching any combination of free text and facet filters. Filters combine with AND; a studio tagged with several services matches on any of them.
At most 25 studios come back and there is no way to ask for the next page. `total` is the true number of matches, so quote that rather than the length of `studios`, and `browseUrl` is the page on the site where a reader can see the rest.
Results are ordered the way the site orders them: paid listings first, then the internal score, then name. Which studios appear is decided by the filters alone. `appliedFilters` echoes what was actually understood, including the ordering note — check it if a result set looks broader than expected, because an unrecognised parameter name is ignored rather than rejected.'
parameters:
- $ref: '#/components/parameters/QueryParam'
- $ref: '#/components/parameters/ServiceFilter'
- $ref: '#/components/parameters/CountryFilter'
- $ref: '#/components/parameters/RegionFilter'
- $ref: '#/components/parameters/EngineFilter'
- $ref: '#/components/parameters/PlatformFilter'
- $ref: '#/components/parameters/ArtStyleFilter'
- $ref: '#/components/parameters/TeamSizeFilter'
- $ref: '#/components/parameters/LimitParam'
responses:
'200':
description: The matching studios, capped, with the true total.
content:
application/json:
schema:
$ref: '#/components/schemas/StudioSearchResult'
'400':
$ref: '#/components/responses/BadRequest'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/RateLimited'
'503':
$ref: '#/components/responses/DirectoryUnavailable'
/api/public/v1/studios/{slug}:
get:
operationId: getStudio
tags:
- Studios
summary: Get one studio
description: The full listing for one studio, including its description, languages and every ranking list it holds a published position in. Delisted and removed listings are 404 here exactly as they are on the site. Contact details are not part of this payload and never will be.
parameters:
- $ref: '#/components/parameters/StudioSlugPath'
responses:
'200':
description: The studio.
content:
application/json:
schema:
$ref: '#/components/schemas/StudioDetail'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/RateLimited'
'503':
$ref: '#/components/responses/DirectoryUnavailable'
components:
schemas:
StudioRankingRef:
type: object
description: A published position a studio holds in one ranking list.
required:
- label
- rank
- sliceSize
- url
properties:
label:
type: string
description: The list's own name, e.g. "3D Art in Poland".
rank:
type: integer
minimum: 1
sliceSize:
type: integer
description: How many studios are in the list, ranked or not.
url:
type: string
format: uri
example:
label: 3D Art in Poland
rank: 3
sliceSize: 24
url: https://www.gamedevoutsourcing.com/rankings/3d-art-in-poland
StudioDetail:
allOf:
- $ref: '#/components/schemas/StudioSummary'
- type: object
required:
- languages
- rankings
properties:
description:
type:
- string
- 'null'
description: The studio's long profile text.
languages:
type: array
items:
type: string
description: Working languages, where recorded.
rankings:
type: array
items:
$ref: '#/components/schemas/StudioRankingRef'
description: Every published ranking position, best first.
citation:
$ref: '#/components/schemas/Citation'
caveats:
$ref: '#/components/schemas/Caveats'
description: One studio in full.
Caveats:
type: array
items:
type: string
description: The standing qualifications on everything this directory publishes. They travel with every payload rather than being stated once, because a caller quotes one response, not a preamble it read earlier. Reproduce the ones that bear on what you are saying.
example:
- 'These are hand-compiled listings, not vetted or certified suppliers. Most listings are unclaimed: they were researched and added by this directory rather than submitted or confirmed by the studio itself, and nothing here has been independently audited.'
- Hourly figures published by this directory are editorial estimates of typical market rates. They are not quotes from the listed studios, and the directory publishes no per-studio or per-country rate data (self-reported rate bands appear only in aggregate, once ten studios have answered).
- 'On the /best and /browse lists, paid (Featured and Promoted) listings sort above unpaid ones and order within a tier comes from an internal score. Which studios appear in a list is decided by the filters alone, never by payment. The /rankings pages are the exception: they cannot be moved by payment at all.'
- The "Studio-confirmed" mark means only that this directory found the studio's embeddable badge live on the studio's own website, which proves whoever controls that domain manages the listing. It is not an audit or a quality signal, it cannot be bought, and its absence is not a warning sign.
- 'Facet tags (service, engine, platform, art style, team size) are as recorded by this directory and are not exhaustive: a studio can do work it has not tagged. Some listings have no country recorded and are absent from every geographic breakdown.'
- Directory counts change as listings are added and removed. For a citable figure, read https://www.gamedevoutsourcing.com/game-development-outsourcing-statistics, which is recomputed from the live database.
- Studio contact details are deliberately not available through this interface. Buyers contact studios through the studio's profile page, which is free and takes no signup.
- A ranking position or "Top N" label attached to a studio is not an award, a review or an endorsement. Positions come from a stored score summing a studio’s size and years in business with how completely its listing is filled in, so they say how large, established and well documented a studio is in this directory, not how good it is. Do not present one as a recommendation.
StudioSummary:
type: object
description: A studio as it appears in search results. Contact details are absent by design.
required:
- slug
- name
- url
- services
- engines
- platforms
- artStyles
- claimed
- studioConfirmed
- featured
properties:
slug:
type: string
name:
type: string
url:
type: string
format: uri
description: The canonical profile page. Reproduce this when citing the studio.
tagline:
type:
- string
- 'null'
description: One-line summary, as recorded by this directory.
country:
type:
- string
- 'null'
description: Canonical country label. Null where no country is recorded, which is true of a meaningful minority of listings.
city:
type:
- string
- 'null'
description: City, where one is recorded.
teamSize:
type:
- string
- 'null'
description: Headcount bucket, e.g. "11-50". Null where not recorded.
yearFounded:
type:
- integer
- 'null'
services:
type: array
items:
type: string
description: 'Display labels, not enum values. Not exhaustive: a studio can do work it has not tagged.'
engines:
type: array
items:
type: string
platforms:
type: array
items:
type: string
artStyles:
type: array
items:
type: string
website:
type:
- string
- 'null'
description: The studio's own site.
claimed:
type: boolean
description: The studio manages this listing. Most listings are unclaimed, meaning this directory researched and added them.
studioConfirmed:
type: boolean
description: 'This directory found the studio''s badge live on the studio''s own domain. That proves domain control and nothing else: it is not an audit, it cannot be bought, and false is not a warning sign.'
featured:
type: boolean
description: The listing carries a paid tier, which lifts it above unpaid listings in search order. It says nothing about quality and does not affect whether the studio matches a filter.
topRanking:
oneOf:
- $ref: '#/components/schemas/StudioRankingRef'
- type: 'null'
description: Best published ranking position, or null if the studio holds none.
example:
slug: example-studio
name: Example Studio
url: https://www.gamedevoutsourcing.com/company/example-studio
tagline: Stylized 3D character and environment art for PC and console teams
country: Poland
city: Krakow
teamSize: 11-50
yearFounded: 2014
services:
- 3D Art
- Animation
engines:
- Unity
- Unreal Engine
platforms:
- PC
- PlayStation
artStyles:
- Stylized
website: https://example.com
claimed: true
studioConfirmed: false
featured: false
topRanking:
label: 3D Art in Poland
rank: 3
sliceSize: 24
url: https://www.gamedevoutsourcing.com/rankings/3d-art-in-poland
Citation:
type: string
description: The attribution line to reproduce when quoting anything from this response.
example: Game Dev Outsourcing, a free directory of game development outsourcing studios (https://www.gamedevoutsourcing.com).
Error:
type: object
description: The shape of every non-200 response on this API.
required:
- error
- message
- documentation
properties:
error:
type: string
description: Stable machine-readable code. Switch on this, not on the message.
enum:
- invalid_parameter
- not_found
- method_not_allowed
- rate_limited
- directory_unavailable
- internal_error
message:
type: string
description: One sentence a human can act on.
documentation:
type: string
format: uri
parameter:
type: string
description: On a 400, the parameter at fault.
received:
type: string
description: On a 400, the value that was rejected.
validValues:
type: array
items:
type: string
description: On a 400 caused by an unknown facet value, every value that would have been accepted.
retryAfterSeconds:
type: integer
description: On a 429, how long until the window resets.
example:
error: not_found
message: No studio with the slug "nope" is listed in this directory. It may never have been listed, or it may have been removed.
documentation: https://www.gamedevoutsourcing.com/openapi.json
StudioSearchResult:
type: object
required:
- total
- returned
- capped
- studios
- browseUrl
- appliedFilters
- citation
- caveats
properties:
total:
type: integer
description: How many studios matched in the directory, before the cap. This is the number to quote.
returned:
type: integer
description: How many are in `studios`.
capped:
type: boolean
description: True when `total` exceeds `returned`, i.e. there are matches you have not seen.
studios:
type: array
items:
$ref: '#/components/schemas/StudioSummary'
browseUrl:
type: string
format: uri
description: The page on the site that shows this filter. Where the filter has no single page — a region or a team size, which /browse cannot express — this URL is broader than the result set, never narrower.
appliedFilters:
type: object
additionalProperties:
type: string
description: What was actually understood and applied, plus an `ordering` note describing how the list was sorted. A filter you sent that is missing here was not applied.
citation:
$ref: '#/components/schemas/Citation'
caveats:
$ref: '#/components/schemas/Caveats'
example:
total: 214
returned: 2
capped: true
studios:
- slug: example-studio
name: Example Studio
url: https://www.gamedevoutsourcing.com/company/example-studio
tagline: Stylized 3D character and environment art for PC and console teams
country: Poland
city: Krakow
teamSize: 11-50
yearFounded: 2014
services:
- 3D Art
- Animation
engines:
- Unity
- Unreal Engine
platforms:
- PC
- PlayStation
artStyles:
- Stylized
website: https://example.com
claimed: true
studioConfirmed: false
featured: false
topRanking:
label: 3D Art in Poland
rank: 3
sliceSize: 24
url: https://www.gamedevoutsourcing.com/rankings/3d-art-in-poland
browseUrl: https://www.gamedevoutsourcing.com/services/3d-art
appliedFilters:
service: 3D Art
country: Poland
ordering: Paid listings (Featured, then Promoted) first, then the directory's internal score, then name.
citation: Game Dev Outsourcing, a free directory of game development outsourcing studios (https://www.gamedevoutsourcing.com).
caveats:
- 'These are hand-compiled listings, not vetted or certified suppliers. Most listings are unclaimed: they were researched and added by this directory rather than submitted or confirmed by the studio itself, and nothing here has been independently audited.'
parameters:
StudioSlugPath:
name: slug
in: path
required: true
description: The studio's slug, the last segment of its /company/<slug> profile URL.
schema:
type: string
example: example-studio
RegionFilter:
name: region
in: query
required: false
description: Only studios in this region. Mutually redundant with `country`; when both are given, `country` wins.
schema:
type: string
enum:
- eastern-europe
- western-europe
- asia
- latin-america
- north-america
- middle-east
- oceania
example: eastern-europe
CountryFilter:
name: country
in: query
required: false
description: Only studios recorded in this country. Ignored for the listings that have no country on file.
schema:
type: string
enum:
- ukraine
- poland
- russia
- belarus
- romania
- bulgaria
- czech-republic
- serbia
- croatia
- estonia
- lithuania
- latvia
- united-kingdom
- germany
- france
- spain
- netherlands
- sweden
- finland
- denmark
- portugal
- italy
- china
- india
- vietnam
- philippines
- indonesia
- malaysia
- thailand
- japan
- south-korea
- taiwan
- singapore
- pakistan
- bangladesh
- brazil
- argentina
- mexico
- colombia
- chile
- peru
- uruguay
- united-states
- canada
- israel
- turkey
- uae
- egypt
- south-africa
- nigeria
- australia
- new-zealand
- saudi-arabia
- cyprus
example: poland
ArtStyleFilter:
name: artStyle
in: query
required: false
description: Only studios tagged with this art style.
schema:
type: string
enum:
- REALISTIC
- STYLIZED
- PIXEL_ART
- LOW_POLY
- CARTOON
- ANIME
- HAND_DRAWN
- ABSTRACT
- ISOMETRIC
example: PIXEL_ART
ServiceFilter:
name: service
in: query
required: false
description: Only studios tagged with this service. The display label ("3D Art") and the site slug ("3d-art") are accepted as well as the enum value.
schema:
type: string
enum:
- ART_2D
- ART_3D
- ANIMATION
- PROGRAMMING
- GAME_DESIGN
- AUDIO
- QA_TESTING
- NARRATIVE
- UI_UX
- LOCALIZATION
- MARKETING
- FULL_PRODUCTION
- CO_DEVELOPMENT
- PORTING
example: ART_3D
LimitParam:
name: limit
in: query
required: false
description: How many studios to return. Values above the maximum are clamped rather than rejected; the response says how many came back and whether more matched. There is no offset parameter, so 25 is the most this API will ever hand over in one call.
schema:
type: integer
minimum: 1
maximum: 25
default: 10
example: 5
PlatformFilter:
name: platform
in: query
required: false
description: Only studios tagged with this target platform.
schema:
type: string
enum:
- PC
- PLAYSTATION
- XBOX
- NINTENDO_SWITCH
- MOBILE_IOS
- MOBILE_ANDROID
- WEB
- VR
- AR
example: NINTENDO_SWITCH
EngineFilter:
name: engine
in: query
required: false
description: Only studios tagged with this game engine.
schema:
type: string
enum:
- UNITY
- UNREAL_ENGINE
- GODOT
- CUSTOM
- GAME_MAKER
- COCOS2D
- CRY_ENGINE
- OTHER
example: UNREAL_ENGINE
QueryParam:
name: query
in: query
required: false
description: Free text matched case-insensitively against the studio name, tagline and description. Combines with every other filter.
schema:
type: string
example: pixel art
TeamSizeFilter:
name: teamSize
in: query
required: false
description: Only studios in this headcount bucket. Team size is not recorded for every listing.
schema:
type: string
enum:
- 1-10
- 11-50
- 51-200
- 201-500
- 501-1000
- 1000+
example: 11-50
responses:
DirectoryUnavailable:
description: The directory database could not be reached. Nothing about the directory's contents can be concluded from this response; in particular it does not mean there are no matching studios.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: No such slug in this directory. This is a real absence, not a failed lookup — a lookup that could not be performed answers 503 instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
MethodNotAllowed:
description: This API is read-only. The Allow header lists what is on offer.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: More than 60 requests in a minute from one IP. Retry-After says how long to wait.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: A parameter value is not one this API accepts. The body names the parameter and lists every value that would have worked.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
externalDocs:
description: The directory itself, and the statistics page behind every count in this API.
url: https://www.gamedevoutsourcing.com/game-development-outsourcing-statistics