{"openapi":"3.1.0","info":{"title":"Game Dev Outsourcing Directory 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.\n\nWhat 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 holds no per-studio rate data.\n\nHow 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 the count of shipped game credits recorded here and cannot be moved by payment at all.\n\nWhat 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.\n\nCiting 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"}],"externalDocs":{"description":"The directory itself, and the statistics page behind every count in this API.","url":"https://www.gamedevoutsourcing.com/game-development-outsourcing-statistics"},"tags":[{"name":"Studios","description":"Finding and reading studio listings."},{"name":"Directory","description":"Aggregate counts and the ranking lists."},{"name":"Guidance","description":"Editorial answers and the cost model."},{"name":"Meta","description":"The API index and this document."}],"paths":{"/api/public/v1":{"get":{"operationId":"getApiIndex","tags":["Meta"],"summary":"What this API offers","description":"A machine-readable index of the endpoints, the caps, the licence and the standing caveats. Fetch this first if you arrived without the OpenAPI document.","responses":{"200":{"description":"The index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/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.\n\nAt 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.\n\nResults 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"}}}},"/api/public/v1/statistics":{"get":{"operationId":"getDirectoryStatistics","tags":["Directory"],"summary":"Directory-wide aggregate counts","description":"Totals and distributions over every listing the directory shows: by region, country, service, engine, platform and team size. Service, engine and platform counts overlap, because a studio carries several tags. These are the same numbers the statistics page renders and the open-data downloads publish, recomputed from the live database, so they are the citable figures. Aggregates only — nothing in this payload identifies a company.","responses":{"200":{"description":"The aggregates, with their source page and licence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectoryStatistics"}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/api/public/v1/rankings":{"get":{"operationId":"listRankings","tags":["Directory"],"summary":"List the ranking lists","description":"Every ranking list the directory publishes, with its size. A list exists only where at least ten studios qualify for it. Read `method` before quoting any of them: these lists are the one place on this site where payment cannot move a position, but their order comes from a stored score that tracks how completely a listing is filled in, so a position measures how well documented a studio is here and not how good it is. Never present one as an award or an endorsement.","responses":{"200":{"description":"The lists and the ranking method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingIndex"}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/api/public/v1/rankings/{slug}":{"get":{"operationId":"getRanking","tags":["Directory"],"summary":"Get one ranking list","description":"The published positions in one list. `size` is the whole slice; `ranked` holds only the studios given a public number — the top ten or the top quarter, whichever is smaller. Studios below that cut and studios with no recorded credits are deliberately unnumbered, and unranked means no credits were found here rather than that a studio has none: most outsourcing work ships uncredited.","parameters":[{"$ref":"#/components/parameters/RankingSlugPath"}],"responses":{"200":{"description":"The list and its published positions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ranking"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/api/public/v1/answers":{"get":{"operationId":"listAnswers","tags":["Guidance"],"summary":"List the answer clusters","description":"The directory's editorial answers on buying outsourced game development — choosing a partner, co-development, porting, QA, audio and localization, mobile, full-cycle production and costs.","responses":{"200":{"description":"The clusters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerIndex"}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/api/public/v1/answers/{slug}":{"get":{"operationId":"getAnswer","tags":["Guidance"],"summary":"Get one answer cluster","description":"One cluster as question and answer pairs, each written to stand on its own so a single pair can be quoted without the rest. Sentences that would have carried a live directory count are omitted here rather than frozen at a stale number — use the statistics endpoint for any figure.","parameters":[{"$ref":"#/components/parameters/AnswerSlugPath"}],"responses":{"200":{"description":"The cluster.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Answer"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/api/public/v1/cost-estimate":{"get":{"operationId":"estimateCost","tags":["Guidance"],"summary":"Estimate what a team would cost","description":"Turns a described team into an hourly, monthly and optionally total budget range, from the same rate model as the calculator at /tools/cost-calculator — a buyer who runs both gets the same number.\n\nEach role is written as `discipline:seniority[:count]`, and the parameter repeats: `?role=art_3d:senior:2&role=programming:mid`. A comma-separated single parameter works too. Head count defaults to 1.\n\nThese are the site's published editorial market ranges, not quotes from any studio in this directory, and the directory holds no per-studio rate data. Real prices move with scope, art style and revision rounds.","parameters":[{"name":"role","in":"query","required":true,"description":"One role per entry, as `discipline:seniority[:count]`. Repeat the parameter for each role.","schema":{"type":"array","minItems":1,"items":{"type":"string","pattern":"^[a-z_0-9]+:[a-z]+(:[0-9]+)?$"}},"style":"form","explode":true,"example":["art_3d:senior:2","programming:mid"],"x-role-object":{"$ref":"#/components/schemas/CostRole"}},{"$ref":"#/components/parameters/CostRegionParam"},{"name":"hoursPerWeek","in":"query","required":false,"description":"Hours per person per week. Defaults to 40.","schema":{"type":"number","minimum":1,"maximum":168,"default":40},"example":40},{"name":"weeks","in":"query","required":false,"description":"How many weeks the work runs. Omit it and only hourly and monthly figures come back, with `totalRange` null.","schema":{"type":"number","minimum":1,"maximum":520},"example":12}],"responses":{"200":{"description":"The range, its per-role breakdown, and the assumptions behind it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostEstimate"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/DirectoryUnavailable"}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDocument","tags":["Meta"],"summary":"This document","description":"The OpenAPI 3.1 description of this API. It sits at the site root rather than under /api/ because robots.txt disallows /api/, and this file is meant to be crawled, indexed and linked.","responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object"}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"}}}}},"components":{"parameters":{"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},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"CostRegionParam":{"name":"region","in":"query","required":false,"description":"Where the work would be done. The model places each region inside the published band for every discipline rather than applying a multiplier; omitting it uses the full band, which is wider and more honest than a guess.","schema":{"type":"string","enum":["any","south_southeast_asia","eastern_europe","latin_america","east_asia","western_europe","north_america"],"default":"any"},"example":"eastern_europe"},"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"},"RankingSlugPath":{"name":"slug","in":"path","required":true,"description":"The ranking list's slug, as returned by the rankings index.","schema":{"type":"string"},"example":"3d-art"},"AnswerSlugPath":{"name":"slug","in":"path","required":true,"description":"The answer cluster's slug, as returned by the answers index.","schema":{"type":"string"},"example":"game-outsourcing-costs"}},"responses":{"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"}}}},"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"}}}},"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"}}}}},"schemas":{"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)."},"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 holds no usable per-studio or per-country rate data.","On the /best and /browse lists, paid (Featured and Verified) 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 that tracks how completely a listing is filled in, so they say how well documented a studio is in this directory, not how good it is. Do not present one as a recommendation."]},"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"}},"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"}},"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"}}},"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."},"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 Verified) 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."]}},"LabeledCount":{"type":"object","required":["label","count"],"properties":{"label":{"type":"string"},"count":{"type":"integer","description":"Studios in this bucket."}},"example":{"label":"Eastern Europe","count":118}},"DirectoryStatistics":{"type":"object","required":["totals","byRegion","byCountry","byService","byEngine","byPlatform","byTeamSize","sourceUrl","datasetUrl","license","citation","caveats"],"properties":{"totals":{"type":"object","required":["listedStudios","countries","listingsWithoutCountry","claimedListings"],"properties":{"listedStudios":{"type":"integer","description":"Every listing the directory shows. This is the directory's size."},"countries":{"type":"integer","description":"Distinct countries after alias merging (\"UK\" and \"United Kingdom\" are one)."},"listingsWithoutCountry":{"type":"integer","description":"Listings with no usable country recorded. They are in the totals and in no geographic breakdown, so the country counts sum to less than the total."},"claimedListings":{"type":"integer","description":"Listings the studio manages. The rest were compiled by this directory."}}},"byRegion":{"type":"array","items":{"$ref":"#/components/schemas/LabeledCount"}},"byCountry":{"type":"array","items":{"$ref":"#/components/schemas/LabeledCount"}},"byService":{"type":"array","items":{"$ref":"#/components/schemas/LabeledCount"},"description":"Counts overlap: a studio usually offers several services."},"byEngine":{"type":"array","items":{"$ref":"#/components/schemas/LabeledCount"}},"byPlatform":{"type":"array","items":{"$ref":"#/components/schemas/LabeledCount"}},"byTeamSize":{"type":"array","items":{"$ref":"#/components/schemas/LabeledCount"},"description":"In ladder order, with a \"Not recorded\" bucket rather than a guess."},"sourceUrl":{"type":"string","format":"uri","description":"The human-readable statistics page. Link this when citing a count."},"datasetUrl":{"type":"string","format":"uri","description":"The same aggregates as a JSON download."},"license":{"type":"string"},"citation":{"$ref":"#/components/schemas/Citation"},"caveats":{"$ref":"#/components/schemas/Caveats"}}},"RankingSliceRef":{"type":"object","required":["slug","label","kind","size","url"],"properties":{"slug":{"type":"string"},"label":{"type":"string"},"kind":{"type":"string","description":"What the list is cut by — overall, service, country, service and country, engine, platform or art style."},"size":{"type":"integer","description":"Studios in the list, ranked or not."},"url":{"type":"string","format":"uri"}},"example":{"slug":"3d-art-in-poland","label":"3D Art in Poland","kind":"serviceCountry","size":24,"url":"https://www.gamedevoutsourcing.com/rankings/3d-art-in-poland"}},"RankingIndex":{"type":"object","required":["method","slices","citation"],"properties":{"method":{"type":"string","description":"How every list here is ordered. Quote this alongside any position."},"slices":{"type":"array","items":{"$ref":"#/components/schemas/RankingSliceRef"}},"citation":{"$ref":"#/components/schemas/Citation"}}},"RankedStudio":{"type":"object","required":["rank","name","slug","url"],"properties":{"rank":{"type":"integer","minimum":1},"name":{"type":"string"},"slug":{"type":"string"},"country":{"type":["string","null"],"description":"Canonical country label, or null where none is recorded."},"url":{"type":"string","format":"uri"}},"example":{"rank":1,"name":"Example Studio","slug":"example-studio","country":"Poland","url":"https://www.gamedevoutsourcing.com/company/example-studio"}},"Ranking":{"type":"object","required":["slug","label","url","size","method","ranked","citation","caveats"],"properties":{"slug":{"type":"string"},"label":{"type":"string"},"url":{"type":"string","format":"uri"},"size":{"type":"integer","description":"The whole list. Always larger than `ranked`, which holds only published positions."},"method":{"type":"string"},"ranked":{"type":"array","items":{"$ref":"#/components/schemas/RankedStudio"},"description":"Only the studios given a public number. Nobody is numbered below the cut, so the absence of a studio here is not a low placement."},"citation":{"$ref":"#/components/schemas/Citation"},"caveats":{"$ref":"#/components/schemas/Caveats"}}},"AnswerRef":{"type":"object","required":["slug","title","url","summary"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"summary":{"type":"string"}}},"AnswerIndex":{"type":"object","required":["answers","citation"],"properties":{"answers":{"type":"array","items":{"$ref":"#/components/schemas/AnswerRef"}},"citation":{"$ref":"#/components/schemas/Citation"}}},"Answer":{"type":"object","required":["slug","title","url","qa","relatedUrls","citation","caveats"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"qa":{"type":"array","description":"Question and answer pairs, each written to be quotable on its own.","items":{"type":"object","required":["question","answer"],"properties":{"question":{"type":"string"},"answer":{"type":"string"}}}},"relatedUrls":{"type":"array","items":{"type":"object","required":["label","url"],"properties":{"label":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"citation":{"$ref":"#/components/schemas/Citation"},"caveats":{"$ref":"#/components/schemas/Caveats"}}},"Discipline":{"type":"string","description":"A discipline in the cost model.","enum":["art_2d","art_3d","animation","programming","audio","qa_testing"],"example":"art_3d"},"Seniority":{"type":"string","description":"A seniority band in the cost model.","enum":["entry","mid","senior"],"example":"senior"},"CostRole":{"type":"object","description":"One role on the team. Over HTTP this is written as the string `discipline:seniority[:count]` and the `role` parameter repeats; the MCP tool takes this object directly.","required":["discipline","seniority"],"properties":{"discipline":{"$ref":"#/components/schemas/Discipline"},"seniority":{"$ref":"#/components/schemas/Seniority"},"count":{"type":"integer","minimum":1,"default":1,"description":"How many people of this role and seniority."}},"example":{"discipline":"art_3d","seniority":"senior","count":2}},"MoneyRange":{"type":"object","required":["low","high"],"properties":{"low":{"type":"number"},"high":{"type":"number"}},"example":{"low":250,"high":500}},"CostBreakdownRow":{"type":"object","description":"One role, per person, after the region window has narrowed the band.","required":["discipline","seniority","count","hourlyLow","hourlyHigh"],"properties":{"discipline":{"type":"string"},"seniority":{"type":"string"},"count":{"type":"integer","minimum":1},"hourlyLow":{"type":"number"},"hourlyHigh":{"type":"number"}},"example":{"discipline":"3D Art","seniority":"Senior","count":2,"hourlyLow":110,"hourlyHigh":150}},"CostEstimate":{"type":"object","required":["currency","hourlyRange","monthlyRange","totalRange","breakdown","assumptions","calculatorUrl","citation","caveats"],"properties":{"currency":{"type":"string","enum":["USD"]},"hourlyRange":{"$ref":"#/components/schemas/MoneyRange","description":"Combined hourly cost of the whole team."},"monthlyRange":{"$ref":"#/components/schemas/MoneyRange"},"totalRange":{"oneOf":[{"$ref":"#/components/schemas/MoneyRange"},{"type":"null"}],"description":"Null when no duration was given, rather than a guessed one."},"breakdown":{"type":"array","items":{"$ref":"#/components/schemas/CostBreakdownRow"}},"assumptions":{"type":"array","items":{"type":"string"},"description":"Everything the number rests on, in plain sentences. Reproduce these with the figure — a range quoted without them reads as a quote."},"calculatorUrl":{"type":"string","format":"uri"},"citation":{"$ref":"#/components/schemas/Citation"},"caveats":{"$ref":"#/components/schemas/Caveats"}}},"ApiIndex":{"type":"object","description":"The self-description at the API root.","required":["name","version","description","documentation","endpoints","limits","license","citation","caveats"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"documentation":{"type":"string","format":"uri"},"mcpEndpoint":{"type":"string","format":"uri","description":"The same data over MCP, for clients that speak it."},"website":{"type":"string","format":"uri"},"endpoints":{"type":"array","items":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"}}}},"limits":{"type":"object","properties":{"maxStudiosPerRequest":{"type":"integer"},"defaultStudiosPerRequest":{"type":"integer"},"requestsPerMinutePerIp":{"type":"integer"},"pagination":{"type":"string"},"contactDetails":{"type":"string"}}},"license":{"type":"object","properties":{"name":{"type":"string"},"appliesTo":{"type":"string"},"attribution":{"type":"string"}}},"citation":{"$ref":"#/components/schemas/Citation"},"caveats":{"$ref":"#/components/schemas/Caveats"}}}}}}