{"openapi":"3.0.0","paths":{"/api/public/v1/reference/countries":{"get":{"operationId":"PublicReferenceController_countries","parameters":[{"name":"locale","required":false,"in":"query","description":"Locale for display names (default \"ua\")","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"List countries served by the exchange","tags":["Public · Reference"]}},"/api/public/v1/reference/regions":{"get":{"operationId":"PublicReferenceController_regions","parameters":[{"name":"country","required":true,"in":"query","description":"ISO 3166-1 alpha-2 country code","schema":{"type":"string"}},{"name":"locale","required":false,"in":"query","description":"Locale for display names (default \"ua\")","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"List regions/oblasts for a country","tags":["Public · Reference"]}},"/api/public/v1/reference/car-types":{"get":{"operationId":"PublicReferenceController_carTypes","parameters":[],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Car body types (grouped) — valid `carTypes` codes for a proposal","tags":["Public · Reference"]}},"/api/public/v1/reference/load-types":{"get":{"operationId":"PublicReferenceController_loadTypes","parameters":[],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Loading/unloading types — valid `loadUnloadTypes` codes","tags":["Public · Reference"]}},"/api/public/v1/reference/permits":{"get":{"operationId":"PublicReferenceController_permits","parameters":[],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Transport permit/document types — valid `carPermits` codes","tags":["Public · Reference"]}},"/api/public/v1/reference/currencies":{"get":{"operationId":"PublicReferenceController_currencies","parameters":[],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Supported currencies — valid `currencyType` values","tags":["Public · Reference"]}},"/api/public/v1/reference/payment-types":{"get":{"operationId":"PublicReferenceController_paymentTypes","parameters":[],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Payment forms — valid `paymentType` values","tags":["Public · Reference"]}},"/api/public/v1/localities/search":{"get":{"operationId":"PublicLocalitiesController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Free-text query","schema":{"type":"string"}},{"name":"country","required":false,"in":"query","description":"Restrict to an ISO 3166-1 alpha-2 country code","schema":{"type":"string"}},{"name":"locale","required":false,"in":"query","description":"Locale for display names (default \"ua\")","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Autocomplete search across countries, regions, and localities","tags":["Public · Localities"]}},"/api/public/v1/proposals/cargo":{"post":{"description":"companyId is always resolved from the API key — never from the request body. type is fixed by this route. contactPersonId is optional: if given, it must be the company owner or an ACTIVE employee of the key's company; if omitted, it defaults to the key's owner.","operationId":"PublicMyProposalsController_createCargo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateProposalDto"}}}},"responses":{"201":{"description":"Proposal created"}},"security":[{"ApiKey":[]}],"summary":"Create a CARGO proposal","tags":["Public · My proposals"]}},"/api/public/v1/proposals/transport":{"post":{"description":"companyId is always resolved from the API key — never from the request body. type is fixed by this route. contactPersonId is optional: if given, it must be the company owner or an ACTIVE employee of the key's company; if omitted, it defaults to the key's owner.","operationId":"PublicMyProposalsController_createTransport","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateProposalDto"}}}},"responses":{"201":{"description":"Proposal created"}},"security":[{"ApiKey":[]}],"summary":"Create a TRANSPORT proposal","tags":["Public · My proposals"]}},"/api/public/v1/proposals/batch":{"post":{"description":"Each item is validated and created independently — the response carries a per-item result ({index, status:\"created\", proposal} or {index, status:\"error\", error}). The whole batch consumes N of the daily write quota (not 1); if it would exceed the quota the request is rejected with 429 before creating anything. Combine with an Idempotency-Key for safe retries.","operationId":"PublicMyProposalsController_createBatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBatchCreateDto"}}}},"responses":{"200":{"description":"Per-item batch result"}},"security":[{"ApiKey":[]}],"summary":"Create up to 25 proposals in one request","tags":["Public · My proposals"]}},"/api/public/v1/proposals/my":{"get":{"description":"Scoped via ProposalsService.getMyProposals — never leaks other companies’ proposals.","operationId":"PublicMyProposalsController_listMine","parameters":[{"name":"type","required":false,"in":"query","description":"Filter by proposal type","schema":{"type":"string","enum":["TRANSPORT","CARGO"]}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string","enum":["ACTIVE","INACTIVE"]}},{"name":"limit","required":false,"in":"query","description":"Max rows to return (default 20, capped at 100)","schema":{"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Opaque pagination cursor returned as `nextCursor` from a previous page","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Sort field (default createdAt)","schema":{"type":"string","enum":["createdAt","viewCount"]}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order (default desc)","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Page of the key’s own proposals"}},"security":[{"ApiKey":[]}],"summary":"List the calling key’s own proposals","tags":["Public · My proposals"]}},"/api/public/v1/proposals/{id}":{"patch":{"operationId":"PublicMyProposalsController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateProposalDto"}}}},"responses":{"200":{"description":"Proposal updated"}},"security":[{"ApiKey":[]}],"summary":"Update a proposal","tags":["Public · My proposals"]},"delete":{"operationId":"PublicMyProposalsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal deleted"}},"security":[{"ApiKey":[]}],"summary":"Delete a proposal permanently","tags":["Public · My proposals"]},"get":{"operationId":"PublicSearchController_detail","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal id","schema":{"type":"string"}},{"name":"locale","required":false,"in":"query","description":"Locale for display names (default \"ua\")","schema":{"type":"string"}}],"responses":{"200":{"description":"The matching proposal"}},"security":[{"ApiKey":[]}],"summary":"Get a single proposal by id","tags":["Public · Search"]}},"/api/public/v1/proposals/{id}/bump":{"post":{"description":"Ownership here is narrower than update/delete/archive: only the proposal’s author or contact person may bump it (company owner/manager alone is not enough). May fail with BUMP_NOT_OWNER, BUMP_TOO_SOON, or BUMP_LIMIT_REACHED. These are internal { code, message } exceptions, not public-API error codes — PublicApiExceptionFilter remaps them onto the stable public set: BUMP_NOT_OWNER (ForbiddenException) becomes 403 { error: { code: 'forbidden' } }; BUMP_TOO_SOON and BUMP_LIMIT_REACHED (both BadRequestException) become 400 { error: { code: 'validation_error' } }. The specific reason is always preserved in the envelope’s `message`, never in `code`.","operationId":"PublicMyProposalsController_bump","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal bumped"}},"security":[{"ApiKey":[]}],"summary":"Bump a proposal to the top of search results","tags":["Public · My proposals"]}},"/api/public/v1/proposals/{id}/archive":{"post":{"description":"There is no dedicated archive() in ProposalsService, only toggleStatus() which flips ACTIVE⇄INACTIVE. This route calls ProposalsService.setProposalStatus(id, actorUserId, 'INACTIVE'), which verifies ownership FIRST and only then no-ops if the proposal is already INACTIVE — so a key with no rights over the proposal gets 403 even when it is already in the target state, instead of silently succeeding.","operationId":"PublicMyProposalsController_archive","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal is INACTIVE (already was, or just deactivated)"}},"security":[{"ApiKey":[]}],"summary":"Archive (deactivate) a proposal — idempotent","tags":["Public · My proposals"]}},"/api/public/v1/proposals/{id}/restore":{"post":{"description":"Mirror of /archive: calls ProposalsService.setProposalStatus(id, actorUserId, 'ACTIVE'), which verifies ownership FIRST and only then no-ops if already ACTIVE. Reactivating is a real ProposalsService side effect — it RESETS createdAt and viewCount to 0 (proposals.service.ts toggleStatus/setProposalStatus), the same behavior the web app has today. Bringing a proposal back online consumes an active-proposal slot from the company plan exactly as creating one does, so this returns 400 when the company is at its maxActiveProposals cap. The already-ACTIVE no-op never consumes a slot and stays 200 even at the cap.","operationId":"PublicMyProposalsController_restore","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal is ACTIVE (already was, or just reactivated)"}},"security":[{"ApiKey":[]}],"summary":"Restore (reactivate) a proposal — idempotent","tags":["Public · My proposals"]}},"/api/public/v1/proposals/search":{"get":{"description":"Exchange-wide search (not scoped to the calling key's own company) — filters mirror the web app's search (type, geo, dates, capacity, car types, etc). Contact info is only present when the calling key's plan grants canViewContacts. `limit` is capped at 100 regardless of the requested value.","operationId":"PublicSearchController_search","parameters":[{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["TRANSPORT","CARGO"]}},{"name":"startCountries","required":false,"in":"query","description":"Start Countries (array of country codes)","schema":{"type":"array","items":{"type":"string"}}},{"name":"startRegions","required":false,"in":"query","description":"Start Regions (array of region codes)","schema":{"type":"array","items":{"type":"string"}}},{"name":"startLocalities","required":false,"in":"query","description":"Start Localities (array of OSM IDs)","schema":{"type":"array","items":{"type":"string"}}},{"name":"endCountries","required":false,"in":"query","description":"End Countries (array of country codes)","schema":{"type":"array","items":{"type":"string"}}},{"name":"endRegions","required":false,"in":"query","description":"End Regions (array of region codes)","schema":{"type":"array","items":{"type":"string"}}},{"name":"endLocalities","required":false,"in":"query","description":"End Localities (array of OSM IDs)","schema":{"type":"array","items":{"type":"string"}}},{"name":"dateFrom","required":false,"in":"query","description":"Date From","schema":{"type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Date To","schema":{"type":"string"}},{"name":"minCapacity","required":false,"in":"query","description":"Min Capacity","schema":{"type":"number"}},{"name":"maxCapacity","required":false,"in":"query","description":"Max Capacity","schema":{"type":"number"}},{"name":"minVolume","required":false,"in":"query","description":"Min Volume","schema":{"type":"number"}},{"name":"maxVolume","required":false,"in":"query","description":"Max Volume","schema":{"type":"number"}},{"name":"paymentType","required":false,"in":"query","schema":{"type":"string","enum":["CASH","CASHLESS","MIXED"]}},{"name":"minLength","required":false,"in":"query","description":"Min Length","schema":{"type":"number"}},{"name":"minWidth","required":false,"in":"query","description":"Min Width","schema":{"type":"number"}},{"name":"minHeight","required":false,"in":"query","description":"Min Height","schema":{"type":"number"}},{"name":"carNumber","required":false,"in":"query","description":"Car Number","schema":{"type":"number"}},{"name":"carTypes","required":false,"in":"query","description":"Car Types (array of car body types)","schema":{"type":"array","items":{"type":"string"}}},{"name":"loadUnloadTypes","required":false,"in":"query","description":"Load/Unload Types (e.g. upper, side, back)","schema":{"type":"array","items":{"type":"string"}}},{"name":"carPermits","required":false,"in":"query","description":"Car Permits (e.g. cmr, tir, t1)","schema":{"type":"array","items":{"type":"string"}}},{"name":"includeInactive","required":false,"in":"query","description":"Include inactive (closed) proposals","schema":{"type":"boolean"}},{"name":"locale","required":false,"in":"query","description":"Locale for names (ua, en, etc)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max rows to return (default 20, capped at 100)","schema":{"type":"number"}},{"name":"updatedSince","required":false,"in":"query","description":"ISO timestamp — return only proposals changed at/after it (incremental sync; dedupe by id)","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","description":"Opaque pagination cursor returned as `nextCursor` from a previous page","schema":{"type":"string"}}],"responses":{"200":{"description":"Page of matching proposals"}},"security":[{"ApiKey":[]}],"summary":"Search the whole exchange for cargo/transport proposals","tags":["Public · Search"]}},"/api/public/v1/companies/{id}":{"get":{"operationId":"PublicCompaniesController_company","parameters":[{"name":"id","required":true,"in":"path","description":"Company id","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Get a company profile (name, legal form, rating + reviews summary, contacts)","tags":["Public · Companies"]}},"/api/public/v1/companies/{id}/reviews":{"get":{"operationId":"PublicCompaniesController_reviews_","parameters":[{"name":"id","required":true,"in":"path","description":"Company id","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page (default 1)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Page size (default 10, capped at 50)","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ApiKey":[]}],"summary":"Paginated APPROVED reviews of a company (counterparty reputation)","tags":["Public · Companies"]}},"/api/public/v1/employees":{"get":{"description":"Returns every membership of the company the key belongs to, including PENDING invitations. Use `userId` (not `id`) as a proposal `contactPersonId`.","operationId":"PublicEmployeesController_list","parameters":[],"responses":{"200":{"description":"Company staff"}},"security":[{"ApiKey":[]}],"summary":"List the key's company staff","tags":["Public · Employees"]}},"/api/public/v1/employees/{id}/proposals-count":{"get":{"description":"Useful before deactivating someone — those listings keep pointing at them.","operationId":"PublicEmployeesController_proposalsCount","parameters":[{"name":"id","required":true,"in":"path","description":"Membership id (the `id` field of an employee)","schema":{"type":"string"}}],"responses":{"200":{"description":"Listing count"}},"security":[{"ApiKey":[]}],"summary":"Count the listings an employee is contact person for","tags":["Public · Employees"]}},"/api/public/v1/employees/{id}/status":{"patch":{"description":"DEACTIVATED removes the person's access to the company dashboard — they land on the suspended screen — but only if they have no other ACTIVE employment; it does not block signing in to the platform and does not end an existing session. Their listings stay published and keep pointing at them as contact person — check /employees/{id}/proposals-count first. Idempotent: setting the status an employee already has succeeds and changes nothing.","operationId":"PublicEmployeesController_setStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Membership id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetEmployeeStatusDto"}}}},"responses":{"200":{"description":"Updated employee"}},"security":[{"ApiKey":[]}],"summary":"Activate or deactivate an employee","tags":["Public · Employees"]}},"/api/public/v1/employees/{id}":{"patch":{"description":"The OWNER role cannot be assigned — ownership is not transferable through this API.","operationId":"PublicEmployeesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"Membership id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEmployeeDto"}}}},"responses":{"200":{"description":"Updated employee"}},"security":[{"ApiKey":[]}],"summary":"Change an employee's role or display name","tags":["Public · Employees"]}}},"info":{"title":"SAMO-TRANS Public API","description":"Public REST API for PREMIUM companies. Authenticate with your samo_live_ key as a Bearer token.\n\nGuides (getting started, rate limits, pagination, idempotency, webhooks, error reference): https://samo-trans.com/docs/api","version":"1.1","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"ApiKey":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Use your samo_live_ key as a Bearer token"}},"schemas":{"ProposalLocationInput":{"type":"object","properties":{"type":{"type":"string","description":"Location type: locality, region, or country","enum":["locality","region","country"],"example":"locality"},"osmId":{"type":"string","description":"OSM ID for locality","example":"123456"},"regionCode":{"type":"string","description":"Region code (e.g., UA-59)","example":"UA-59"},"countryCode":{"type":"string","description":"Country code (e.g., UA)","example":"UA"}},"required":["type"]},"PublicCreateProposalDto":{"type":"object","properties":{"startLocations":{"description":"Start locations (multiple allowed)","example":[{"type":"locality","osmId":"3678531"}],"type":"array","items":{"$ref":"#/components/schemas/ProposalLocationInput"}},"endLocations":{"description":"End locations (multiple allowed)","example":[{"type":"country","countryCode":"PL"}],"type":"array","items":{"$ref":"#/components/schemas/ProposalLocationInput"}},"dataLoadStart":{"type":"string","description":"Date when loading starts"},"dataLoadEnd":{"type":"string","description":"Date when loading ends"},"capacity":{"type":"number","description":"Capacity in tons","example":20},"volume":{"type":"number","description":"Volume in m3","example":86},"description":{"type":"string","description":"Description of the proposal"},"price":{"type":"number","description":"Price value"},"currencyType":{"type":"string","enum":["USD","EUR","UAH","PLN"]},"paymentType":{"type":"string","enum":["CASH","CASHLESS","MIXED"]},"priceVat":{"type":"boolean","description":"Price includes VAT"},"priceRequest":{"type":"boolean","description":"Request price"},"priceFor":{"type":"string","description":"Price for (per_km, per_ton, etc)"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"carTypes":{"description":"Car body type codes (see GET /reference/car-types)","type":"array","items":{"type":"string"}},"loadUnloadTypes":{"type":"array","items":{"type":"string"}},"carPermits":{"type":"array","items":{"type":"string"}},"separateCar":{"type":"boolean"},"carNumber":{"type":"number"},"shipperRole":{"type":"string"},"addLoad":{"type":"boolean"},"addLoadPossible":{"type":"boolean"},"contactPersonId":{"type":"string","description":"Contact Person ID (optional, defaults to user)"}},"required":["startLocations","endLocations","dataLoadStart","dataLoadEnd","capacity","description","carTypes"]},"PublicBatchProposalItemDto":{"type":"object","properties":{"startLocations":{"description":"Start locations (multiple allowed)","example":[{"type":"locality","osmId":"3678531"}],"type":"array","items":{"$ref":"#/components/schemas/ProposalLocationInput"}},"endLocations":{"description":"End locations (multiple allowed)","example":[{"type":"country","countryCode":"PL"}],"type":"array","items":{"$ref":"#/components/schemas/ProposalLocationInput"}},"dataLoadStart":{"type":"string","description":"Date when loading starts"},"dataLoadEnd":{"type":"string","description":"Date when loading ends"},"capacity":{"type":"number","description":"Capacity in tons","example":20},"volume":{"type":"number","description":"Volume in m3","example":86},"description":{"type":"string","description":"Description of the proposal"},"price":{"type":"number","description":"Price value"},"currencyType":{"type":"string","enum":["USD","EUR","UAH","PLN"]},"paymentType":{"type":"string","enum":["CASH","CASHLESS","MIXED"]},"priceVat":{"type":"boolean","description":"Price includes VAT"},"priceRequest":{"type":"boolean","description":"Request price"},"priceFor":{"type":"string","description":"Price for (per_km, per_ton, etc)"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"carTypes":{"description":"Car body type codes (see GET /reference/car-types)","type":"array","items":{"type":"string"}},"loadUnloadTypes":{"type":"array","items":{"type":"string"}},"carPermits":{"type":"array","items":{"type":"string"}},"separateCar":{"type":"boolean"},"carNumber":{"type":"number"},"shipperRole":{"type":"string"},"addLoad":{"type":"boolean"},"addLoadPossible":{"type":"boolean"},"contactPersonId":{"type":"string","description":"Contact Person ID (optional, defaults to user)"},"type":{"type":"string","enum":["TRANSPORT","CARGO"],"description":"CARGO or TRANSPORT"}},"required":["startLocations","endLocations","dataLoadStart","dataLoadEnd","capacity","description","carTypes","type"]},"PublicBatchCreateDto":{"type":"object","properties":{"items":{"description":"Between 1 and 25 proposals to create in one request.","type":"array","items":{"$ref":"#/components/schemas/PublicBatchProposalItemDto"}}},"required":["items"]},"PublicUpdateProposalDto":{"type":"object","properties":{"startLocations":{"description":"Start locations (multiple allowed)","example":[{"type":"locality","osmId":"3678531"}],"type":"array","items":{"$ref":"#/components/schemas/ProposalLocationInput"}},"endLocations":{"description":"End locations (multiple allowed)","example":[{"type":"country","countryCode":"PL"}],"type":"array","items":{"$ref":"#/components/schemas/ProposalLocationInput"}},"dataLoadStart":{"type":"string","description":"Date when loading starts"},"dataLoadEnd":{"type":"string","description":"Date when loading ends"},"capacity":{"type":"number","description":"Capacity in tons","example":20},"volume":{"type":"number","description":"Volume in m3","example":86},"description":{"type":"string","description":"Description of the proposal"},"price":{"type":"number","description":"Price value"},"currencyType":{"type":"string","enum":["USD","EUR","UAH","PLN"]},"paymentType":{"type":"string","enum":["CASH","CASHLESS","MIXED"]},"priceVat":{"type":"boolean","description":"Price includes VAT"},"priceRequest":{"type":"boolean","description":"Request price"},"priceFor":{"type":"string","description":"Price for (per_km, per_ton, etc)"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"carTypes":{"description":"Car body type codes (see GET /reference/car-types)","type":"array","items":{"type":"string"}},"loadUnloadTypes":{"type":"array","items":{"type":"string"}},"carPermits":{"type":"array","items":{"type":"string"}},"separateCar":{"type":"boolean"},"carNumber":{"type":"number"},"shipperRole":{"type":"string"},"addLoad":{"type":"boolean"},"addLoadPossible":{"type":"boolean"},"contactPersonId":{"type":"string","description":"Contact Person ID (optional, defaults to user)"},"version":{"type":"number","description":"Current version for optimistic locking"}}},"SetEmployeeStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","DEACTIVATED"],"description":"ACTIVE = grant access; DEACTIVATED = remove access to the company dashboard (only when the person has no other ACTIVE employment) — it does not block signing in to the platform."}},"required":["status"]},"UpdateEmployeeDto":{"type":"object","properties":{"role":{"type":"string","enum":["MANAGER","DRIVER","ACCOUNTANT","DISPATCHER"]},"name":{"type":"string","example":"John Doe"}}}}}}