Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
{"info": {"version": "0.4.5", "description": "This is the documentation for the Cuz Translation API.\n\nThe test link is this: http://cuz-test-dot-cuz-tech.appspot.com\n\n# Pricing Model\n\nFor a complete look at how pricing works in Cuz Translation, refer to\n[this document](https://docs.google.com/document/d/1XecuE66ypPIizv1Jg8i4LAzPWP1A1AZ_IHFPv6ncFWw/).\n\n## Pricing Workflow\n\nThere are two ways to get the price of a job.\n\n- Use the '/jobs/price/' endpoint and specify the job specifications\n without creating the job.\n- Create the job and then use '/jobs/price/' to get the price.\n\nThe following criteria will affect the price of a job:\n\n- Job nature (For document jobs).\n- Source language.\n- Target language.\n- Certification type.\n- Job distance (For on-site jobs).\n\nOn-site jobs and document jobs will have a base price and each of these\nfactors will increase the base price by a factor either specified in\nthe `PriceModel` or the `Nature`'s `multiplier` field.\n\nEach of these factors will have an effect on the score that will be\nmultiplied by the base price of the project. The base price of the\nproject will be different for document translations and on-site\ninterpretations. The base price of a document project will be per word\nbasis, and the base price of an on-site project will be on per-hour\nbasis. The default effect score is 1. And a score of 1 will have no\neffect on the base price.\n\nWhen two languages from different tiers are being translated into one\nanother, the pricing will be based on the higher tier language.\n\n## Document Translation Pricing\n\nTranslation prices depend on the following criteria:\n\n - Nature\n - Language\n - Number of Words/Pages\n - Certification Type\n\nEach nature dictates whether the pricing will be based on page count or\nword count. When word count is used, there's certain limits and each\nlimit defines its own pricing.\n\nFor instance, the per word pricing for a 300 word document can be different\nthan a 1000 word document. These limits are defined with `PriceWordLimit`.\n\nPrice word limit is not affected by the number of words assigned to a\ntranslator.\n\nStripe charge is paid by the translators.\n\nFor some languages, instead of counting the words we will count the\ncharacters. Base price will be different based on the number of words.\n\n### LAO Pricing\n\nLAO projects' price will not be affected by language tiers or nature\nmultipliers. Stripe fee is paid by the company. Commute fee is not\ncalculated for on-site LAO projects.\n\n### Proofreading Translation\n\nIf proofreading is enabled for a project, proofreader does not pay for\nthe stripe charge and the translators only pay for the amount not\nincluding the proofreading price.\n\n## On-Site Project Pricing\n\nThe minimum duration requirement for on-site projects is **2 hours**.\nIf an LAO project is being created then the minimum duration is **1 hour**.\nThe duration will always be rounded up to the next hour. If the\nduration is **2 hours and 15 minutes** then the duration will be saved\nas **3 hours** and the customer will pay for 3 hours.\n\nThe Stripe charge that corresponds to the commute fee is part of the\nproject price.\n\n### Commute Fee\n\nIf distance exceeds 25 kilometers, the commute fee will also include\nthe first 25 kilometers plus the remaining kilometers.\n\nFor example, If the commute is 30 kilometers long the customer pays\n`30 x $0.99` for commute.\n\n## Pricing Flow\n\nThe pricing information is kept in the `price_information` property of\n`Purchase`. When a job is created (Even at the draft stage.), a\n`Purchase` model will be created and the `PriceInformation` will be\ncalculated. When the price information is being calculated, the\neligible promotion will be applied to the pricing. At this stage, the\n`PriceInformation` can lack some information about the pricing and the\nfinal pricing will be available after the translator request is sent.\n\nIf a purchase has already been created, the `price_information` field\nfor that purchase will be updated when any of the following occurs:\n\n - Job's `word_count` changed.\n - Job's `total_duration` changed.\n - Job's `from_language` or 'to_language' changed.\n - Job's `nature` changed.\n - Job's `job_distance` changed.\n - Job's `certification_type` changed.\n\nIn the case that the interpreter does not accept a project request, the\n`PriceInformation`'s `commute_fee` field will be reset because that\ntranslator will no longer belong to the project.\n\n## Notes\n\nIf there's an available `Promotion` for a `Job`, the discount will only\naffect the the commission amount. Any kind of discount comes out of the\ncommission. Transltors still get paid according to the non-discount\nprice. The promotion will be marked as used when the customer sends a\njob request to a translator.\n\n# Payment\n\nFor document projects, the customer's card will be charged when the translator accepts the project. If the card\ncannot be charged for some reason, the customer will not be able to see the job details and the HTTP response\ncode will be 402. The API will attempt to charge the credit card when the customer requests the job details.\nIf the card was successfully charged, nothing will happen.\n\n# Job Creation Flow\n\nIf a customer wants to create a job, s/he firsts creates a draft of the job without a translator. Then using\nthose specifications, you can search for an appropriate translator. As long as the job is not appointed a\ntranslator, the job status will remain as `draft`. When a translator is appointed, the status will become\n`offer`. At this point, the appointed translator **must** accept the job offer withing the required time.\nOtherwise, the job status will become draft again.\n\nWhen creating a document job, you first upload the documents before creating the job. When the job is created,\nyou assign the documents to the job by updating the documents.\n\nIf the translator cannot finish the job at the given end date, s/he can request a delay and if the delay is\naccepted by the customer the job status will become `delayed` but the job will be active. If the job is not\nfinished at the end date, the status will become `failed`.\n\nThe job status change is not controllable from the outside. It will automatically change based on the job\nproperties.\n\n**When the job is accepted by the translator, no details can be changed except the job end date. But to\nchange the job end date, you need to create a delay request and that request MUST be accepted by the customer.**\n\n## Assigning a Translator\n\nTo assign a translator to a job, you must create a `JobRequest`. Using the `JobRequest`, the translator then\nresponds to it. After the job request is accepted, the translator will be assigned to the job and the job status\nwill be active. When a job request is accepted, the average response time of the translator is also updated.\nWhen a job request is sent, the status of the job will be `offer`.\n\n## Uploading a Document\n\nDocument operations are handled in the `/jobs/{job_id}/documents/` endpoint. Documents are uploaded after the\njob draft is created.\n\n## Allowed Actions for Job Statuses\n\n**Draft**\n\n- Delete (Only customers)\n- Edit (Only customers)\n\n**Offer**\n\n- Cancel\n- Accept offer (Only translators)\n\n**Active**\n\n- Delay Job (For translators)\n- ~~Pull back the end date (For customer)~~\n- ~~Translator changing~~\n- Completed request (For translator)\n- View/Upload files (For translator)\n\n**Delayed**\n\nThis is the same as `Active`, it just means that the job was delayed.\n\n**Failed**\n\nNo action is possible here. When a job has failed, it is locked.\n\n## Deleting A Job\n\nA job can only be deleted If its status is `draft`, `invalid`. If the job is active, it cannot be deleted. If\nthe job is completed deleting it will only archive it.\n\nA translator cannot delete a job but can archive a completed one.\n\n## Completing A Job\n\nWhen the translator uploads the appropriate files, s/he can send a job completed request. You cannot send a\njob completed request If the translator's document count is 0, or the number of translator files and customer\nfiles does not match. After the job completed request is sent, the job status will be `completed_request_sent`.\n\nAfter a job is completed, the user cannot make any changes to it.\n\n# Language Codes\n\nThroughout the API, **ISO 639-1** standart is used for the language codes.\nWhen a language is spoken in multiple countries, the contry code is suffixed at the end.\n\n# Push Notifications\n\nCuz Translation API uses Firebase to deliver push notifications to the users. Each endpoint that will send a\npush notification is defined here and you can also find additional information about the notification for\nthat endpoint.\n\n**Note**\n\nFor some reason, data messages are converted to string. Even the integer fields. So expect a string instead\nof an integer.\n\nHere's a list of scenarios where a push notification can be expected:\n\n| Description | Value | Receiver |\n|------------------------------------------------------|-------|-------------------------|\n| Job Request is received. | 1 | Translator |\n| Job request is approved. | 2 | Customer |\n| Job request is denied. | 3 | Customer |\n| Job failed. | 4 | Customer and Translator |\n| Complete request is received. | 5 | Customer |\n| Complete request is denied by the customer. | 6 | Translator |\n| Complete request is approved by the customer. | 7 | Translator |\n| Delay request received. | 8 | Customer, Translator |\n| Delay request is denied. | 9 | Customer, Translator |\n| Delay request is approved. | 10 | Customer, Translator |\n| Translator payout status changed. | 11 | Translator |\n| Translator approved. | 12 | Translator |\n| Translator uploaded document to the project. | 13 | Customer |\n| Job request is canceled by the customer. | 14 | Translator |\n| Job request is expired. | 15 | Translator, Customer |\n| Translator request was declined. | 16 | Translator |\n| Document progress is updated or it is completed. | 17 | Customer |\n| Translator should send a progress report. | 18 | Translator |\n| Proofreader can now start proofreading. | 19 | Proofreader, Customer |\n| Proofreader uploaded a document to the project. | 20 | Customer |\n\nThe general format of the notification can be found in the definitions. The message size limit is 4 KB,\nset by Firebase.\n\n# Date Handling\n\nAll the dates are in UTC and in ISO 8601 format.\n\n# API Headers\n\n## Accept\n\n`Accept` header versioning is used for the API. So you need to include the version you want to\nuse when making a request.\nA request **MUST** have the following `Accept` header: `Accept: application/json; version=VERSION_NUMBER`\n\n## Content-Type\n\nEvery request will be made with `JSON` format so the header is `Content-Type: application/json`.\n\n## Authorization\n\nJava Script Web Token is used for authorization.\n\n**Header**: `Authorization: JWT <YOUR_TOKEN_KEY>`\n\n## User-Agent\n\n`User-Agent` header is used to store the device that was used to send the\nrequest. Browser include this automatically, so the web app doesn't have to\ndo anything. The native apps will have to include the `User-Agent`.\n\nSsee [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent)\nfor `User-Agent`.,\n\nTo get the platform, the apps must pass the `User-Agent` header having\nthe substring ` <platform> app ` in there (with spaces around).\n\nFor example:\n\n- `Linux; Android 6.0.1; Nexus 6P Build/MMB29P) Android app (CUZ)`\n- `<something> ios app <some_other_thing>`\n\n# Error Codes\n\nAppropriate HTTP codes are used to convey the error. But, sometimes, If appropriate these error codes are\nused to provide more information.\n\n| Name | Value | Description |\n|-----------------------------------|-------|------------------------------------------------------------------|\n| unknown | -1 | The error is unknown |\n| user_not_exist | 10 | The user with the given ID doesn't exist. |\n| request_not_exist | 11 | The request with the given ID doesn't exist. |\n| not_authorized_for_action | 12 | User doesn't access action. |\n| parameter_error | 13 | A parameter error occurred. Check the `parameters` key |\n| unsupported_version | 14 | Accept header contains an unsupported version |\n| request_already_answered | 15 | The request has already been answered. |\n| already_exists | 16 | An item that's already in the database is added again. |\n| account_disabled | 17 | The category type with the given ID doesn't exist. |\n| invalid_data | 18 | The provided data is not valid. |\n| system_manager_not_exits | 19 | The system manager with the given ID doesn't exist. |\n| supervisor_not_exits | 20 | The supervisor with the given ID doesn't exist. |\n| session_not_exist | 21 | The session with the given ID doesn't exist. |\n| translator_not_exist | 22 | The translator with the given ID doesn't exist. |\n| job_not_exists | 23 | The job with the given ID doesn't exist. |\n| completed_request_not_exits | 24 | The completed request with the given ID doesn't exist. |\n| delayed_request_not_exits | 25 | The delayed request with the given ID doesn't exist. |\n| admin_does_not_exist | 26 | The admin with the given ID doesn't exist. |\n| job_already_answered | 27 | The job has already been answered. |\n| file_not_exist | 28 | The file with the given ID doesn't exist. |\n| nature_not_exist | 29 | The nature with the given ID doesn't exist. |\n| translator_rating_not_exist | 30 | The translator rating with the given ID doesn't exist. |\n| job_price_not_exist | 31 | The translation price with the given ID doesn't exist. |\n| missing_token | 32 | The token is missing from the headers. |\n| invalid_token | 33 | The provided token is not valid. |\n| insufficient_permissions | 34 | User doesn't have the permission to complete the action |\n| job_cannot_be_changed | 35 | Because the job status is not `offer` or `draft` |\n| job_cannot_be_deleted | 36 | Job cannot be deleted because the job status does not allow it. |\n| job_request_not_exist | 37 | Job request for the authenticated user does not exist. |\n| job_already_active | 38 | Job is already active and has a translator. |\n| job_document_not_exist | 39 | A job document with the given ID cannot be found. |\n| job_document_cannot_be_deleted | 40 | Because the job is finished or active. |\n| country_no_exist | 41 | The country doesn't exist. |\n| city_no_exist (Deprecated) | 42 | The city doesn't exist. |\n| province_no_exist | 43 | The province doesn't exist. |\n| job_request_expired | 44 | The job request has expired and cannot be updated. |\n| status_not_valid_complete_request | 45 | Job complete cannot be sent, the job is still active. |\n| translator_document_not_exist | 46 | Job complete cannot be sent, translator did not upload any files.|\n| job_already_completed | 48 | A user is trying to edit an already completed job. |\n| status_not_valid_delay_request | 49 | Job delay request cannot be sent because the job is not active. |\n| user_cant_delay_request | 50 | The authenticated user cannot send a delay request for the job. |\n| live_job_is_not_completed | 51 | Job is not completed yet. So cannot send a completed request. |\n| job_status_not_valid_rating | 52 | The job must be completed before a rating can be submitted. |\n| rating_already_exists | 53 | A rating for this job was already submitted. |\n| incorrect_credentials | 54 | Incorrect credentials. |\n| bank_account_not_found | 55 | Bank account with the given ID cannot be found |\n| bank_account_payouts_done | 56 | Bank account cannot be deleted, payouts done to this account. |\n| address_required | 57 | The user has not set an address for the account. |\n| payment_method_stripe_error | 58 | Stripe error ocurred when creating the payment method. |\n| stripe_error | 59 | The general Stripe error ocurred. See the details in the logs. |\n| payment_required | 60 | Customer does not have any payment methods. |\n| stripe_card_error | 61 | A card error ocurred while charging the customer. |\n| must_have_default_payment_method | 62 | The user must have at least one payment method. |\n| cannot_auto_assign_translator | 63 | Cannot find a translator to auto assign. |\n| referral_not_found | 64 | Referral code cannot be found. |\n| referral_not_valid | 65 | Referral code is found but is not usable by the customer. |\n| referral_unknown_error | 66 | Unhandled error ocurred. Status errors show more information. |\n| delivery_required | 67 | Delivery must be created for the job. |\n| customer_cannot_be_translator | 68 | A customer cannot create a translator profile. |\n\n- **delivery_required**\n + **code**: 67\n + **descritption**: The job needs to have a document delivery before\n creating a job request.\n\n# HTTP Codes\n\nEvery request to the API returns an appropriate HTTP response code along with an error message and a special\nerror code If the request resulted in an error. You can check the HTTP codes [here](https://httpstatuses.com/)\n\n## HTTP 401 vs HTTP 403\n\nFor a clean explanation, see [here](http://www.dirv.me/blog/2011/07/18/understanding-403-forbidden/index.html).\n\n> In summary, a 401 Unauthorized response should be used for missing or bad authentication, and a 403\n Forbidden response should be used afterwards, when the user is authenticated but isn't authorized to\n perform the requested operation on the given resource.\n\n# Fields\n\nAny field that is marked as `char` cannot be null. If a char value does not exist, the default empty value will\nbe an empty string.\n\n# Changelog\n\n## v0.4.7\n\n- [NEW] Project link is added to all customer emails.\n- Country codes are saved in lower case for CountryCurrency.\n\n## v0.4.6\n\n- [NEW] Integrate the new word counting microservice.\n- [FIX] Fix some bugs with EmailComposer.\n\n## v0.4.5\n\n- [NEW] Use Google Cloud Error Reporting to replace `logging.error`.\n- [NEW] Add a button to job admin panel to export the invoice for the\njob.\n- [NEW] Send our custom invoice to the customer If they have a billing\nmethod. Otherwise Stripe's invoice will be sent.\n\n## v0.4.4\n\n- [NEW] Added BillingMethod to control the payment cycle and disable\npayment methods for certain accounts.\n\n## v0.4.3\n\n- [NEW] Is BDR and assigned BDR fields are introduced to keep track of\nwhich BDR is assigned to which customer. This will be extended upon to\nadd custom notification et cetera for the assigned BDR.\n- [IMPROVEMENT] Improved the job listing page to provide more\ninformation about the jobs that are being listed.\n- [FIX] The discount comes off from the price instead of the total now.\n- [FIX] The service charge is removed from the emails\n\n## v0.4.2\n\n- [NEW] Add readonly access to some of the GET endpoints. The last\nremaining piece is the pricing.\n- Various other fixes.\n\n## v0.4.1\n\n- [NEW] Added `EmailRule` to subscribe to an email type. Using this,\nthe admins can subscribe to certain emails that go out to as the result\nof a certain event. For example, one admin can decide that she wants to\nreceive an email when a customer receives a completion request. Even\nthough that's not a default email that the admins receive.\n- [NEW] The admin emails for a job created now contains the referral\ncode if it was used.\n\n## v0.4.0\n\n- [NEW] Changed all the translator related fields in price models so that\nwe can set a payout instead of a commission percentage.\n\n## v0.3.9\n\n- [NEW] Implemented Rush Hour Rate. When the selected end date is within\na specified duration, we can apply additional price to the project.\n\n## v0.3.8\n\n- [IMPROVEMENT] Added the ability to archieve natures and nature groups.\nUsing this, we'll be able to retire certain natures without deleting\nthem, which is important because some other jobs might be still using\nit.\n\n## v0.3.7\n\n- [IMPROVEMENTS] Changes to language pair to enable addition/deletion.\n- [NEW] `over_the_phone` field is added.\n\n## v0.3.6\n\n- [NEW] JobCertification and JobCertificationPriceModel is added.\n- [REMOVED] NaturePrice and FixedDocument models have been removed. Also,\nremoved the unused fields from the `PriceModel`.\n- [FIX] Re-added payout information to emails.\n- [CHANGE] Removed 2 hour limit for LAO projects.\n- [NEW] Added tests for admin panel.\n- [NEW] Added HST number field to translator.\n- [NEW] Added a way to register translators from a CSV file. This is also\nadded to the admin panel at `admin-panel/api/translator/csv-import/`.\n- [IMPROVEMENT] Reyhan's changes to email templates have been added.\n\n## v0.3.5\n\n- [IMPROVEMENT] Admins are emailed If a customer registers and does not\ncreate a job within 2 hours.\n\n## v0.3.4\n\n- [IMPROVEMENT] Various improvements to the code base and tests.\n- [NEW] Added a new filed to job model, `note_to_cuz`, that the customers\n can use to drop notes only for us to see.\n\n## v0.3.3\n\n- [NEW] Added explicit usage limit to promotion.\n\n## v0.3.2\n\n- [NEW] Added support for source and target langauge for translators.\n- [NEW] Added support for referral codes. Promotions can be assigned\n to referral codes for discounts. Every user gets a referral code of\n their own. But we can also create internal referral codes for sales\n people to give around.\n- [IMPROVEMENT] Completion and delay requests can now be canceled using\n `is_cancelled` parameter.\n- [FIX] Changes to certification type in the admin panel now updates\n the job price.\n\n## v0.3.1\n\n- [NEW] Added `RequestMetadata` model and middleware to track where the\n requests are coming from. `User-Agent` is used to store the device\n information along with the user.\n\n## v0.3.0-fix.1\n\n- [UPDATE] Stripe library is updated to v2.32.1.\n- [FIX] TranslatorQueue is only active for debug builds.\n\n## v0.3.0\n\nThis is a fix release. No major changes.\n\n- [FIX] Remove default assignment from certification type. This fixes the\n price calculation for affidavit.\n- [UPDATE] Updated translator email strings for project completion.\n\n## v0.2.9\n\n- [FIX] Fixed a bug where deadline notification was sent even for completed\nor completion offer sent jobs.\n- [NEW] Added notification for when user changes her password.\n- [NEW] Translator dashboard is updated.\n\n## v0.2.8\n\n- **[NEW]**: Added a `NaturePrice` model to override pricing. If we need\nto set a different price for certain natures, we can create a `NaturePrice`\nand assign to the said nature. And when the customer selects that nature,\nthe overriden price will be used instead of the regular one.\n\n## 0.2.7\n\n- [NEW] Replaced the `Purchase.price_information` field with a new model:\n `PriceInformation`. This can be used to add a custom discount in the\n admin panel. This change is backwards compatible.\n\n## 0.2.6\n\n- [IMPROVEMENT] Improved the tests for user, user profile, and jobs.\n- [IMPROVEMENT] Changed the way UserProfile is created. full_clean() is\n now required for `User` model.\n- [IMPROVEMENT] Adde scheduled emails for when a customer has not compelted\n registration, created a job and kept it as draft for too long, or was\n in active for a while.\n- [IMPROVEMENT] Emails now use Quicksand font.\n- [BUGFIX] Fixed a bug where HTTP 500 was ocurring when there was more\n than 3 active temporary passwords. Now it returns `HTTP 429` for\n too many requests.\n\n## 0.2.5\n\n- [IMPROVEMENT] Emails are improved and fully tested.\n\n## 0.2.4-fix.1\n\n- [BUGFIX] Fix an error that caused all customers to receive admin emails.\n\n## 0.2.4\n\n- [NEW] CuzCompanyInfo model is added to keep company specific\n information that is used to populate emails.\n- [CHANGE] Added the renewd email templates and implemented a better\n system for email composition. In the future, we should design a dynamic\n system that hooks up to certain events for sending emails. We should not be\n making any code change to send emails.\n- [NEW] Added `receive_admin_emails` field to `User` model that determines\n If admins receive emails. This should be changed in the future to something\n similar to subcription. So that admins can subscribe to certain events and receive\n notifications about it. This is only a temporary solution.\n\n## 0.2.3\n\n- [TEMP] If the job request is sent to `translators@cuztranslation.com`\ndo not send a cancellation/expiration email to customer. This is meant as a\ntemporary solution.\n- [CHANGE] When a job request is canceled, it no longer creates a new\ntranslator queue.\n\n## 0.2.2\n\n- [BUGFIX] A missing status is added to `Purchase` status choices.\n- [CHANGE] Numbers now count as words.\n\n## 0.2.1\n\n- Added affidavit options and pricing.\n- Added an exception to charging users. If the user has `api.change_purchase` permission,\nthey will not be seeing the payment method errors. This should change to have a permission\nof its own in later releases.\n\n## 0.2.0\n\n- Added affidavit options and pricing.\n- Added job document types.\n- Added support for calculating scanned documents.\n\n## 0.1.9-fix.5\n\n- Use the user's timezone when sending emails that contain dates.\n\n## 0.1.9-fix.4\n\n- Add an option to set a translator as unavailable.\n- Fix the document expiration date problem.\n\n## 0.1.9-fix.3\n\n- Stripe charges has to be minimum 0.50.\n- Updated email templates.\n- Removed magic link login code.\n\n## 0.1.9\n\n### New\n\n- Added LAO project support. `is_lao_project` field is added to `Job` model and `available_for_lao` field is\nadded to `Translator`.\n + When listing translators for a job, If the job is an LAO project, only translators who are available\n for LAO projects will be listed.\n\n## 0.1.8-fix.5\n\n- Fixed an isse where the document URLs were not resigned when expired.\n\n## 0.1.8\n\nThis version breaks all the previous versions. That's why I removed them from the available versions.\n\n- Job's fields have changed. Check out the documentation for the complete new list.\n + Instead of `has_(delay|job|completed)_request` field, we now have\n `active_(delay|job|completed)_request_count` fields.\n- Translator queue is added. `translator_queue` is attached to the job.\n- `proofreaders` is added to the `Job`.\n- `payout` field in `Job` refers to the payout for the authenticated user. Otherwise it is `null`.\n- Changed rating update URL from `/translator-ratings/{rating_id}/` to `/translators/ratings/{rating_id}/`.\n The old URL will keep working until v2.0.\n\n### New\n\n- Added `status` field to `JobDocument`.\n- Added `/register/` endpoint.\n- From now on, magic link system is deprecated and only available to the older versions of the API. Magic\n link will be discontinued with v0.2.\n- When logging in using email only, a temporary password is sent to the user's email address.\n- Added `/jobs/{job_id}/documents/export/` endpoint.\n\n### Deprecated\n\n- Deprecated the `/users/{user_profile_id}/password/` endpoint. Use `/users/password/` instead.\n\n## 0.1.7\n\n- `JobSummarySerializer`s fields have been significantly changed. All of the related fields are removed from the\nlist. For API requests that are using previous versions, the old serializer will be used. With v0.1.9, the old\nserializer will be removed.\n- `jobs/documents/(?P<file_id>[0-9]+)/delete/` endpoint is deprecated. It will be removed with `v0.2`\n- `jobs/documents/upload/` endpoint is deprecated. It will be removed with `v0.2`\n- Added `stripe_decline_code` key to Stripe error reporting.\n- Increased the versions for the Python libraries.\n\n## 0.1.6.1\n\n- Deprecated the `City` model. Use the `city_name` field of `Address`.\n\n## 0.1.6\n\n- Added video interpretation support.\n- New fields are added to the `Job` model.\n + `video_chat_accounts`\n + `video_caller`\n + A new job type is added `video`.\n- New fields are added to `Translator` model.\n + `live_job_video_average_response`\n + `video_chat_accounts`\n + `available_for_live_video_job`\n + `completed_video_live_jobs_count`\n\n## 0.1.5.9\n\n- Added support for `.xmb`, `.xlf`, `.xliff`, `.po` file types.\n\n## 0.1.5.8\n\n- `/translator/certificates/new/` is moved to `/translator/certificates/`. The old endpoint is still accessible\n but it will be removed in `v0.1.6`.\n- `years_of_experience` is added to the `TranslatorCreateSerializer`.\n- Fixed document pricing is added. `Nature`s have a `fixed_document` field now. If a nature has that field, only\n the ATIO translators will be listed.\n\n## 0.1.5.7\n\n- List the translators based on their experience.\n\n## 0.1.5.6\n\n- Added the new pricing model.\n- `PriceWordLimit` is used to calculate the translation price now.\n\n## 0.1.5.5\n\nThis is a backwards compatible release.\n\n- Changed the price model to the newest version.\n- Added a profile_rating field to Translator.\n- Fixed an issue where the user got back the token in the response payload on mobile devices.\n- Customer is charged when the translator accepts the job request. And any error will be handled when the\n customer is viewing the job details.\n\n## 0.1.5\n\n- You should now determine what group type of nature groups you want to get when listing the nature groups.\n- The `user` object in the user profile detail and summary endpoints have been moved insode the main dictionary.\n So instead of this `{\"profile\": {\"user\": {\"first_name\": \"First Name\"}}}` You will now get the following\n `{\"profile\": {\"first_name\": \"First Name\"}}`\n- A job request cannot be created If the customer does not have any payment requests.\n- Payment methods endpoint is added.\n- BankAccount endpoint is added.\n\n### User URL Changes\n\n- `/users/{user_profile_id}/delete/` is moved to `/users/{user_profile_id}/`\n- `/users/{user_profile_id}/edit/` is moved to `/users/{user_profile_id}/`\n- `/user-profile/` is moved to `/user/`\n\n### Job Completed Request URL Changes\n\n- Job completed request endpoint is moved to `/jobs/{job_id}/completed-requests/` and\n `/jobs/{job_id}/completed-requests/{request_id}/`\n\n### Job Delay Request URLs\n\nThese changes does not break the existing apps. The URLs before keeps working but the old ones will be removed\nin `v0.1.5.5`.\n\n- `jobs/(?P<job_id>[0-9]+)/delay-requests/new/` is changed to `jobs/delay-requests/`.\n\n### Job\n\n- `/jobs/{job_id}/update/` is moved to `/jobs/{job_id}/`\n- `/jobs/{job_id}/delete/` is moved to `/jobs/{job_id}/`\n- `/jobs/{job_id}/new/` is moved to `/jobs/`\n\n### Job Request\n\n- `/job-requests/new/` is moved to `/jobs/requests/`\n- `/job-requests/` is moved to `/jobs/requests/`\n- `/job-requests/update/` is moved to `/jobs/requests/{request_id}`\n- `/check-job-request/` is moved to `/jobs/requests/check/`\n- `/job-requests/decline-reasons/` is moved to `/jobs/requests/decline-reasons/`\n\n## 0.1.4\n\n- Starting with this version, the login URL schema for Android is `https://cuz-tech.appspot.com`\n\n## 0.1.3\n\nThis version does not require an update to the apps.\n\n- From now on the API versions will not contain the `v` prefix. The old versions are still valid but they will\nnot be valid starting with the version `0.1.5`.\n- Android magic links will also have an expiration date.\n\n## 0.1.2\n\n- Related name for `UserProfile` is changed to `user_profile` from `userprofile` on the `UserProfile` model.\n\n## 0.1.1\n\n- `NatureGroup` model is created.\n- `Nature` is now related to `NatureGroup`.\n- Translator profile accepts `NatureGroup` instead of `Nature`.\n", "title": "Cuz Translation API"}, "paths": {"/countries/": {"get": {"responses": {"200": {"description": "Returns the list of countries", "schema": {"type": "object", "properties": {"countries": {"items": {"$ref": "#/definitions/Country"}, "type": "array"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Country", "ReadonlyAccess"], "description": "This endpoint is used to list the countries in the database.\n\nAny user type can access this endpoint, but they must be\nauthenenticated.\n", "summary": "List Countries"}}, "/translator-profile/education-history/{education_id}/": {"put": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"education": {"$ref": "#/definitions/Education"}, "upload_url": {"format": "url", "type": "string", "example": "https://storage.google.com/upload-url", "description": "The document must be uploaded to this URL by the client.\nIf a document is not supposed to be uploaded, this field\nwill be an empty string.\n"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "You can update each field of an education history entry.\n\n# Uploading a New File\n\nIf you want to change the uploaded file, you need to provide all of\nthe following fields:\n\n - `original_file_name`\n - `content_type`\n - `file_checksum`\n - `file_size`\n\nIf any of those fields are changed, all of them has to change. And a\nnew upload url will be provided. The status will also be set to\n`NULL`.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "education_id"}, {"required": true, "in": "body", "name": "payload", "schema": {"$ref": "#/definitions/Education"}}], "tags": ["Translator Profile"], "summary": "Update Education History Entry"}, "delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted address.", "schema": {"type": "object", "properties": {"education": {"$ref": "#/definitions/Education"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Delete an education entry from the education history.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "education_id"}], "tags": ["Translator Profile"], "summary": "Delete Education History"}}, "/jobs/requests/check/": {"post": {"description": "This endpoint is scheduled, so you don't have to manually call this.\n\nThe given job request will be checked and if it was not responded, a\nnew push notification\nwill be scheduled. New push notifications will be scheduled by\ndividing the urgency\nduration of the job into 3. And in the last 5 minutes, a push\nnotification will be sent every minute.\n\nIf the job request was reponsed, we will do nothing. If the job has\nexpired, it will mark it as expired and will send a notification\nsaying that the translator lost the project. The customer will also\nbe notified.\n\nWhen the job request is created, the following push notification is\nsent to the translator. `target_user` is the user who will receive\nthe notification.\n\n```\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 1,\n \"target_user\": 3\n }\n}\n```\n", "parameters": [{"in": "body", "name": "body", "schema": {"type": "object", "properties": {"request_id": {"type": "integer", "description": "The request ID to check.", "example": 2}}}}], "tags": ["Job Request"], "summary": "Job Request Status Check", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response"}}}}, "/translator-profile/addresses/{address_id}/": {"put": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"translator_address": {"$ref": "#/definitions/TranslatorAddress"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The address have not been added yet.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the contact address of the translator. The contact address\nis added after the translator registration is initialized. So, If\nyou have not added the address, this endpoint will return `HTTP 404`.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "address_id"}, {"required": true, "type": "object", "name": "payload", "in": "body", "schema": {"$ref": "#/definitions/TranslatorAddress"}}], "tags": ["Translator Profile"], "summary": "Update Translator Address"}, "delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted address.", "schema": {"type": "object", "properties": {"translator_address": {"$ref": "#/definitions/TranslatorAddress"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the contact address of the translator. The contact address\nis added after the translator registration is initialized. So, If\nyou have not added the address, this endpoint will return `HTTP 404`.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "address_id"}], "tags": ["Translator Profile"], "summary": "Delete Translator Address"}}, "/language-services/": {"get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"language_services": {"items": {"$ref": "#/definitions/LanguageService"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the list of language services that we, as a company, provide.\nThese services will then have to be added to translator profiles.\n", "parameters": [{"required": false, "in": "query", "example": "INTERPRETATION", "name": "service_type"}], "tags": ["Translator Profile", "ReadonlyAccess"], "summary": "List Language Services"}}, "/jobs/documents/{document_id}/progress-reports/": {"get": {"description": "Lists the progress reports for this document.\n", "parameters": [{"required": true, "type": "integer", "example": 3, "in": "path", "name": "document_id"}], "tags": ["Progress Report"], "summary": "List a Progress Reports", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"progress_reports": {"items": {"$ref": "#/definitions/ProgressReport"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access here. Or the document does not belong\nto the authenticated translator.\n", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Document does not exist.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/language-services/{service_id}/": {"delete": {"responses": {"200": {"description": "Succesful response. Returns removed resource.", "schema": {"type": "object", "properties": {"language_service": {"items": {"$ref": "#/definitions/LanguageService"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Remove a language service from the translator.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "service_id"}], "tags": ["Translator Profile"], "summary": "Remove A Language Service From Translator"}}, "/courses/": {"get": {"responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"courses": {"items": {"$ref": "#/definitions/Course"}, "type": "array"}}}}, "401": {"description": "The user is not authenenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the list of courses. Pagination is not available, so this endpoint, for now, will return every\ncourse that is available in the database.\n\nAny authenticated user can access here.\n", "tags": ["Course"], "security": [{"apiKey": []}], "summary": "List Courses"}}, "/translator-profile/references/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"reference": {"$ref": "#/definitions/TranslatorReference"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Add a reference to translator. There can be as many reference as you\nwant.\n\nWhen adding a reference, the translator must be providing language\nservice for the given `service_type`, so you need to add the language\nservices before you can use this endpoint.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"$ref": "#/definitions/TranslatorReference"}}], "tags": ["Translator Profile"], "summary": "Add a Reference"}, "get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"references": {"items": {"$ref": "#/definitions/TranslatorReference"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Translator Profile"], "description": "Lists the references for the translator.\n", "summary": "List References"}}, "/user/": {"put": {"description": "No parameter is required here. You just need to include the ones that\nyou want updated. Only admins and the profile owner can update user.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/UserProfileUpdate"}}], "tags": ["User Profile"], "summary": "Update User Profile", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "User not modified."}, "403": {"description": "Only admins and the user can update user.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "User not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"profile": {"$ref": "#/definitions/UserProfile"}}}}}}, "get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"profile": {"$ref": "#/definitions/UserProfile"}}}}, "401": {"description": "User is not authorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only users can reach this endpoint", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the information for the authenticated user. Customer can get\ntheir details from here too.\n", "tags": ["User Profile"], "security": [{"apiKey": []}], "summary": "Get Authenticated User Profile"}}, "/lao-certifications/": {"post": {"description": "Create an LAO certification for the authenticated user. There can only be one\ncertification with the same number.\n", "parameters": [{"required": true, "type": "object", "name": "body", "in": "body", "schema": {"$ref": "#/definitions/LAOCertification"}}], "tags": ["LAOCertification"], "summary": "Create LAO Certification", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"lao_certification": {"$ref": "#/definitions/LAOCertification"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"responses": {"200": {"description": "Successful response.", "schema": {"properties": {"lao_certifications": {"items": {"$ref": "#/definitions/LAOCertification"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the list of LAO certifications that the authenticated user has.\n", "tags": ["LAOCertification"], "security": [{"apiKey": []}], "summary": "List LAO Certifications"}}, "/jobs/documents/": {"post": {"description": "Using this endpoint, you create the `JobDocument` model and in return\nan upload link is returned so the client can upload the file directly\nto Google Cloud Storage. After the client uplods the document, the\ndocument's status must be set to `calculating` to start the word\ncount process.\n\nWord calculation will start after the file is marked as `calculating`.\nWord calculation is done in another service, once it's done the status\nof the document will be `n/a` for customers and `draft` for\ntranslators/proofreaders.\n\nThe owner of the file will be the person who uploaded it. Naturally,\nthe job with the given ID must exist for this operation to succeed.\n\nIf the word count of the document cannot be calculated, the word count\nis returned 0. In which case, the client should ask the customer to\ndelete the document and upload a correct one.\n\nIf the authenticated user is a customer the document is not assigned\nto a job at this stage. You need to update the files when the job is\ncreated. But If you are uploading a file for an already created job,\nyou can set the job ID here.\n\n**If the job's status is `completed` or `completed_request_sent`,\nthis will return `HTTP 304` because completed jobs cannot be\nchanged.**\n\n# Supported Files\n\n- image/*\n- txt\n- pdf\n- xmb\n- xliff/xlf\n- ts\n- po\n\nFor the translation files (e.g ts, po), the texts that were previsouly\ntranslated do not count into the word count.\n\n# Word Count vs Character Count\n\nFor the following languages, we count characters.\n\n - Chinese\n - Japanese\n - Korean\n\n# Word Count Status\n\nAfter the document is uploaded, the word count calculation is done in\nthe background. You can use status check endpoint to check If the\nword count calculation is done. You should send a request every\nsecond or so to check for the progress.\n\n# Push Notification\n\nWhen the translator uploads a file to the job, the following push\nnotification is sent to the translator. `target_user` is the user who\nwill receive the notification.\n\n```json\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 10,\n \"target_user\": 3\n }\n}\n```\n\n# Requests From Browsers\n\nGoogle's CORS policy dictates that the resumable upload sessions must\nbe created for a specific origin. So requests from the web browser,\nnaturally, will contain the `Origin` header and that will be used to\ncreate the resumable upload URL.\n\n# Errors\n\n- `parameter_error = 13`\n", "parameters": [{"required": true, "type": "object", "name": "body", "in": "body", "schema": {"$ref": "#/definitions/JobDocument"}}], "tags": ["Job Document"], "summary": "Create Job Document", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter Error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful.", "schema": {"type": "object", "properties": {"job_document": {"$ref": "#/definitions/JobDocument"}, "upload_url": {"format": "url", "type": "string", "example": "https://www.googleapis.com/upload/storage/v1/b/bucket/o?uploadType=resumable&upload_id=AEnB2U", "description": "Resumable upload link for client."}}}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job with the given ID doesn't exit.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "This endpoint lists the documents in a job. By default, customer gets\nall of the document types. Translators and proofreaders only get the\ncustomer documents and the documents that they own.\n\n# Error Codes\n\n- `job_not_exists = 23`\n- `parameter_error = 13`\n", "parameters": [{"required": true, "type": "integer", "example": 3, "in": "query", "name": "job_id"}, {"description": "If this is given, only the documents that belong to this source\ndocument will be listed. It only works for proofreader and\ntranslator documents. If you provide this with customer documents,\ncustomer documents will always be listed, but the translator and\nproofreader documents that do not belong will be omitted.\n", "in": "query", "required": false, "type": "integer", "example": 3, "name": "source_document"}], "tags": ["Job Document"], "summary": "List Job Documents", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successfully deleted. Returns the details of the deleted resource.\n", "schema": {"type": "object", "properties": {"translator_documents": {"items": {"$ref": "#/definitions/JobDocument"}, "type": "array"}, "customer_documents": {"items": {"$ref": "#/definitions/JobDocument"}, "type": "array"}, "proofreader_documents": {"items": {"$ref": "#/definitions/JobDocument"}, "type": "array"}}}}, "400": {"description": "job_id field was not provided.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access to the job.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job with the given ID doesn't exit.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/admin/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"admin": {"$ref": "#/definitions/Admin"}}}}, "401": {"description": "User is not authorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins can reach this endpoint", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the information for the authenticated admin. Since system manager and supervisor is also an\n`Admin`, you can get their details from here too.\n", "tags": ["System Manager"], "security": [{"apiKey": []}], "summary": "Get Authenticated System Manager Details"}}, "/jobs/delay-requests/{request_id}/": {"put": {"description": "When the delay request is accepted by the customer/translator, the\njob's status will be active and the end date will be updated. If the\nrequest is not accepted, the job's status will be `active` again and\nthe translator will have to finish in the given time.\n\n**A delay request that is sent for a live job can only be updated by\nthe translator. A delay request that is sent for a document job can\nonly be updated by the customer. If this is not the case, you'll get\n`HTTP 403`.**\n\nThere is two options: The customer can decline the request, or accept\nit.\n\nIn the case that s/he accepts:\n\n- The job's end date is updated.\n\nIn the case that s/he denies:\n\n- The job's status is set to `active` and the end date is left as it\nwas before.\n\nTranslator/customer can cancel a delay request. If they do so:\n\n- The request will be deactivated\n\n- The job status will be set as active\n\n# Push Notification\n\nWhen the job delayed request is updated, the following push\nnotification is sent to the translator. `target_user` is the user who\nwill receive the notification.\n\n```\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 7,\n \"target_user\": 3\n }\n}\n```\n", "parameters": [{"required": true, "type": "integer", "description": "Completed request ID", "in": "path", "name": "request_id"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/DelayRequestUpdate"}}], "tags": ["Delay Request"], "summary": "Update Delay Request", "security": [{"apiKey": []}], "responses": {"400": {"description": "Job status must be active.", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "The request has already been answered. Request the job details.\n"}, "403": {"description": "The request is not being updated by the target user.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Request cannot be found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful response", "schema": {"type": "object", "properties": {"delay_request": {"$ref": "#/definitions/DelayRequest"}}}}}}}, "/delivery-types/": {"get": {"description": "Returns a list of available delivery types for a project. Delivery is\nonly available for translation projects for now.\n\nWhen listing the types, the `country`, and `province` parameters are\nrequired since we need to know where the document is being shipped\nto determine the right delivery types.\n\nSo before using this option, make sure that you get the delivery address\nof the documents.\n", "parameters": [{"description": "The destination country ID for the delivery.", "in": "query", "required": true, "type": "integer", "example": 1, "name": "country"}, {"description": "Optional destination province ID.", "in": "query", "required": false, "type": "integer", "example": 2, "name": "province"}], "tags": ["Delivery", "ReadonlyAccess"], "summary": "List Delivery Types", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"delivery_types": {"items": {"$ref": "#/definitions/DeliveryType"}, "type": "array"}}}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/register/": {"post": {"responses": {"304": {"description": "Account already exists but has not been confirmed. A new password\nemail is sent.\n"}, "201": {"description": "Successful."}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "429": {"description": "User has more than 3 active temporary requests. Wait a little for\nthe temporary passwords to expire.\n"}, "303": {"description": "Account already exists and has been confirmed."}}, "description": "Use this endpoint to register a user. When registering, an email with\na temporary password is set to the user. The user object is created\nbut `is_registration_completed` field is set to false. When the user\nupdates their profile for the first time `is_registration_completed`\nwill be set to true.\n\nIf an account with the given email already exists, `HTTP 304` is\nreturned. In that case, you should request a temporary password using\n`/users/temporary-password/` endpoint.\n\n# Referral Usage\n\nIf a referral code is provided, and it cannot be used `HTTP 400` is\nreturned before registering the user. In that case, the client should\nlet the user know that they used an invalid referral code.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"referral_code": {"type": "string", "description": "Referral code.", "example": "X12sqSaq"}, "email": {"format": "email", "type": "string", "example": "customer@email.com", "description": "Email for the user"}}}}], "tags": ["User Profile", "Referral"], "summary": "Register"}}, "/jobs/delay-requests/": {"post": {"description": "A delay request for a **document job** can only be created by the\n**translator**. For a **live/video job**, only the **customer** can create\na delay request.\n\n- Job's status must be `active`.\n- The job **must** belong to the authenticated translator. If the job does\n not belong to him/her, you'll get `HTTP 403`.\n\nIf those prerequisites are not met, `HTTP 400` will be returned.\n'request_type' and `translator` fields will be automatically\n\nIf the customer is creating a delay request, the delay request is sent to\nall of the interpreters. If the translator is creating the delay request,\nthe request is only sent to the customer.\n\n# Push Notification\n\nWhen the job delay request is created, the following push notification is\nsent to the translator. `target_user` is the user who will receive the\nnotification.\n\n```\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 6,\n \"target_user\": 3\n }\n}\n```\n\n# Error Codes\n\n- parameter_error\n", "parameters": [{"required": true, "in": "body", "name": "request", "schema": {"$ref": "#/definitions/DelayRequestCreate"}}], "tags": ["Delay Request"], "summary": "Create Delay Request", "security": [{"apiKey": []}], "responses": {"304": {"description": "An active job completed request is already in effect.", "schema": {"$ref": "#/definitions/Error"}}, "400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only the translator can create the delay request.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"delay_request": {"$ref": "#/definitions/DelayRequest"}}}}}}, "get": {"description": "Lists the all of the delay requests. When any user other than an admin is\nlisting, only the requests that belong to them will be listed. Only the\nactive requests are listed.\n", "parameters": [{"example": 1, "type": "integer", "description": "If this is set to an ID, only the delay requests for this job will be\nlisted.\n", "name": "job"}], "tags": ["Delay Request"], "summary": "List Delay Requests", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"delay_requests": {"items": {"$ref": "#/definitions/DelayRequest"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/requests/decline-reasons/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"decline_reasons": {"items": {"$ref": "#/definitions/CompletedRequest"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Lists the decline reasons. This endpoint is accessible by any\nauthenticated user.\n", "tags": ["Job Request"], "security": [{"apiKey": []}], "summary": "List Job Request Decline Reasons"}}, "/users/password/": {"put": {"description": "Using this endpoint, the user can change his/her password. In order\nto change the password, s/he must give the current password and If\nthe new password is correct the operation will succeed.\n\nTo make sure that the user typed in the right password, this endpoint\nalso asks for the repetition of the new password. If the user has\nrequested a password reset, current password is not required.\n\nThe user must always be authenticated to use this endpoint.\n\nWhen resetting the password, the user must have already been logged\nin using the `/login/` endpoint, so If the user requires a password\nchange we won't ask for the current password or the recovery key.\n", "parameters": [{"required": true, "type": "integer", "name": "user_profile_id", "in": "path"}, {"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"current_password": {"type": "string", "example": "worst_password_ever", "format": "char[128]"}, "new_password": {"type": "string", "example": "best_password_ever", "format": "char[128]"}, "new_password_repeat": {"type": "string", "example": "best_password_ever", "format": "char[128]"}}}}], "tags": ["User Profile"], "summary": "Change Password", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"token": {"type": "string"}}}}, "400": {"description": "If the new passwords don't match, the `new_password` field will\nbe in parameters. If the current password is wrong,\n`current_password` field will be present in parameters.\n", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "User not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/document-deliveries/{deliery_id}/": {"put": {"description": "You can change the details of a document delivery after it is created.\nThe delivery type cannot be changed at this point. If `documents`\nfield is provided, it will completely replace the field in the\ndatabase. So, If you want to add or remove a document from the list,\nmake sure that you send all the documents.\n\nAll the required fields except the `delivery_type` field can be\nchanged here.\n\n# Updating the Delivery as a Translator\n\nTranslators can update the `status` of a delivery to mark it as\nshipped and enter the `tracking_id`. Other than that, they can't make\nany changes. If you try to do that, you'll get `HTTP 400`.\n\n# Updating the Delivery as a Customer\n\nOnce a delivery is created, customers can only change the `address`\nand the `documents`. If you try to change anything else, you'll get\n`HTTP 400`.\n", "parameters": [{"required": true, "type": "int", "example": 32, "in": "path", "name": "delivery_id"}, {"required": true, "type": "object", "name": "body", "in": "body", "schema": {"$ref": "#/definitions/DocumentDeliveryUpdate"}}], "tags": ["Delivery"], "summary": "Update Document Delivery Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"document_delivery": {"$ref": "#/definitions/DocumentDelivery"}}}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}}, "delete": {"description": "Delivery can be deleted at any point. If the document delivery is\ndeleted while the project is in progress, then the charged delivery\nfee will be refunded to the user.\n\nIf the job is not yet active, then delivery can be safely deleted\nwithout any side effects.\n", "parameters": [{"required": true, "type": "int", "example": 32, "in": "path", "name": "delivery_id"}], "tags": ["Delivery"], "summary": "Delete Document Delivery", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"document_delivery": {"$ref": "#/definitions/DocumentDelivery"}}}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "You can get the details of a delivery here.\n", "parameters": [{"required": true, "type": "int", "example": 2, "in": "path", "name": "delivery_id"}], "tags": ["Delivery"], "summary": "Get Document Delivery Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"document_delivery": {"$ref": "#/definitions/DocumentDelivery"}}}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator/language-pairs/{pair_id}": {"delete": {"description": "Remove a language pair from translator.\n", "parameters": [{"required": true, "type": "integer", "name": "pair_id", "in": "path"}], "tags": ["Translator"], "summary": "Remove Language Pair from Translator", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"language_pair": {"$ref": "#/definitions/LanguagePair"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins and the owner can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "LanguagePair does not exist.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/{job_id}/ratings/": {"post": {"responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"translator_rating": {"$ref": "#/definitions/TranslatorRating"}}}}, "403": {"description": "Only customer can create a translator rating.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator or job don't exist.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "After a job is completed, the customer can send a rating for the translator. There are different questions\nfor the two job types. After the rating is sent, the customer can decide to change later on. The rating is\ndone based on [1, 5] range.\n\n`overall_rating` and `would_you_use_again_rating` are required for both job types.\n\nThe following are required for **live jobs** and If they exist for a document job they will be ignored.\n\n- `appearance_rating`\n- `kindness_rating`\n- `arrived_on_time`\n\nThe rating of the translator will not be available until enough people have voted for him/her.\n\nThe job's status **MUST** be `completed` to submit a rating.\nA translator can only have one rating for the same job. If you want to change the rating, you can update it.\n", "parameters": [{"required": true, "type": "integer", "name": "job_id", "in": "path"}, {"in": "body", "description": "The rating for the translator", "name": "body", "schema": {"$ref": "#/definitions/TranslatorRating"}}], "tags": ["Translator Rating"], "summary": "Rate Translator"}}, "/profile-photo/": {"post": {"description": "This is where any user type can upload their profile photos. After uploading the profile photo, the url will\nbe added to the authenticated user's profile whether s/he is an admin, a customer or a translator.\n\n**File upload is limited to 2.5 MB**\n", "parameters": [{"required": true, "type": "file", "name": "file", "in": "formData"}], "tags": ["User"], "summary": "Set Profile Photo", "security": [{"apiKey": []}], "consumes": ["multipart/form-data"], "responses": {"400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successfully uploaded.", "schema": {"type": "object", "properties": {"url": {"type": "string"}}}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}, "delete": {"responses": {"200": {"description": "Successfully deleted."}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Removes the profile photo of the authenticated user.\n", "tags": ["User"], "security": [{"apiKey": []}], "summary": "Delete Profle Photo"}}, "/translators/bank-accounts/{bank_account_id}/": {"put": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"bank_account": {"$ref": "#/definitions/BankAccount"}}}}, "400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The country with the given ID cannot be found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Bank account details can only bet changed If there were no payouts\nmade to the bank account. You can activate an deactivated account\nhere. When an old account is activated, the deactivation_date is set\nto null gain.\n\nOnly the `name`, and `is_active` fields can be changed If a payout\nhas already been transfered to a bank account.\n", "parameters": [{"required": true, "type": "integer", "name": "bank_account_id", "in": "path", "format": "int64"}, {"in": "body", "name": "payload", "schema": {"$ref": "#/definitions/BankAccount"}}], "tags": ["BankAccount"], "summary": "Update Bank Account Details"}, "delete": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"bank_account": {"$ref": "#/definitions/BankAccount"}}}}, "400": {"description": "Cannot be deleted because payouts were done to this account.\n", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The country with the given ID cannot be found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "A bank account cannot be deleted If a payout was done to the account.\n", "parameters": [{"required": true, "type": "integer", "name": "bank_account_id", "in": "path", "format": "int64"}], "tags": ["BankAccount"], "summary": "Delete a Bank Account"}, "get": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"bank_account": {"$ref": "#/definitions/BankAccount"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The country with the given ID cannot be found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "A translator can only get the details of their bank accounts here.\n", "parameters": [{"required": true, "type": "integer", "name": "bank_account_id", "in": "path", "format": "int64"}], "tags": ["BankAccount"], "summary": "Get Bank Account Details"}}, "/users/{user_profile_id}/": {"put": {"description": "No parameter is required here. You just need to include the ones that you want updated. Only admins and the\nprofile owner can update user.\n", "parameters": [{"required": true, "type": "integer", "name": "user_profile_id", "in": "path"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/UserUpdate"}}], "tags": ["User Profile"], "deprecated": true, "summary": "Update User Profile", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "User not modified."}, "403": {"description": "Only admins and the user can update user.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "User not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful response. If token is refreshed, returns the new token.", "schema": {"type": "object", "properties": {"profile": {"$ref": "#/definitions/UserProfile"}, "token": {"type": "string"}}}}}}, "delete": {"description": "Delete the user with the given user_profile_id. Only the profile owner or an admin can delete the user.\n", "parameters": [{"required": true, "type": "integer", "name": "user_profile_id", "in": "path"}], "tags": ["User Profile"], "summary": "Delete User", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"user_profile": {"$ref": "#/definitions/UserProfile"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins and the user can delete user.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "User not found.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "Returns the user profile information. Only admins and the profile owner can get user details.", "parameters": [{"required": true, "type": "integer", "name": "user_profile_id", "in": "path"}], "tags": ["User Profile"], "deprecated": true, "summary": "Get User Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"profile": {"$ref": "#/definitions/UserProfile"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins and the user can get user details.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "User not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator/certificates/": {"post": {"description": "This endpoint is only accessible by a translator. So you need to first create the translator. Certificate is\nnot required when registering translator.\nIf the translator has the same certificate with the same properties, `HTTP 400` is returned. The certificate\nis added to the authenticated translator.\n\nThis change will require an approval from the admins. So, If there's an active profile change request, that\nwill be updated to reflect the new changes. If there isn't one, a new request will be created. If a request\nwas created or updated, it will be returned with the `request` key with the response. If none was created or\nupdated, it will be `null`.\n\n**This endpoint is only accessible by translators.**\n\n# Error Codes\n\n- `already_already_exists`\n- `parameter_error`\n", "parameters": [{"required": false, "type": "file", "description": "The file for the certificate. This is an image file. There can only be one file.", "in": "formData", "name": "file"}, {"required": true, "type": "string", "name": "name", "in": "formData", "format": "char[128]"}, {"required": true, "type": "string", "name": "year", "in": "formData", "format": "char[64]"}], "tags": ["Certificate"], "summary": "Create Certificate", "security": [{"apiKey": []}], "consumes": ["multipart/form-data"], "responses": {"400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successfully uploaded.", "schema": {"type": "object", "properties": {"certificate": {"$ref": "#/definitions/Certificate"}}}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/experiences/{experience_id}/": {"delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"experience": {"$ref": "#/definitions/TranslationExperience"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Delete experience from translator.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "experience_id"}], "tags": ["Translator Profile"], "summary": "Delete Experience"}}, "/jobs/{job_id}/completed-requests/": {"post": {"description": "Translator/Interpreter is the one who sends the completion request.\nCustomers do not have access to `POST` endpoint and they will get `HTTP 403`.\n\n# Document Projects\n\nWhen the translator uploads the appropriate files, s/he can send a job\ncompleted request.\n\n- Job's status must be `active`.\n- You cannot send a job completed request If the translator's document count\n is 0, or the number of translator files and customer files does not match.\n- If the job is a live job, the job duration must be completed to send the\n request.\n- The job **must** belong to the authenticated translator. If the job does\n not belong to him/her, you'll get `HTTP 403`.\n\nIf those prerequisites are not met, `HTTP 400` will be returned.\n\nIf there's **no proofreading** for the job, the job's status will be\n`completed_request_sent` sent as the request is created. If **there's\nproofreading**, then the status will still be active until the proofreader\nalso sends the request. Accepting the proofreader's completion request will\nalso accept the translator's completion request.\n\nIf the customer requested an **affidavit of translation**, or **certificate\nof translation**, then the translator must upload those documents before\nthey can send a completion request.\n\n# Live Projects\n\nInterpreter sends the completion request for live projects.\n\n# Push Notification\n\nWhen the job completed request is created, the following push notification\nis sent to the translator. `target_user` is the user who will receive the\nnotification.\n\n```\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 4,\n \"target_user\": 3\n }\n}\n```\n\n# Error Codes\n\n- `status_not_valid_complete_request`\n- `live_job_is_not_completed`\n- `translator_document_not_exist`\n- `status_not_valid_complete_request`\n", "parameters": [{"required": true, "type": "integer", "description": "Job ID", "in": "path", "name": "job_id"}], "tags": ["Completed Request"], "summary": "Create Completed Request", "security": [{"apiKey": []}], "responses": {"304": {"description": "An active job completed request is already in effect.", "schema": {"$ref": "#/definitions/Error"}}, "400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only the translator can create the completed request.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"completed_request": {"$ref": "#/definitions/CompletedRequest"}}}}}}, "get": {"description": "Lists the all of the completed requests. When any user other than an admin\nis listing, only the requests that belong to them will be listed. If the\nauthenticated user is an admin, they can use filtering to change the list.\nOnly the active requests are listed.\n", "parameters": [{"required": true, "type": "integer", "description": "Job ID", "in": "path", "name": "job_id"}], "tags": ["Completed Request"], "summary": "List Completed Requests", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"completed_requests": {"items": {"$ref": "#/definitions/CompletedRequest"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job cannot be found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translators/overview/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"overview": {"type": "object", "properties": {"count": {"type": "integer", "description": "The total number of translators.", "example": 203}}}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the number of activated translators in the database.\n\n**This endpoint returns `400` for now.\n", "tags": ["Translator"], "security": [{"apiKey": []}], "summary": "Translator Ovwevoew"}}, "/translator/language-certificates/{certificate_id}/": {"put": {"description": "This is where you can update the details of a language certificate. As usual, the language certificate\n**must** belong to the authenticated translator. You can delete the file from the language certificate or you\ncan upload a new one, replacing the other.\n\nIf you want to remove the file, add an empty `file` field to the request.\n", "parameters": [{"required": true, "type": "integer", "description": "The certificate ID", "in": "path", "name": "certificate_id"}, {"required": false, "type": "file", "description": "The file for the language certificate. This is an image file. There can only be one file.", "in": "formData", "name": "file"}, {"required": true, "type": "integer", "name": "language", "in": "formData"}, {"required": true, "type": "string", "name": "name", "in": "formData", "format": "char[128]"}, {"required": true, "type": "string", "name": "number", "in": "formData", "format": "char[64]"}, {"in": "formData", "name": "file_operation", "format": "char[64]", "deprecated": true, "required": true, "type": "string", "description": "The only option is `remove`. `file` property precedes this property. So do not provide them both."}, {"in": "formData", "description": "Required If file is provided.", "format": "char[128]", "required": false, "type": "string", "name": "file_checksum"}], "tags": ["Language Certificate"], "summary": "Update Language Certificate", "security": [{"apiKey": []}], "consumes": ["multipart/form-data"], "responses": {"200": {"description": "Successfully deleted.", "schema": {"type": "object", "properties": {"certificate": {"$ref": "#/definitions/Certificate"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The language certificate ID cannot be found in the translator profile.", "schema": {"$ref": "#/definitions/Error"}}}}, "delete": {"description": "This is where you delete a language certificate that belongs to the translator. To delete a language\ncertificate, that certificate ID **must** belong to the translator. If the translator is inactive, this will\nbe searched in the translator profile only. If the translator is active and there's an active profile edit\nrequest to him/her that profile request will also be searched. If the given language certificate does not\nbelong to the translator you'll get `HTTP 404`.\n", "parameters": [{"required": true, "type": "integer", "description": "The language certificate ID", "in": "path", "name": "certificate_id"}], "tags": ["Language Certificate"], "security": [{"apiKey": []}], "responses": {"200": {"description": "Successfully deleted.", "schema": {"type": "object", "properties": {"language_certificate": {"$ref": "#/definitions/LanguageCertificate"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The language certificate ID cannot be found in the translator profile.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/payouts/overview/": {"get": {"responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"overview": {"$ref": "#/definitions/PayoutOverview"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator with the given ID is not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "This is where a translator or a system manager can get a summary\nlook over the payouts that the translator has received or will\nreceive. This endpoint is only accessible to system managers and\ntranslators.\n\nWhen a translator is using this endpoint, they will only be able to\naccess their profile. If a system manager is using the endpoint, they\nhave to use the `translator` parameter.\n", "tags": ["Payout"], "security": [{"apiKey": []}], "summary": "Get Payout Overview"}}, "/jobs/": {"post": {"responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"job": {"$ref": "#/definitions/Job"}}}}, "401": {"description": "User is not authenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Here's how job adding works. You need to create an initial job before\nyou can assign a translator to it. So, when a job is created it's\ninitial status will be `draft`, meaning that no translator has been\nappointed to it yet. At this stage, you can update the job and see\nthe pricing for it. After a translator request is sent, the job's\nstatus will change to `offer`.\n\n# Proofreading\n\nProofreading can oly be enabled for translation projects. You can\nenable `proofreading_enabled` and the whole process will require no\noutside intervention. `proofreading_enabled` field is ignored on any\nother project types.\n\n# Required Fields\n\n## On-site Jobs\n\n- address\n- start_date\n- end_date\n\n## Document Jobs\n\n- end_date\n- documents\n\nIf you are creating a doc job, the `start_date` will be the date the\ntranslator accepts the job. Also, the ID's in the `documents` field\nmust point to job documents that were not previously assigned a job.\nIf such is the case, the operation will be be continued. And you'll\nget the following error.\n\n```\n\"documents\": [1, 2, 3]\n```\n\nThose are the IDs of the job documents that belonged to a different\njob.\n\n## Interpretation\n\nThe `over_the_phone` parameter can be sent as True to allow for over\nthe phone interpretation. In that case, the `note` parameter must\ncontain the contact and other necessary details.\n\n## Video Interpretation\n\nIf the customer wants a video interpretation, then the location is\nnot required but a note to interpeter will be required. Using this\nnote, they can add the medium for video interpretation or use the\ninterpreter's social accounts to contact them.\n\nWhen a video interpretation request is sent, the start and end date\nwill be in UTC as usual and that date should be converted to local\ntime.\n\n- note\n- start_date\n- end_date\n\n# Note\n\n- If the customer has not yet set an address in the profile, creating\n a job won't work.\n\n# Referral Code\n\nYou can provide an additional `referral_code` parameter to use a\nreferral code here. Note that If the referral code cannot be used,\n`HTTP 400` is returned before creating the job.\n", "parameters": [{"in": "body", "name": "body", "schema": {"$ref": "#/definitions/Job"}}], "tags": ["Job", "Referral"], "summary": "Create a Job"}, "get": {"description": "Customer and translator can list the jobs that belong to\nthem. If a field is of wrong type, it is not used by the filter.\n\n- If the authenticated user is a translator, then only `translator`\n field is set.\n- If the authenticated user is a customer, then only `customer` field\n is set.\n", "parameters": [{"in": "query", "description": "The page to show. If this is not provided, the first page will be\nreturned.\n", "format": "int32", "required": false, "type": "integer", "name": "page"}, {"in": "query", "description": "The number of jobs to show in a list. This defaults to 10", "format": "int32", "required": false, "type": "integer", "name": "page_item_count"}, {"in": "query", "description": "General search. Only searches in the translator's/customer's\n`username`, `email`.\n", "format": "char[254]", "required": false, "type": "string", "name": "q"}, {"required": false, "type": "integer", "description": "Translator ID", "in": "query", "name": "translator"}, {"in": "query", "description": "Customer ID", "format": "int32", "required": false, "type": "integer", "name": "customer"}, {"in": "query", "description": "See the top of the documentation of options.", "format": "int32", "required": false, "type": "integer", "name": "job_type"}, {"in": "query", "description": "Job start date", "format": "dateTime", "required": false, "type": "string", "name": "start_date"}, {"in": "query", "description": "Job end date", "format": "dateTime", "required": false, "type": "string", "name": "end_date"}, {"in": "query", "description": "Job delayed date", "format": "dateTime", "required": false, "type": "string", "name": "delayed_date"}, {"in": "query", "description": "Job creation start date", "format": "dateTime", "required": false, "type": "string", "name": "creation_date_start"}, {"in": "query", "description": "Job creation end date", "format": "dateTime", "required": false, "type": "string", "name": "creation_date_end"}, {"in": "query", "description": "Response date", "format": "date", "required": false, "type": "string", "name": "response_date_start"}, {"in": "query", "description": "Response date", "format": "date", "required": false, "type": "string", "name": "response_date_end"}, {"in": "query", "description": "The ID of the language that the translation is being done from.\n", "format": "int32", "required": false, "type": "integer", "name": "from_language"}, {"in": "query", "description": "The ID of the language that the translation is being done to.\n", "format": "int32", "required": false, "type": "integer", "name": "to_language"}, {"required": false, "type": "integer", "description": "The nature ID", "in": "query", "name": "nature"}, {"in": "query", "type": "string", "description": "If job_type is `live`, translation address", "name": "address"}, {"required": false, "type": "boolean", "description": "Job accept/decline", "in": "query", "name": "is_accepted"}, {"required": false, "type": "boolean", "description": "List archived jobs", "in": "query", "name": "is_archived"}, {"in": "query", "description": "See the top of the documentation for options.", "format": "int32", "required": false, "type": "integer", "name": "status"}], "tags": ["Job"], "summary": "List Jobs", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"job_count": {"type": "integer", "description": "This is the number of jobs that's in the filtered list.\nIt does **NOT** represent the total number of jobs.\n", "example": 30}, "jobs": {"items": {"$ref": "#/definitions/JobSummary"}, "type": "array"}}}]}}, "401": {"description": "The user is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/natures/{nature_id}/": {"put": {"description": "Update a `Nature`. If you are updating the initial name of the nature, you can omit the `language` field.\nIf the `language` field is provided and it equals to `en`, then the initial name of the nature is updated.\nIf you would like to add a translation for the nature, you can do so by providing the `language` and `name`\nfields only. If a new translation is added, the response nature will have the newly added translation name.\n", "parameters": [{"required": true, "type": "integer", "description": "Nature identifier for the nature", "in": "path", "name": "nature_id"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/Nature"}}], "tags": ["Nature"], "summary": "Update Nature", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the updated resource.", "schema": {"type": "object", "properties": {"nature": {"$ref": "#/definitions/Nature"}}}}, "400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only system manager can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Nature not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}, "delete": {"description": "Delete the nature with the given nature identifier. Only the system manager can delete the nature.", "parameters": [{"in": "path", "description": "Identifier for the nature", "format": "int32", "required": true, "type": "integer", "name": "nature_id"}], "tags": ["Nature"], "summary": "Delete Nature", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"nature": {"$ref": "#/definitions/Nature"}}}}, "400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only system manager can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Nature not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "Returns the nature information. Only admins can get the nature details.", "parameters": [{"required": true, "type": "integer", "description": "Nature identifier for the nature", "in": "path", "name": "nature_id"}], "tags": ["Nature"], "summary": "Get Nature Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"nature": {"$ref": "#/definitions/Nature"}}}}, "400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Nature not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator/certificates/{certificate_id}/": {"put": {"description": "This is where you can update the details of a certificate. As usual, the certificate **must** belong to\nthe authenticated translator.\n\nYou can delete the file from the certificate or you can upload a new one, replacing the other.\n\nIf you want to delete the file, provide and empty `file_url`.\n\n**This endpoint is only accesisble by translators.**\n", "parameters": [{"required": true, "type": "integer", "description": "The certificate ID", "in": "path", "name": "certificate_id"}, {"required": false, "type": "file", "description": "The file for the certificate. This is an image file. There can only be one file.", "in": "formData", "name": "file"}, {"required": true, "type": "string", "name": "name", "in": "formData", "format": "char[128]"}, {"required": true, "type": "string", "name": "year", "in": "formData", "format": "char[64]"}, {"in": "formData", "name": "file_operation", "format": "char[64]", "derecated": true, "required": true, "type": "string", "description": "The only option is `remove`. `file` property precedes this property. So do not provide them both."}, {"in": "formData", "description": "Required If file is provided.", "format": "char[128]", "required": false, "type": "string", "name": "file_checksum"}], "tags": ["Certificate"], "summary": "Update Certificate", "security": [{"apiKey": []}], "consumes": ["multipart/form-data"], "responses": {"200": {"description": "Successfully deleted.", "schema": {"type": "object", "properties": {"certificate": {"$ref": "#/definitions/Certificate"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The language certificate ID cannot be found in the translator profile.", "schema": {"$ref": "#/definitions/Error"}}}}, "delete": {"description": "This is where you delete a certificate that belongs to the translator. To delete a certificate, that\ncertificate ID **must** belong to the translator. If the translator is inactive, this will be searched in the\ntranslator profile only. If the translator is active and there's an active profile edit request to him/her\nthat profile request will also be searched. If the given certificate does not belong to the translator you'll\nget `HTTP 404`.\n\n**This endpoint is only accesisble by translators.**\n", "parameters": [{"required": true, "type": "integer", "description": "The certificate ID", "in": "path", "name": "certificate_id"}], "tags": ["Certificate"], "summary": "Delete Certificate", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successfully deleted.", "schema": {"type": "object", "properties": {"certificate": {"$ref": "#/definitions/Certificate"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The language certificate ID cannot be found in the translator profile.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-requests/{request_id}/": {"delete": {"description": "Delete the translator request with the given ID. Only the translator can delete the translator request.\n", "parameters": [{"required": true, "type": "integer", "description": "Identifier for the request", "in": "path", "name": "request_id"}], "tags": ["Translator Request"], "summary": "Delete Translator Request", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"translator_request": {"$ref": "#/definitions/TranslatorRequest"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access to that translator request.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator is not found.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "Returns the information about the translator request. Only the admin or the translator can get the\nrequest details.\n", "parameters": [{"required": true, "type": "integer", "description": "Identifier for the translator request.", "in": "path", "name": "request_id"}], "tags": ["Translator Request"], "summary": "Get Translator Request Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"translator_request": {"$ref": "#/definitions/TranslatorRequest"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only the admin or the translator can get the request.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator request is not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/devices/": {"post": {"responses": {"400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "The created device.", "schema": {"type": "object", "properties": {"device": {"$ref": "#/definitions/Device"}}}}, "403": {"description": "The authenticated user is not allowed access here.", "schema": {"$ref": "#/definitions/Error"}}, "303": {"description": "The device already exists. And the existing device details are returned.", "schema": {"type": "object", "properties": {"device": {"$ref": "#/definitions/Device"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Register a new device for the authenticated user. A device with the same ID cannot be added for the same user.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/DeviceCreate"}}], "tags": ["Device"], "summary": "Register a new device"}, "get": {"responses": {"200": {"description": "List of devices.", "schema": {"type": "object", "properties": {"devices": {"items": {"$ref": "#/definitions/Device"}, "type": "array"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The authenticated user is not allowed access here.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Device"], "description": "Returns the list of devices for the authenticated user.\n", "summary": "Returns the list of devices."}}, "/purchases/": {"get": {"description": "This is where you can list purchases. **This will list the purchases\nthat belong to the authenticated user.**\n", "parameters": [{"required": false, "description": "This status change will always be automatic and will not accept\ninput from the outside.\n\n- `0` (unpaid): This means that the money has not yet me charged.\n This is usually the case If a promotion was used or the customer\n is a trusted one and they will be charged once the project ends.\n\n- `1` (on_hold): This means that the money is on hold. It's not yet\n charged from the card.\n\n- `2` (paid): This means that the money has been charged and\n withdrawn from the customer payment method.\n", "in": "query", "enum": [0, 1, 2], "type": "integer", "example": 0, "name": "status"}, {"description": "The page to show. The default value is 1.\n", "in": "query", "required": false, "type": "integer", "example": 1, "name": "page"}, {"description": "the number of items in the list. The default value is 15.\n", "in": "query", "required": false, "type": "integer", "example": 1, "name": "page_item_count"}], "tags": ["Purchase"], "summary": "List Purchases", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"purchases": {"items": {"$ref": "#/definitions/Purchase"}}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/estimated-duration/": {"get": {"description": "Returns the estimated time it will take to finish a job with the\ngiven word count. If `deadline` parameter is given, this endpoint\nwill also calculate the required number of translators to finish the\nproject in the given `deadline`.\n\nFor now, only one proofreader is assigned to a job so the duration\nand required count will always be for one proofreader.\n\nIf the deadline is invalid, the invalid values will be `0`.\n\n# Note\n\nIf proofreading is enabled for the job and a `deadline` is given as a\nparameter, the translator count will be estimated based on\n`deadline - proofreading_duration`.\n", "parameters": [{"description": "Total word count.", "in": "query", "required": true, "type": "integer", "example": 5000, "name": "word_count"}, {"description": "Whether proofreading is enabled or not. Defaults to false.", "in": "query", "required": false, "type": "boolean", "example": false, "name": "proofreading_enabled"}, {"description": "The desired deadline of the project.", "in": "query", "required": false, "type": "datetime", "example": "2018-05-06T12:35", "name": "deadline"}], "tags": ["Job"], "summary": "Get Estimated Duration", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"required_translator_count": {"format": "int32", "type": "integer", "example": 1, "description": "If a deadline was given, this will have the required number\nof translators to finish the job in time. If deadline was\nnot given, it will be 1.\n"}, "estimated_translation_delivery": {"format": "date-time", "type": "string", "example": 2, "description": "The estimated delivery date for transaltion."}, "proofreading_duration": {"format": "int32", "type": "integer", "example": 2, "description": "The number of days it takes to finish proofreading the\ngiven word count.\n"}, "estimated_delivery": {"format": "date-time", "type": "string", "example": 1, "description": "If proofreading is enabled, this equals to the time it\ntakes for translation and the time it takes for\nproofreading. If deadline is not given, this is calculated\nfor one translator. If deadline is given, this estimated\ndelivery is calculated according to the required number\nof translators.\n"}, "required_proofreader_count": {"format": "int32", "type": "integer", "example": 1, "description": "If a deadline was given, this will have the required number\nof proofreaders to finish the job in time. If deadline was\nnot given, it will be 1.\n"}}}}, "400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User not Authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/admins/login/": {"post": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"token": {"type": "string"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Admin does not exist.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authorized.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "If registered the admin succeeds token is returned, otherwise an error message is returned.", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"username": {"type": "string", "description": "Unique user name", "format": "char[150]"}, "password": {"type": "string", "description": "Password", "format": "char[128]"}}}}], "tags": ["System Manager"], "summary": "Login for System Managers"}}, "/translator/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"translator": {"$ref": "#/definitions/Translator"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator is not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns information about the authenticated translator. If the\nauthenticated user is not a translator this endpoint will return\n`HTTP 404`.\n", "tags": ["Translator"], "security": [{"apiKey": []}], "summary": "Get Authenticated Translator Detail"}}, "/translators/dashboard/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"dashboard": {"$ref": "#/definitions/Dashboard"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the dashboard information. Right now, it only returns the\nnumber of active and up coming on-site and document assignments.\n", "tags": ["Translator"], "security": [{"apiKey": []}], "summary": "Get Dashboard"}}, "/translator-profile/": {"put": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"translator_profile": {"$ref": "#/definitions/TranslatorProfile"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found."}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Only the basic fields of translator profile is updated here. For\nindividual resources like resume, address etc, refer to the individual\nendpoints.\n", "parameters": [{"required": true, "type": "object", "name": "payload", "in": "body", "schema": {"$ref": "#/definitions/TranslatorProfile"}}], "tags": ["Translator Profile"], "summary": "Update Translator Profile"}, "post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"translator_profile": {"$ref": "#/definitions/TranslatorProfile"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "303": {"description": "Check out the `Location` header for the profile id."}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Translator Profile"], "description": "Creates a new Translator profile. If the authenticated user is\nalready a translator, this will return `HTTP 303`.\n\nFor all the other translator profile related fields to work, we first\nneed to create the translator profile. Translator profile only\ncontains the basic information about the translator.\n\nIf the user is already authenticated and has a valid account, we'll\njust create a translator profile for that user using the existing\ninformation.\n\nNote that a user must already have an account to sign up as a\ntranslator. That's why we are not asking for any additional data\nin here.\n\n# Error Codes\n\n- `customer_cannot_be_translator`: 68\n", "summary": "Create a new Translator Profile"}, "delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted address.", "schema": {"type": "object", "properties": {"translator_profile": {"$ref": "#/definitions/TranslatorProfile"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found."}}, "tags": ["Translator Profile"], "description": "Deletes the translator profile and all the related resources.\n", "summary": "Delete Translator Profile"}, "get": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"translator_profile": {"$ref": "#/definitions/TranslatorProfile"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "303": {"description": "Check out the `Location` header for the profile id."}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Translator Profile"], "description": "Returns the translator profile details.\n", "summary": "Get Translator Profile"}}, "/users/status/": {"get": {"responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"has_temporary_password": {"type": "boolean", "description": "Whether the user hsa an active temporary password.\n", "example": false}, "requires_password_change": {"type": "boolean", "description": "This indicates that the user needs to change their password.\nIt may be that they requested to reset their password but\ndid not use their original password to log in.\n", "example": false}, "has_password": {"type": "boolean", "description": "Whether the user hsa a valid password to use for login.\n", "example": true}, "is_registered": {"type": "boolean", "description": "Whether the user is registered in the system or not.\n", "example": true}}}}, "400": {"description": "Parameter Error.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Using this endpoint you can get a quick look at the user about their\nregistration status, or various non-critical information.\n", "parameters": [{"required": true, "type": "string", "name": "email", "in": "query"}], "tags": ["User Profile"], "summary": "Brief User Status"}}, "/jobs/price/": {"get": {"description": "This is where you can get the price of a project. Any authenticated\nuser can use this endpint.\n\nIf `delivery_type` field is provided, the delivery fee will be\ncalculated based on that value. If not provided, and the job contains\na document delivery, then that object will be used to calculate the\ndelivery fee.\n", "parameters": [{"in": "query", "description": "- `0`: Document Job\n\n- `1`: On-Site Job\n", "format": "int32", "enum": [0, 1], "type": "integer", "example": 1, "name": "job_type"}, {"description": "Required for live jobs.", "format": "dateTime", "in": "query", "type": "string", "example": "2017-01-02T15:55", "name": "start_date"}, {"description": "Required for both job types.", "format": "dateTime", "in": "query", "type": "string", "example": "2017-01-03T15:55", "name": "end_date"}, {"in": "query", "type": "integer", "description": "The source language ID.", "name": "from_language", "example": 1}, {"in": "query", "type": "integer", "description": "The target language ID.", "name": "to_language", "example": 2}, {"in": "query", "type": "integer", "description": "The nature ID for the project.", "name": "nature", "example": 2}, {"in": "query", "type": "integer", "description": "The total word count for the documents.", "name": "word_count", "example": 1250}, {"in": "query", "type": "integer", "description": "The total page count for the documents.", "name": "page_count", "example": 1250}, {"description": "The 3 letter currency code. This field should only be provided\nfor un-authenticated users. For the authenticated users, the\ntheir country's currency will be used.\n", "in": "query", "required": false, "type": "string", "example": "cad", "name": "currency"}, {"in": "query", "type": "integer", "description": "This is the distance from the interpreter location to the job\nlocation in kilometers.\n", "name": "job_distance", "example": 12}, {"in": "query", "type": "bool", "description": "Defaults to false.", "name": "proofreading_enabled", "example": false}, {"in": "query", "type": "bool", "description": "Defaults to false.", "name": "is_lao_project", "example": false}, {"in": "query", "type": "bool", "description": "Defaults to false.", "name": "is_rush_order", "example": false}, {"in": "query", "type": "integer", "description": "If the job was already created, you can set this parameter and leave\nout the rest. All the other parameters will be ignored If you\nprovide this parameter.\n", "name": "job", "example": 2}, {"description": "Country ID where the project is taking place. If this is not given,\ntax calculation cannot be done.\n", "in": "query", "required": true, "type": "integer", "example": 2, "name": "country"}, {"description": "Province ID where the project is taking place. If this is not given,\ntax calculation cannot be done.\n", "in": "query", "required": true, "type": "integer", "example": 3, "name": "province"}, {"description": "The referral code to apply when calculating the price. The referral\nis only used to here to check If there's an associated promotion.\nIf the referral code is not found, no error is raised.\n", "in": "query", "required": false, "type": "string", "example": "ADF", "name": "referral_code"}, {"description": "The promotion code to apply when calculating the price.\n", "in": "query", "required": false, "type": "string", "example": "ADF", "name": "promotion_code"}, {"description": "Defaults to 0.", "format": "in64", "in": "query", "type": "int", "example": false, "name": "certification_type"}, {"description": "If provied, delivery fee will be calculated.", "format": "in64", "in": "query", "type": "number", "example": 32, "name": "delivery_type"}], "tags": ["Price Information"], "summary": "Get Price Information", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"price_information": {"$ref": "#/definitions/PriceInformation"}}}}, "400": {"description": "An essential parameter was missing.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "A job with the given ID cannot be found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translators/register/": {"post": {"responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"translator": {"$ref": "#/definitions/Translator"}}}}, "403": {"description": "Only customer can create a translator.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Any customer can create a translator profile. But the profile ***must*** be accepted by the admins and let\nthe user operate as a translator.\n\nA translator profile is private as long as it remains inactive.\n\nSchools and courses are created If they do not exist. When an error occurs when creating those, you'll get\nan error and the registration process will stop and the errors will return.\n\n**Language certificates (`/translator/language-certificates/new/`) and certificates\n(`/translator/certificates/new/`) are not added here. They have their own endpoint for that.**\n\nThe default version of the error reporting is as follows:\n\n```\n{\n \"status\": {\n \"message\": \"furkanusercom\",\n \"code\": 13,\n \"parameters\": {\n \"languages\": [\n \"Invalid pk \\\"1\\\" - object does not exist.\"\n ],\n \"nature_groups\": [\n \"Invalid pk \\\"1\\\" - object does not exist.\"\n ]\n }\n }\n}\n```\n\nBut for this endpoint, `languages` and `courses` arrays can also contain objects. This is because when adding\nthose values, API accepts a list of objects and each can have different errors. So for this endpoint the\nfollowing is a valid error reporting.\n\n```\n{\n \"status\": {\n \"message\": \"furkanusercom\",\n \"code\": 13,\n \"parameters\": {\n \"languages\": [\n \"Invalid pk \\\"1\\\" - object does not exist.\"\n ],\n \"nature_groups\": [\n \"Invalid pk \\\"1\\\" - object does not exist.\"\n ]\n }\n }\n}\n```\n", "parameters": [{"required": true, "in": "body", "description": "Translator registration information.", "name": "body", "schema": {"$ref": "#/definitions/TranslatorRegister"}}], "tags": ["Translator"], "summary": "Register Translator"}}, "/promotions/": {"get": {"description": "This is where you can list purchases. This endpoint is accessible by\nsystem managers. And customers can only list purchases that **belong\nto them**.\n\nThe mnay to many fields (Such as `natures`) will only have the IDs of\nthe objects.\n", "parameters": [{"required": false, "type": "bool", "description": "Using this you can list only the active or inactive promotions.\nThe default value is `true`.\n", "in": "query", "name": "is_active"}, {"enum": [-1, 0, 1, 2], "description": "This promotion will only be available for the selected job type.\nThe defaul value is `-1`.\n\n- `-1`: All Types\n\n- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Fixed Document\n", "format": "int32", "required": false, "in": "query", "type": "integer", "example": 2, "name": "job_type"}, {"in": "query", "description": "The page to show. If this is not provided, the first page will be\nreturned.\n", "format": "int32", "required": false, "type": "integer", "example": 2, "name": "page"}, {"in": "query", "description": "The number of users to show in a list. This defaults to 10.\n", "format": "int32", "required": false, "type": "integer", "example": 10, "name": "page_item_count"}], "tags": ["Promotion"], "summary": "List Promotions", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"promotions": {"items": {"$ref": "#/definitions/Promotion"}}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/resumes/{resume_id}/": {"get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"resume": {"$ref": "#/definitions/Resume"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns resume details.\n", "parameters": [{"required": true, "type": "number", "example": 1, "in": "path", "name": "resume_id"}], "tags": ["Translator Profile"], "summary": "Get Resume"}, "delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"resume": {"$ref": "#/definitions/Resume"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Deletes translator resume and returns the deleted resource.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "resume_id"}], "tags": ["Translator Profile"], "summary": "Delete Resume"}}, "/translator-profile/language-services/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"language_services": {"items": {"$ref": "#/definitions/LanguageService"}, "type": "array"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Add a language service to the translator. Language services come in\ndifferent types. The type of language service that you add here will\ndetermine whether the translator needs to fill out translation or\ninterpretation related information on their profile.\n\nIf a translator only has translation related services, then they will\nnot be required to enter If they are able to drive to appointments\nor not.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"type": "object", "properties": {"language_services": {"items": {"type": "number", "example": 32, "description": "The list of language service IDs."}, "type": "array"}}}}], "tags": ["Translator Profile"], "summary": "Add A Language Service to Translator"}, "get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"language_services": {"items": {"$ref": "#/definitions/LanguageService"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the language services that the translator provides.\n", "parameters": [{"required": false, "type": "string", "example": "INTERPRETATION", "in": "query", "name": "service_type"}], "tags": ["Translator Profile"], "summary": "List Language Services for Translator"}}, "/job-certifications/": {"get": {"description": "Returns a list of available job certifications. You can filter them for\nspecific job types as well.\n", "parameters": [{"required": true, "description": "- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Video Interpretation Job\n", "in": "query", "enum": [0, 1, 2], "type": "integer", "example": 1, "name": "job_type"}], "tags": ["JobCertification", "ReadonlyAccess"], "summary": "List Job Certifications", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"job": {"$ref": "#/definitions/JobCertification"}}}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/nature-groups/": {"get": {"description": "Returns the natures list. Anyone can list the natures. When the\ncustomer wants to translate a fixed document you can list the types\nof fixed documents in the `Fixed Document` section.\n", "parameters": [{"required": false, "type": "integer", "name": "group_type", "enum": [0, 1], "description": "The type of the nature group.\n\n- `0`: This means that this nature group contains natures for\n live projects.\n\n- `1`: This means that this nature group contains natures for\n document projects.\n"}], "tags": ["Nature", "ReadonlyAccess"], "summary": "List Nature Groups", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"natures_groups": {"items": {"$ref": "#/definitions/NatureGroup"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/schools/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"schools": {"items": {"$ref": "#/definitions/School"}, "type": "array"}}}}, "401": {"description": "The user is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns a list of schools. This endpoint is accessible by any autheticated user.\n", "tags": ["School"], "security": [{"apiKey": []}], "summary": "List Schools"}}, "/jobs/requests/{request_id}/update/": {"put": {"description": "Only the translator can update the request. If the `is_accepted`\nfield is `false`, then the translator can provide details about why\ns/he chose to decline the job. A job can only be accepted from here.\nWhen a job request is updated, it will be closed. If you want to send\nanother request, you will need to create a new one.\n\n`is_accepted` field **IS MANDATORY unless `is_cancelled` is\nprovided.**. If a job request is canceled, the `is_accepted` field\nwill be set to false. **Only the customer can cancel the request.**\nIf the translator tries to cancel, you'll get `HTTP 403`.\n\nIf the job request was previously processed, you'll get `HTTP 304`.\n\nIf the job is accepted, the job's status will be set to `active` and\nthe translator will be assigned to it. If the job is NOT accepted,\nthe job's status will be `draft`.\n\nIf a document job is accepted, the job start date will be the date it\nwas accepted. You cannot respond to an\nexpired job request.\n\nJob status change:\n - If the job request is being created, set the job status to\n `offer`.\n - If the request is accepted, set the job status to `active`.\n + Assign the translator to the job\n + Create a payout for the job.\n - If the request is declined, set the job status to `draft`.\n + Job's job_distance is set to 0.\n - If the request is canceled, set the job status to `draft`.\n + Job's job_distance is set to 0.\n + If a translator belonged to the job, and a payout exists they\n will both be removed and the status of the payout will be\n invalid.\n + If the job type is document and the translator had some\n documents associated with him/her, those documents will be\n assigned to the new translator once a new one is assigned.\n - If the request has expired, set the job status to `draft`.\n + Job's job_distance is set to 0.\n\n# Push Notification\n\nWhen the job request is updated, the following push notification is\nsent to the translator. `target_user` is the user who will receive\nthe notification.\n\n```json\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 2,\n \"target_user\": 3\n }\n}\n```\n", "parameters": [{"in": "path", "description": "The request ID", "format": "int32", "required": true, "type": "integer", "name": "request_id"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/JobRequestUpdate"}}], "tags": ["Job Request"], "summary": "Update Job Request", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"job_request": {"$ref": "#/definitions/JobRequest"}}}}, "400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The job request was found but the authenticated user does not\nhave access to it.\n", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "The job request was previously processed, nothing is done.\n"}}}}, "/login/": {"post": {"responses": {"200": {"description": "Successful login."}, "400": {"description": "Wrong credentials.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Users log in using email and password to Cuz Translation. The\npassword may be a temporary password that was requested using the\n`/users/temporary-password/` endpoint or the user's actual password.\n\nIf the user has an active temporary password, that password is tried\nfirst. If that doesn't succeed and the user's account has a password,\nthen the password is matched against that one. If that doesn't work\neither, the authentication will fail.\n\nIf the user has a temporary password for reset, and they sucesfull log\nin here without using it then the password reset process will be\ncanceled.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"platform": {"format": "platform", "enum": [0, 1, 2, 3, 4, 5], "type": "integer", "example": 1, "description": "See the top of the documentation for options. This will change\nthe format of the login URL.\n\n- `0`: Not specified\n\n- `1`: iOS\n\n- `2`: Android\n\n- `3`: Web\n\n- `4`: Windows\n\n- `5`: macOS\n"}, "password": {"required": true, "type": "string", "description": "Account password or temporary password.", "example": "super_safe_password"}, "email": {"format": "email", "required": true, "type": "string", "example": "customer@email.com", "description": "Email for the user"}}}}], "tags": ["User Profile"], "summary": "Login"}}, "/jobs/requests/{request_id}/": {"get": {"description": "You can see the details of a JobRequest here. If the JobRequest does\nnot belong to the authenticated user, you'll get a permission denied\nerror. The customer who belong to the job and the translator who\nbelong to the job request can see the details here.\n", "parameters": [{"in": "path", "description": "The request ID", "format": "int32", "required": true, "type": "integer", "name": "request_id"}], "tags": ["Job Request"], "summary": "Get Job Request Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"job_request": {"$ref": "#/definitions/JobRequest"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The job request was found but the authenticated user does not\nhave access to it.\n", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The job request cannot be found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/users/scheduled-emails/": {"post": {"description": "Customer emails can be scheduled to hit this endpoint to send the\nemails. This endpoint will only be called from Cloud Tasks.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"email_type": {"format": "int32", "type": "number", "description": "A customer email type. If the email type is not recognized,\nthis endpoint will fail silently.\n", "example": 35}, "user_profile": {"format": "int64", "type": "integer", "example": 2, "description": "User ID for the email recipient. If the user with the given\nID does not exist, this endpoint will fail silently.\n"}}}}], "tags": ["User Profile"], "summary": "Send A Scheduled Email", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response."}}}}, "/devices/{device_id}/": {"put": {"responses": {"400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "No new information was given."}, "403": {"description": "The authenticated user is not allowed access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Device doesn't exist.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "The edited device.", "schema": {"type": "object", "properties": {"device": {"$ref": "#/definitions/Device"}}}}}, "description": "Edit an existing device. If the new device_id already exists for the user, you'll get a parameter error.\n", "parameters": [{"required": true, "type": "integer", "name": "device_id", "in": "path"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/DeviceUpdate"}}], "tags": ["Device"], "summary": "Edit an existing device."}, "delete": {"responses": {"200": {"description": "Successfully deleted.", "schema": {"type": "object", "properties": {"device": {"$ref": "#/definitions/Device"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The authenticated user is not allowed access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Device doesn't exist.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Delete an existing device.\n", "parameters": [{"required": true, "type": "integer", "name": "device_id", "in": "path"}], "tags": ["Device"], "summary": "Delete an existing device."}}, "/translators/{translator_id}/": {"get": {"description": "Returns the information about the translator. The user with the\n`translator_id` must have a translator profile for this endpoint.\nIf the translator is inactive then s/he will not be shown here unless\nthe authenticated user is an admin. A translator profile is private\nas long as it remains inactive.\n", "parameters": [{"required": true, "type": "integer", "name": "translator_id", "in": "path"}], "tags": ["Translator"], "summary": "Get Translator Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"translator": {"$ref": "#/definitions/Translator"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here. This is because the Translator is\nnot et active.\n", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator is not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/education-history/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"education": {"$ref": "#/definitions/Education"}, "upload_url": {"format": "url", "type": "string", "example": "https://storage.google.com/upload-url", "description": "The document must be uploaded to this URL by the client.\nIf a document is not supposed to be uploaded, this field\nwill be an empty string.\n"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Add an entry for an education history for the translator. You cannot\nadd the same education data more than once.\n\nThe translator does not need to always upload a file for the ducation\nentry. In tat case, you can leave the file related fields empty.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"$ref": "#/definitions/Education"}}], "tags": ["Translator Profile"], "summary": "Add Education History"}, "get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"education_history": {"items": {"$ref": "#/definitions/Education"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Translator Profile"], "description": "Lists the education hisotry for the authenticated translator.\n", "summary": "List Education History"}}, "/users/{user_profile_id}/edit/": {"put": {"description": "No parameter is required here. You just need to include the ones that you want updated. Only admins and the\nprofile owner can update user.\n", "parameters": [{"required": true, "type": "integer", "name": "user_profile_id", "in": "path"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/UserUpdate"}}], "tags": ["User Profile"], "deprecated": true, "summary": "Update User Profile", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "User not modified."}, "403": {"description": "Only admins and the user can update user.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "User not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful response. If token is refreshed, returns the new token.", "schema": {"type": "object", "properties": {"profile": {"$ref": "#/definitions/UserProfile"}, "token": {"type": "string"}}}}}}}, "/translator-profile/government-ids/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"government_id": {"$ref": "#/definitions/GovernmentID"}, "upload_url": {"format": "url", "type": "string", "example": "https://storage.google.com/upload-url", "description": "The ID must be uploaded to this URL by the client.\n"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Add a government ID to the translator. Once the government id is\ncreated, the file has to be uploaded from the client side to the\nreturned upload url.\n\nThe `Origin` header must be present in the request headers when the\nrequest is coming from a web client. Otherwise you won't be able to\nupload a file.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"$ref": "#/definitions/GovernmentID"}}], "tags": ["Translator Profile"], "summary": "Create Government ID"}, "get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"government_ids": {"items": {"$ref": "#/definitions/GovernmentID"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Translator Profile"], "description": "Returns the list of government IDs for the translator.\n", "summary": "List Government IDs"}}, "/penalties/": {"get": {"description": "This is where you can list penalties. This endpoint is accessible by system managers. And translators can only\nlist penalties that **belong to them**.\n", "parameters": [{"description": "This is the ID of the user whose penalties we want to see. If a the authenticated user is not a system\nmanager, this parameter is automatically set to the authenticated user's profile ID. If the authenticated\nuser **is a system manager**, this parameter is **required**.\n", "in": "query", "required": false, "type": "integer", "example": 2, "name": "user_profile"}, {"required": false, "in": "query", "description": "The status of the penalty.\n\n- `0` (incurred): This means that the penalty was fully applied to the target.\n\n- `1` (cancelled): This means that the penalty was cancelled and will not be applied to the target.\n\n- `2` (partial): This means that the penalty was partially subjected and there is still money that needs to\n be taken from the target.\n", "name": "status", "example": 0}, {"in": "query", "description": "This is the start date for the `payout_date` field.", "format": "date-time", "required": false, "type": "string", "example": "2018-02-05T12:33", "name": "payout_start_date"}, {"in": "query", "description": "This is the end date for the `payout_date` field.", "format": "date-time", "required": false, "type": "string", "example": "2018-02-06T12:33", "name": "payout_end_date"}, {"in": "query", "description": "This is the start date for the `creation_date` field.", "format": "date-time", "required": false, "type": "string", "example": "2018-02-05T12:33", "name": "creation_start_date"}, {"in": "query", "description": "This is the end date for the `creation_date` field.", "format": "date-time", "required": false, "type": "string", "example": "2018-02-06T12:33", "name": "creation_end_date"}], "tags": ["Penalty"], "summary": "List Penalties", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"penalties": {"items": {"$ref": "#/definitions/Penalty"}}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/users/": {"get": {"description": "Only admins can list users. This will list the users registered in the system. These users include system\nmanagers, customers and translators.\n", "parameters": [{"in": "query", "description": "The page to show. If this is not provided, the first page will be returned.", "format": "int32", "required": false, "type": "integer", "name": "page"}, {"in": "query", "description": "The number of admins to show in a list. This defaults to 10", "format": "int32", "required": false, "type": "integer", "name": "page_item_count"}, {"in": "query", "description": "General search. Only searches in `username`, `email`, `first_name` and `last_name`.", "format": "char[254]", "required": true, "type": "string", "name": "q"}, {"in": "query", "description": "Username for the user", "format": "char[150]", "required": true, "type": "string", "name": "username"}, {"in": "query", "description": "Name of the user", "format": "char[30]", "required": false, "type": "string", "name": "first_name"}, {"in": "query", "description": "Surname of the user", "format": "char[30]", "required": false, "type": "string", "name": "last_name"}, {"in": "query", "description": "Email of the user", "format": "char[254]", "required": false, "type": "string", "name": "email"}, {"in": "query", "description": "Phone of the user", "format": "char[15]", "required": false, "type": "string", "name": "phone"}, {"in": "query", "description": "Birthday of the user", "format": "date", "required": false, "type": "string", "name": "birthday"}, {"in": "query", "description": "Join date of the user", "format": "date", "required": false, "type": "string", "name": "join_date_start"}, {"in": "query", "description": "Join date of the user", "format": "date", "required": false, "type": "string", "name": "join_date_end"}, {"in": "query", "description": "See the top of the documentation for options.", "format": "char[5]", "required": false, "type": "string", "name": "gender"}, {"in": "query", "description": "Address of the user", "format": "char[1024]", "required": false, "type": "string", "name": "address"}, {"required": false, "type": "boolean", "description": "Translator check of the user", "in": "query", "name": "is_translator"}], "tags": ["User"], "summary": "List Users", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"$ref": "#/definitions/UserProfile"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins can list customers.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/languages/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"languages": {"items": {"$ref": "#/definitions/Language"}, "type": "array"}}}}}, "description": "Returns the languages list.", "tags": ["Language", "ReadonlyAccess"], "security": [{"apiKey": []}], "summary": "List Languages"}}, "/translators/{translator_id}/edit/": {"put": {"description": "If updating the translator succeeds an empty JSON is returned,\notherwise an error message is returned. No parameter is required here.\nYou just need to include the ones that you want updated. Only admins\nhave access to the `is_active` field and admins cannot change\nanything else. The user can change the `is_active` field.\n\nIf the translator is active, the changes the the profile owner makes\nis sent to the system managers for validation. Until the system\nmanagers accept the profile changes, the new changes won't be seen\npublicly. This request is only available to admins. Every new request\ninvalidates the one that came before it. So, a request is only active\nuntil a new one is created or it is approved. If the translator is\nnot active, the changes won't require validation from admins.\n\nIf the translator's application was previously declined, then a new\nchange to the profile will create another TranslatorRequest so that\nthe admins can check them out.\n\nA change in the `user_profile` does not warrant for a profile edit\nrequest.\n\n**If an admin changes the profile, the changes will take effect\nimmediately.**\n", "parameters": [{"required": true, "type": "integer", "name": "translator_id", "in": "path"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/TranslatorUpdate"}}], "tags": ["Translator"], "summary": "Update Translator", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "Translator not modified."}, "403": {"description": "Only admins and the owner can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator is not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "If the profile change requires a request, the translator will be\n`null` and the `request` will have the changed fields. If there's\nno need for a profile edit request, then the `translator` will\nhave the updated version and the `request` will be `null`\n", "schema": {"type": "object", "properties": {"translator": {"$ref": "#/definitions/Translator"}}}}}}}, "/notifications/{notification_id}/": {"put": {"responses": {"200": {"description": "The edited notification.", "schema": {"type": "object", "properties": {"notification": {"$ref": "#/definitions/Notification"}}}}, "304": {"description": "No new information was given."}, "403": {"description": "The authenticated user is not allowed access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Device doesn't exist.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Mark an existing notification as read. If the notification was already marked as true,\nyou'll get `HTTP 304`.\n", "parameters": [{"required": true, "type": "integer", "name": "notification_id", "in": "path"}], "tags": ["Notification"], "summary": "Mark a notification as read."}}, "/jobs/documents/{file_id}/": {"put": {"description": "Translator can update a file to change the number of translated pages\nfor the document. When that number changes, a `ProgressReport`\nobject will be created with the new number.\n\nOnly translators can access this endpoint and only\n`translated_page_count` and `status` fields can be changed.\n\n# Prerequisite\n\nJob status must be `active` to report progress.\n\n# Reporting Progress\n\nWhen reporting progress, only the `translated_page_count` field is\nrequired. Translators report progress on customer documents and\nproofreaders report progress on translator documents.\n\n# Status Changes\n\nTranslator can change the status of the document to `completed` to\nindicate that proofreader can start working on it.\n\nStatus change can only be done on the document that the authenticated\ntranslator owns. `translated_page_count` is changed on the document\nthat the authenticated translator is **assigned** to.\n\nYou cannot provide `status` and `translated_page_count` at the same\ntime.\n\n-----\n\nIf no parameter is given, you'll get an `HTTP 400` error and\n`parameters` field of the error will be `null`.\n\n**Note:** This endpoint is only used by translators so a customer\nwill get a `HTTP 403`\nhere.\n", "parameters": [{"required": true, "type": "integer", "name": "file_id", "in": "path"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/JobDocumentUpdate"}}], "tags": ["Job Document"], "summary": "Update Job Document", "security": [{"apiKey": []}], "responses": {"304": {"description": "Job document cannot be changed."}, "400": {"description": "Parameter Error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access to the file or the job.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Document with the given ID doesn't exit.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful.", "schema": {"type": "object", "properties": {"job_document": {"$ref": "#/definitions/JobDocument"}}}}}}, "delete": {"description": "This is where you delete a file from the job. If job or the file is\nnot found you'll get an `HTTP 404` error. Only the owner of the file\ncan delete the file. If the authenticated user is trying to delete a\nfile that does not belong to him/her, they'll get an `HTTP 403`\nerror.\n\nIf the document belongs to a finished or active job, it cannot be\ndeleted. THe exception is, while the job status is active the\ntranslator can manage his/her documents.\n", "parameters": [{"required": true, "type": "integer", "name": "file_id", "in": "path"}], "tags": ["Job Document"], "summary": "Delete Job Document", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successfully deleted. Returns the details of the deleted resource.\n", "schema": {"type": "object", "properties": {"job_document": {"$ref": "#/definitions/JobDocument"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "400": {"description": "Cannot Delete", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User does not have access to the file or the job.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job with the given ID doesn't exit.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "This is where you can get the details of a `JobDocument`. You can use\nthe `status_only` parameter to check for the status of the document.\n", "parameters": [{"description": "If set to true, only returns the status field of the job document.\n", "in": "query", "required": false, "type": "boolean", "example": false, "name": "status_only"}], "tags": ["Job Document"], "summary": "Get Job Document", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful Response.", "schema": {"type": "object", "properties": {"job_document": {"$ref": "#/definitions/JobDocument"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User Doesn't Have Access to Document.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Document Does not Exist.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-ratings/": {"get": {"description": "Returns the translator rating list. **Only system managers can use this endpoint.**\n", "parameters": [{"required": false, "type": "integer", "description": "When this is given, the list is narrowed down to only this translator", "in": "query", "name": "translator"}, {"required": false, "type": "integer", "description": "When this is given, the list is narrowed down to only this translator", "in": "query", "name": "customer"}, {"required": false, "type": "integer", "description": "Influence Rating. This is between 1 and 5 inclusive.", "in": "query", "name": "influence_rating"}, {"required": false, "type": "integer", "description": "Presentation Rating. This is between 1 and 5 inclusive.", "in": "query", "name": "presentation_rating"}, {"in": "query", "description": "The page to show. If this is not provided, the first page will be returned.", "format": "int32", "required": false, "type": "integer", "name": "page"}, {"in": "query", "description": "The number of users to show in a list. This defaults to 10", "format": "int32", "required": false, "type": "integer", "name": "page_item_count"}, {"in": "query", "description": "General search. This only searches in customer's/translator's `email`, `first_name`, `last_name`\nand `username`.\n", "format": "char[254]", "required": false, "type": "string", "name": "q"}], "tags": ["Translator Rating"], "summary": "List Translator Ratings", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"translator_ratings": {"items": {"$ref": "#/definitions/TranslatorRating"}, "type": "array"}, "translator_rating_count": {"type": "integer", "description": "The total number of translator ratings in this page."}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/requests/": {"post": {"description": "Here you can create a job request for a translator. There can only\nexist one active job request. A new one cannot be created before the\ncurrent one is responded by a translator. A job request cannot be sent\nfor an active job.\n\nIf the job is already active and has a translator you'll get the error\ncode `job_already_active`.\n\nIf you choose to auto assign a translator, you can skip the\n`translator` parameter. If no translator can be assigned HTTP 400 will\nbe returned with the error status of `cannot_auto_assign_translator`.\n\n# Push Notification\n\nPush notifications are sent periodcally depending on the end date of\nthe request. Until the job request has expired, the translator will\nkeep receiving notifications If they do not respond to the request.\nWhen the job request is created, the following push notification is\nsent to the translator. `target_user` is the user who will receive the\nnotification.\n\n```json\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 1,\n \"target_user\": 3\n }\n}\n```\n\n## Push Notification Frequency\n\nThe first push notification is sent as soon as the job request is\ncreated. After the 30% of the response time has passed, there will be\n10 push notifications with varying frequncy depending on the request's\nend date.\n\n**Note**\n\nIf the customer does not have a payment method, `HTTP 402` will be\nreturned.\n\n# Error Codes\n\n- parameter_error\n- delivery_required\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/JobRequestCreate"}}], "tags": ["Job Request"], "summary": "Create Job Request", "security": [{"apiKey": []}], "responses": {"304": {"description": "A job request for this job already exists and it's awaiting a\nresponse from the translator.\n"}, "400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "402": {"description": "Customer does not have any payment method.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The authenticated user does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "The job no longer exists.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"job_request": {"$ref": "#/definitions/JobRequest"}}}}}}, "get": {"description": "This is where the job requests are listed. Only translators and admins\nare allowed here. But If the authenticated user is translator or a\ncustomer, they will only see the requests that belong to them. When a\ntranslator is listing the job requests, only the unexpired job\nrequests are shown.\n\n**Unless otherwise mentioned, always the unexpired requests are listed\nhere.**\n\n**This endpoint is only accessible by translators and system managers.**\n", "parameters": [{"in": "query", "description": "The page to show. If this is not provided, the first page will be\nreturned.\n", "format": "int32", "required": false, "type": "integer", "name": "page"}, {"in": "query", "description": "The number of jobs to show in a list. This defaults to 10", "format": "int32", "required": false, "type": "integer", "name": "page_item_count"}, {"required": false, "type": "integer", "description": "Translator ID. If this is not given, the authenticated translator ID\nwill be used. If the authenticated user is not a translator, then\nall of the job requests will be listed.\n", "in": "query", "name": "translator"}, {"in": "query", "description": "Request date", "format": "dateTime", "required": false, "type": "string", "name": "request_date"}, {"required": false, "type": "boolean", "description": "If this is left blank, only the requests that were not responded\nwill be listed.\n", "in": "query", "name": "is_accepted"}, {"required": false, "type": "boolean", "description": "The default value is `false`", "in": "query", "name": "is_expired"}], "tags": ["Job Request"], "summary": "List Job Reqests", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"job_requests": {"items": {"$ref": "#/definitions/JobRequest"}, "type": "array"}}}]}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/addresses/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"translator_address": {"$ref": "#/definitions/TranslatorAddress"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Create a new address for a translator. You cannot have more than one\naddress for the same type.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"$ref": "#/definitions/TranslatorAddress"}}], "tags": ["Translator Profile"], "summary": "Create Translator Address"}, "get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"translator_addresses": {"items": {"$ref": "#/definitions/TranslatorAddress"}, "type": "array"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Translator Profile"], "description": "Returns the contact address of the translator. The contact address\nis added after the translator registration is initialized. So, If\nyou have not added the address, this endpoint will return `HTTP 404`.\n", "summary": "List Translator Addresses"}}, "/referrals/": {"get": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"referrals": {"items": {"$ref": "#/definitions/ReferralSummary"}, "type": "array"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Referral"], "description": "This endpoint lists the referrals that are assigned to a customer.\n", "summary": "List Referrals"}}, "/countries/{country_id}/provinces/": {"get": {"responses": {"200": {"description": "Returns the list of provinces.", "schema": {"type": "object", "properties": {"provinces": {"items": {"$ref": "#/definitions/Province"}, "type": "array"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "A country with the given ID does not exist.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "This endpoint is used to list the provinces of a country in the\ndatabase.\n\nAny user type can access this endpoint, but they must be\nauthenticated.\n", "parameters": [{"required": true, "type": "integer", "name": "country_id", "in": "path", "format": "int32"}], "tags": ["Province", "ReadonlyAccess"], "summary": "List Provinces"}}, "/jobs/{job_id}/all-requests/": {"get": {"description": "This endpoint lists the `JobRequest`, `CompletedRequest`, and\n`DelayRequest`s that belong to the job. If the authenticated user is\nnot the customer, this endpoint will only lists the requests that\nbelong to the translator/proofreader.\n\nIf the authenticated user doesn't belong to the job, the lists will\nbe empty.\n", "parameters": [{"in": "path", "description": "The job ID.", "format": "int32", "required": true, "type": "integer", "name": "job_id"}], "tags": ["Job"], "summary": "List Job's Requests", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"job_requests": {"items": {"$ref": "#/definitions/JobRequest"}, "type": "array"}, "delay_requests": {"items": {"$ref": "#/definitions/DelayRequest"}, "type": "array"}, "completed_requests": {"items": {"$ref": "#/definitions/CompletedRequest"}, "type": "array"}}}}, "401": {"description": "Not Authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job Not Found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/users/temporary-password/": {"post": {"description": "Using this endpoint, you can request a temporary password. When you\nrequest a temporary password that password will only be available for\n3 minutes. After that, you will need to request a new one.\n\nAlternatively, you can use this endpoint to request a password reset.\nIn that case, just provide `reset_password` field in the payload and\nset it to `true`. When a password request is in effect, user can only\nuse the generated passwords. Those generated passwords also have a\n3 minute life span. When those expire, you can request for more\ntemporary passwords.\n\nTemporary password cannot be requested anymore If there are already 3\nexisting passwords. They will need to be expired before a new one can\nbe generated.\n\nGenerated passwords wil be sent to the user's email address. This\nendpoint does not check If the email address is in the system or not.\nSo, you will always get `HTTP 200` If the operation succeeds.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"password_type": {"format": "int32", "enum": [0, 1, 2], "type": "integer", "example": 0, "description": "Indicates the type of the password. Defaults to log in.\n\n- `0` (login): Used to log in.\n\n- `1` (signup): Used to sign up.\n\n- `2` (signup): Used to reset password.\n"}, "email": {"type": "string", "example": "user@email.com", "format": "char[128]"}}}}], "tags": ["User Profile"], "summary": "Request Temporary Password", "security": [{"apiKey": []}], "responses": {"304": {"description": "There are already 3 active temporary passwords."}, "201": {"description": "Successful response."}, "400": {"description": "Parameter error ocurred.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "A user with the email address does not exist.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/references/{reference_id}/": {"delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"reference": {"$ref": "#/definitions/TranslatorReference"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Deletes a reference from the translator.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "reference_id"}], "tags": ["Translator Profile"], "summary": "Delete a Reference"}}, "/translator-profile/experiences/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"experience": {"$ref": "#/definitions/TranslationExperience"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Add an experience related to a language pair and service type to the\ntranslator.\n\nWhen adding an experience, the translator must already be providng\nservice for the given `service_type` and they should already be\nproviding translation/interpretation for the given `language_pair`.\n\nSo before running this endpoint, make sure to update the language\nservices and the language pairs first.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"allOf": [{"$ref": "#/definitions/TranslationExperience"}, {"$ref": "#/definitions/LanguagePairID"}]}}], "tags": ["Translator Profile"], "summary": "Add an Experience"}, "get": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"experiences": {"items": {"$ref": "#/definitions/TranslationExperience"}, "type": "array"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Lists the experiences of the authenticated translator.\n", "parameters": [{"required": false, "description": "The service type indicates whether this is an interpretation or\ntranslation service.\n", "format": "char[16]", "enum": ["TRANSLATION", "INTERPRETATION"], "in": "query", "type": "string", "example": "TRANSLATION", "name": "service_type"}], "tags": ["Translator Profile"], "summary": "List Experiences"}}, "/notifications/": {"get": {"responses": {"200": {"description": "List of notifications.", "schema": {"type": "object", "properties": {"notifications": {"items": {"$ref": "#/definitions/Notification"}, "type": "array"}, "next_page": {"type": "integer", "description": "If there's no next page, this will be None", "example": 3}, "has_previous_page": {"type": "boolean", "example": true}, "previous_page": {"type": "integer", "description": "If there's no next page, this will be None", "example": 1}, "page_count": {"type": "integer", "example": 3}, "has_next_page": {"type": "boolean", "example": true}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The authenticated user is not allowed access here.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Returns the list of notifications for the authenticated user. The notification listing is always done by\nshowing the recent items first.\n", "parameters": [{"in": "query", "description": "The date to start showing notifications.", "format": "dateTime", "required": false, "type": "string", "name": "sent_date_begin"}, {"in": "query", "description": "The date to end showing notifications.", "format": "dateTime", "required": false, "type": "string", "name": "sent_date_end"}, {"required": false, "type": "boolean", "description": "If set to true, only read notifications will be listed. If set to false, only unread notifications will be\nlisted.\n", "in": "query", "name": "is_read"}, {"required": false, "type": "integer", "description": "Defaults to 0.", "in": "query", "name": "page"}, {"required": false, "type": "integer", "description": "If this is set, only the last given number of notifications will be listed. If this is used,\nsent_date_begin and sent_date_end are ignored.\n", "in": "query", "name": "show_last_items"}, {"required": false, "type": "integer", "description": "The number of notifications to show in a list. This defaults to 10", "in": "query", "name": "page_item_count"}], "tags": ["Notification"], "summary": "Returns the list of notifications."}}, "/translators/bank-accounts/": {"post": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"bank_account": {"$ref": "#/definitions/BankAccount"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Creates a bank account for the authenticated translator. Only one\naccount with the same details can exist. If the same account exists,\nyou should go on and activate that one again.\n\nIf a PayPal account is not provided, the other fields are required.\n", "parameters": [{"in": "body", "name": "payload", "schema": {"$ref": "#/definitions/BankAccount"}}], "tags": ["BankAccount"], "summary": "Create Bank Account"}, "get": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"bank_accounts": {"items": {"$ref": "#/definitions/BankAccount"}, "type": "array"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Lists the bank accounts for the authenticated translator.\n", "parameters": [{"description": "If set to true, only active bank accounts will be listed. Which\nwill always be 1 account. If set to false, only reactive accounts\nwill be listed.\n", "in": "query", "required": false, "type": "bool", "example": false, "name": "is_active"}], "tags": ["BankAccount"], "summary": "List Bank Accounts"}}, "/jobs/{job_id}/available-translators/": {"get": {"description": "Here, you can list the available translators for a job. Obviously,\nthe translators should know the languages in `from_langauge` and\n`to_language`.\n\n# LAO Projects\n\nWhen listing for LAO projects, the translators that have previously\nreceived a project request will not be excluded. Also, nature field\nof the job will not effect the listed translators.\n\n# Translator Listing for Live Jobs\n\nWhen searching for translators for live jobs, these are the conditions:\n\n- The translator does not have another job during the job's time.\n- The translator must have checked \"Available For Live Job\" section\n in their profile\n- The translator must reside within his/her max_job_distance for\n work. If the distance between translators location and the job is\n bigger than max_job_distance, that translator will not be listed\n here. This can be disabled by using the `disable_max_distance`\n parameter.\n- The translator must have the job's nature in his/her nature list.\n This can be disabled by using the `disable_nature` parameter.\n\n# Translator Listing for Document Jobs\n\nWhen searching for translators for document jobs, these are the\nconditions:\n\n- The translator must have checked \"Available For Document Job\"\n section in their profile\n- The translator must have the job's nature in his/her nature list.\n This can be disabled by using the `disable_nature` parameter.\n\n----\n\nWe first eliminate any translator who has a job during the new job's\ntime. Then we go for max_job_distance check (Unless it is disabled),\nand then we go for nature check.\n\nTranslators are listed in descending order for their years of\nexperience and profile strength.\n", "parameters": [{"required": true, "type": "integer", "name": "job_id", "in": "path"}, {"in": "query", "description": "The page to show. If this is not provided, the first page will be\nreturned.\n", "format": "int32", "required": false, "type": "integer", "name": "page"}, {"in": "query", "description": "The number of jobs to show in a list. This defaults to 10", "format": "int32", "required": false, "type": "integer", "name": "page_item_count"}, {"required": false, "type": "boolean", "description": "If you don't want to match for nature of the job, you can set this\nto true. If this is omitted, it is treated as being false.\n", "in": "query", "name": "disable_nature"}], "tags": ["Job", "Translator", "ReadonlyAccess"], "summary": "List Available Translator for Job", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"translators": {"items": {"$ref": "#/definitions/TranslatorSummary"}, "type": "array"}, "translator_count": {"type": "integer", "description": "This is the number of translators that's in the\nfiltered list. It does **NOT** represent the total\nnumber of translators.\n", "example": 30}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Given job cannot be found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translators/ratings/{rating_id}/": {"put": {"description": "Only the customer who submitted the rating can update the details. If someone else tries to do it,\nthey'll get `HTTP 403`.\n", "parameters": [{"in": "path", "description": "ID for the translator rating", "format": "int32", "required": true, "type": "integer", "name": "rating_id"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/TranslatorRating"}}], "tags": ["Translator Rating"], "summary": "Update Translator Rating", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"translator_rating": {"$ref": "#/definitions/TranslatorRating"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The owner can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator rating is not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "Returns a detailed information about the translator rating. Only the customer who created the rating and the\ntranslator can see the rating.\n", "parameters": [{"in": "path", "description": "ID for the rating", "format": "int32", "required": true, "type": "integer", "name": "rating_id"}], "tags": ["Translator Rating"], "summary": "Get Translator Rating Details", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"translator_rating": {"$ref": "#/definitions/TranslatorRating"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins and owner can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator rating is not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/referral/": {"get": {"responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"referral": {"$ref": "#/definitions/ReferralSummary"}}}}, "401": {"description": "The user is not authenticated", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "The user has no access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Referral code does not exist.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Use this endpoint to view the details of a referral code. This can\nbe used to show who a referral code belongs to or show the details\nof the referral.\n\nIf the client is using this endpoint to see who the referral code\nbelongs to, then only the `owner` field will have the details. All\nthe other fields will exist but be `null`.\n", "parameters": [{"in": "query", "description": "The referral code to show the details for.\n", "format": "char[16]", "required": false, "type": "string", "name": "referral_code"}], "tags": ["Referral", "ReadonlyAccess"], "summary": "Show Referral Detail"}}, "/translator-request/{request_id}": {"put": {"description": "No parameter is required here. You just need to include the ones that you want updated.\n", "parameters": [{"required": true, "type": "integer", "description": "Identifier for the translator request.", "in": "path", "name": "request_id"}, {"required": true, "in": "body", "description": "Accept/Decline for the request", "name": "body", "schema": {"type": "object", "properties": {"is_accepted": {"type": "boolean", "description": "Accept/Decline for the request. This field is required."}, "admin_note": {"type": "string", "description": "This field is not required.", "format": "char[1024]"}}}}], "tags": ["Translator Request"], "summary": "Update Translator Request", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the updated resource.", "schema": {"type": "object", "properties": {"translator_request": {"$ref": "#/definitions/TranslatorRequest"}}}}, "304": {"description": "Translator request not modified."}, "403": {"description": "is_accepted field can only be updated by the admins.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator is not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/{job_id}/documents/export/": {"get": {"description": "This endpoint returns a hierarchial view of all the documents that\nbelongs to the job. If translators has not yet uploaded documents,\n`file_tree` will be null.\n", "parameters": [{"required": true, "type": "integer", "name": "job_id", "in": "path"}, {"required": false, "type": "integer", "description": "If this parameter is provided, only the translated documents for\nthis document will be generated.\n", "in": "path", "name": "target_document"}], "tags": ["Job Document"], "summary": "Export Documents", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful.", "schema": {"type": "object", "properties": {"file_tree": {"$ref": "#/definitions/DocumentExport"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User Doesn't Have Access to Document.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job Does not Exist.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/certification-generation/": {"post": {"description": "Using this endpoint, you can create a `JobDocument` for a `JobCertification`.\nThe `JobCertification` will have to have an associated template with it.\n\nUnless explicitly provided, when generating the certification, the default\nattached one is used.\n\nOnce the generation begins, the status of the returned document will be\n`STATUS_GENERATING`. Once the generation is completed the status will be\n`STATUS_READY`. So, throughout the generation process, you'll need to send\na request to check the progress of the generation.\n\nThis endpoint is only open to translators for now. So the owner of the\ngenerated document will be the authenticated translator.\n", "parameters": [{"required": true, "type": "object", "name": "body", "in": "body", "schema": {"type": "object", "properties": {"job": {"format": "int64", "type": "int", "example": 3, "description": "The job for which the certification is being generated."}, "source_document": {"type": "int", "description": "The document ID for which this certification is being generated.\n", "format": "int64"}, "job_certification": {"format": "int64", "type": "int", "example": 2, "description": "Optional certification ID. If not provided, the certification for\nthe Job will be used.\n"}}}}], "tags": ["Job"], "required": ["job"], "summary": "Generate a Certification Document", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error ocurred.", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "The given certification did not have a template for it."}, "403": {"description": "Not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Any of the given resources do not exist.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "This endpoint always returns 200."}, "303": {"description": "The certification was already exported. See the `Location` header in the\nresponse. The content of the `Location` header will be an integer pointing\nto the ID of the exported document.\n"}}}}, "/translator-profile/language-pairs/{pair_id}/": {"delete": {"responses": {"200": {"description": "Succesful response. Returns removed resource.", "schema": {"type": "object", "properties": {"language_pair": {"$ref": "#/definitions/LanguagePair"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Remove a language pair from the translator.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "pair_id"}], "tags": ["Translator Profile"], "summary": "Remove A Language Pair From Translator"}}, "/countries/peek/": {"get": {"responses": {"200": {"description": "Returns the list of countries", "schema": {"type": "object", "properties": {"province": {"$ref": "#/definitions/Province"}, "country": {"$ref": "#/definitions/Country"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Country doesn't exist.", "schema": {"$ref": "#/definitions/Error"}}}, "properties": [{"required": true, "type": "string", "name": "country_code", "format": "char[3]"}, {"format": "char[128]", "required": false, "type": "string", "description": "Looks for an case insensitive exact match for the given country.\n", "name": "province_name"}], "description": "You can use this endpoint to get the ID of a country, province.\nIf any of them is not found, that field will be null.\n\n**This endpoint will no longer update the cities.**\n", "tags": ["Country", "ReadonlyAccess"], "summary": "Peek at a Country"}}, "/translator/language-pairs/": {"post": {"description": "Adds a language pair to translator.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/LanguagePair"}}], "tags": ["Translator"], "summary": "Add Language Pair to Translator", "security": [{"apiKey": []}], "responses": {"304": {"description": "Translator already has the language pair. `Content-Location`\ncontains the ID of the langauge pair.\n"}, "201": {"description": "Successful response.", "schema": {"type": "object", "properties": {"language_pair": {"$ref": "#/definitions/LanguagePair"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admins and the owner can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/completed-requests/decline-reasons/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"decline_reasons": {"items": {"$ref": "#/definitions/CompletedRequestDeclineReason"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Lists the decline reasons.\n", "tags": ["Completed Request"], "security": [{"apiKey": []}], "summary": "List Completed Request Decline Reasons"}}, "/users/payment-methods/": {"post": {"responses": {"400": {"description": "Parameter error ocurred.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful.", "schema": {"type": "object", "properties": {"payment_method": {"$ref": "#/definitions/PaymentMethod"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Create a payment method for the authenticated user. The address field either be a dictionary containing the\ndefault address fields or an integer ID to an existing address. When the payment method is being created,\nan associated Stripe card will be created for the customer. You just need to tokenize the card information.\n\n`stripe_card_token` is mandatory.\n\nIf there is an error creating the card for the customer on stripe, `HTTP 400` will be returned and the\ngenerated error will have the following parameters:\n\n - `stripe_error_code`: The error code returned by Stripe.\n - `stripe_error_type`: The error type returned by Stripe.\n - `stripe_error_message`: The error message returned by Stripe.\n - `stripe_error_param`: The parameter that raised the error.\n\nHere's an example Stripe error response:\n\n```json\n{\n \"status\": {\n \"message\": \"An error ocurred while creating the card on Stripe.\",\n \"code\": 58,\n \"parameters\": {\n \"stripe_error_code\": [\"invalid_number\"],\n \"stripe_error_type\": [\"invalid_request_error\"],\n \"stripe_error_message\": [\"A message from Stripe.\"],\n \"stripe_error_param\": [\"number\"]\n }\n }\n}\n```\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"allOf": [{"$ref": "#/definitions/PaymentMethod"}, {"type": "object", "properties": {"stripe_card_token": {"format": "char[32]", "type": "string", "example": "tok_1C7p7k2eZvKYlo2Ckma3Dj9n", "description": "The token ID for the card being created."}}}]}}], "tags": ["Payment Method"], "summary": "Create Payment Method"}, "get": {"responses": {"200": {"description": "Succesful.", "schema": {"type": "object", "properties": {"payment_methods": {"items": {"$ref": "#/definitions/PaymentMethod"}, "type": "array"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "A user can list the payment methods that belong to him/her.\n", "parameters": [{"required": false, "in": "query", "description": "If this is set to true, only the default card will be listed. If there's no default card, the list will be\nempty.\n", "name": "default_only", "example": false}], "tags": ["Payment Method"], "summary": "List Payment Methods"}}, "/jobs/{job_id}/": {"put": {"description": "The customer who belong to the job can update the job.\n\nThis endpoint **cannot be used** to assign a translator or accept a\njob request. This is only used by the customer to update the job\ndetails before the job is taken by a translator. After a translator\ntakes the job, this endpoint cannot be used to upload a document or\ndelay the job. They both have their own endpoint.\n\n**These fields can only be updated while the job status is either\n`offer` or `draft`.** To complete the job you need to send a job\ncompleted request.\n\n**After the job is accepted by the translator, nothing can be changed\nexcept the job's end date.** Job documents are not handled here, so\nyou can use this endpoint as long as the job status is either `offer`\nor `draft`.\n\nIf the job's status is `completed` no changes can be made. So you'll\nget `HTTP 304`.\n\n# Changing the Job End Date\n\nIf you want to delay the job's end date, you need to use the\n`/jobs/{job_id}/delayed-request/new/` endpoint.\n\n# Referral Code\n\nIf the job does not have a referral code, you can add one here.\n", "parameters": [{"required": true, "type": "integer", "description": "Job identifier for the job", "in": "path", "name": "job_id"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/Job"}}], "tags": ["Job"], "summary": "Update Job", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the updated content.", "schema": {"type": "object", "properties": {"job": {"$ref": "#/definitions/Job"}}}}, "304": {"description": "No new information was given. Or the job's status is `completed`\nand cannot be changed.\n"}, "403": {"description": "This field can only be updated by the translator of the job.\n", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}, "delete": {"description": "Here, you can delete the job with the given ID. **Translators cannot\ndelete jobs.** Only admins and the job owners can delete the job.\n**You can only delete the jobs whose status is `draft`, `invalid`, or\n`failed`.**\n\nIf the status is `active` or `completed_request_sent`, you'll get\n`HTTP 400`. If the status is `completed`, the job will be archived.\nIf a translator sends this request to a completed job that he belongs\nto, that job will be archived for the translator.\n\n**This endpoint is accessible by all user types. But for customers and\ntranslators, they need to own the job with the given ID. Otherwise\nthey'll get 403 error.**\n", "parameters": [{"required": true, "type": "integer", "description": "Job ID", "in": "path", "name": "job_id"}], "tags": ["Job"], "summary": "Delete Job", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"job": {"$ref": "#/definitions/Job"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only admin can delete job.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job not found.", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "Job was already deleted or archived.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "Returns the job details. This endpoint is available to all user types.\n**But customer and translator can only see the details of the jobs\nthat are assigned to them**. But admins can see the job details for\nall jobs.\n\nIf a job was created using a referral, it will have a 'referral'\nparameter attached to it when returning the detail.\n\n# Payment\n\nFor document projects, the credit card will be charged when the\ntranslator accepts the request. But if charge was not successfully, we\nwill attempt to charge it here.\n\nIf the customer does have payment methods, but the card could not be\ncharged the code for the error will be `stripe_error` and the\ngenerated error will have the following parameters:\n\n - `stripe_error_code`: The error code returned by Stripe.\n - `stripe_error_type`: The error type returned by Stripe.\n - `stripe_error_message`: The error message returned by Stripe.\n - `stripe_error_param`: The parameter that raised the error.\n\n```json\n{\n \"status\": {\n \"message\": \"An error ocurred while creating the card\",\n \"code\": 58,\n \"parameters\": {\n \"stripe_error_code\": [\"expired_card\"],\n \"stripe_error_type\": [\"card_error\"],\n \"stripe_error_message\": [\"A message from Stripe.\"],\n \"stripe_error_param\": [\"number\"],\n 'stripe_decline_code': [\"decline_code\"]\n }\n }\n}\n```\n\nIf the card cannot be charged, the project will not be marked as\ndone. After the customer fixes the issue with the card, they can\napprove the same completed request again to finish the process.\n\n# Error Codes\n\nThese are the error codes that can be returned from this endpoint:\n\n - `payment_required`\n - `payment_method_stripe_error`\n - `stripe_card_error`\n - `stripe_error`\n - `parameter_error`\n", "parameters": [{"required": true, "type": "integer", "description": "Job ID", "in": "path", "name": "job_id"}], "tags": ["Job"], "summary": "Get Job Details", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "402": {"description": "Returns only purchase information.", "schema": {"allOf": [{"$ref": "#/definitions/Error"}, {"type": "object", "properties": {"job": {"$ref": "#/definitions/JobPaymentError"}}}]}}, "403": {"description": "Admin or the customer or the translator get job detail.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Job not found.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"job": {"$ref": "#/definitions/Job"}}}}}}}, "/token-refresh": {"post": {"responses": {"200": {"description": "Successful response", "schema": {"properties": {"token": {"type": "string", "example": "dont_expect_example_token_here"}}}}}, "description": "Use this endpoint to refresh a token. Every token has an expiration of 30\ndays. After that, a token **must** be refreshed.\n", "parameters": [{"required": true, "in": "body", "description": "The old token for the client", "name": "body", "schema": {"type": "object", "properties": {"token": {"type": "string"}}}}], "tags": ["Common"], "summary": "Refresh Token"}}, "/translator-profile/resumes/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"upload_url": {"format": "url", "type": "string", "example": "https://storage.google.com/upload-url", "description": "The ID must be uploaded to this URL by the client.\n"}, "resume": {"$ref": "#/definitions/Resume"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Add a resume to the translator. Once the resume is created, the file\nhas to be uploaded from the client side to the returned upload url.\n\nThe `Origin` header must be present in the request headers when the\nrequest is coming from a web client. Otherwise you won't be able to\nupload a file.\n", "parameters": [{"required": true, "in": "body", "name": "data", "schema": {"$ref": "#/definitions/Resume"}}], "tags": ["Translator Profile"], "summary": "Create Resume"}}, "/translator-requests/": {"get": {"description": "Returns the translator request list.", "parameters": [{"in": "query", "description": "Translator username for the requests", "format": "char[150]", "required": false, "type": "string", "name": "translator"}, {"in": "query", "description": "Admin username for the requests", "format": "char[150]", "required": false, "type": "string", "name": "admin"}, {"in": "query", "description": "Request date of the requests", "format": "date", "required": false, "type": "string", "name": "request_date_start"}, {"in": "query", "description": "Request date of the requests", "format": "date", "required": false, "type": "string", "name": "request_date_end"}, {"in": "query", "description": "Response date of the requests", "format": "date", "required": false, "type": "string", "name": "response_date_start"}, {"in": "query", "description": "Join date of the requests", "format": "date", "required": false, "type": "string", "name": "response_date_end"}, {"required": false, "type": "boolean", "description": "Set it to True to list the ones that are active, set to False to list the ones that are inactive. If the parameter is not provided all of the requests will be listed.", "in": "query", "name": "is_active"}, {"required": false, "type": "boolean", "description": "Accept/Decline for the translator request.", "in": "query", "name": "is_accepted"}, {"in": "query", "description": "The page to show. If this is not provided, the first page will be returned.", "format": "int32", "required": false, "type": "integer", "name": "page"}, {"in": "query", "description": "The number of users to show in a list. This defaults to 10", "format": "int32", "required": false, "type": "integer", "name": "page_item_count"}, {"in": "query", "description": "General search. This only searches in the translator's/admin's `email`, `first_name`, `last_name` and `username`.", "format": "char[254]", "required": true, "type": "string", "name": "q"}], "tags": ["Translator Request"], "summary": "List Translator Requests", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"translator_requests": {"items": {"$ref": "#/definitions/TranslatorRequest"}, "type": "array"}, "request_count": {"type": "integer", "description": "This is the number of translator requests that's in the filtered list. It does **NOT** represent\nthe total number of translator requests.\n", "example": 30}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access to that translator request.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Translator is not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/completed-requests/{request_id}/": {"put": {"description": "When the completed request is accepted by the customer, the job's\nstatus will be completed and all actions from now on will be locked to\nthe job. The payout will also be created from here on If the request\nis accepted. If the request is not accepted, the job's status will be\n`active` again. In which case, the translator can update the job and\nfinish it again.\n\nThere is two options: The customer can decline the request, or accept\nit.\n\nIn the case that s/he accepts:\n\n- The job's status is set to `completed`.\n- The job is locked so that no further action can be done for it.\n- The payout is sent to the customer.\n- `completed_doc_jobs_count` or `completed_live_jobs_count` is\n increased based on the job type for both translator and customer.\n\nIn the case that s/he denies:\n\n- The job's status is set to `active`.\n- The job's `completed_request` field will have this request until a\n new one is created. But its `is_active` field will be set to `false`\n and it cannot be changed.\n\nThe translator/proofreader also has the option of cancelling the\nrequest, if they do do:\n\n- The job's status will be set to `active`.\n- The completed request will be deactivated.\n\n# Push Notification\n\nWhen the job completed request is created, the following push\nnotification is sent to the translator. `target_user` is the user who\nwill receive the notification.\n\n```json\n{\n \"data\": {\n \"job_id\": 2,\n \"notification_type\": 5,\n \"target_user\": 3\n }\n}\n```\n\n# Payment\n\nCustomer's card will only be charged here for **only on-site\nprojects.**\n\nWhen the completed request is accepted, the price of the project will\nbe charged to the customer's default card. If the customer does not\nhave any payment methods, `HTTP 402` will be returned.\n\nIf the customer does have payment methods, but the card could not be\ncharged the code for the error will be `stripe_error` and the\ngenerated error will have the following parameters:\n\n- `stripe_error_code`: The error code returned by Stripe.\n- `stripe_error_type`: The error type returned by Stripe.\n- `stripe_error_message`: The error message returned by Stripe.\n- `stripe_error_param`: The parameter that raised the error.\n\n```json\n{\n \"status\": {\n \"message\": \"Error ocurred while creating the card on Stripe.\",\n \"code\": 58,\n \"parameters\": {\n \"stripe_error_code\": [\"expired_card\"],\n \"stripe_error_type\": [\"card_error\"],\n \"stripe_error_message\": [\"A message from Stripe.\"],\n \"stripe_error_param\": [\"number\"],\n 'stripe_decline_code': [\"decline_code\"]\n }\n }\n}\n```\n\nIf the card cannot be charged, the project will not be marked as\ndone. After the customer fixes the issue with the card, they can\napprove the same completed request again to finish the process.\n\n# Error Codes\n\nThese are the error codes that can be returned from this endpoint:\n\n - `completed_request_not_exits`\n - `payment_required`\n - `payment_method_stripe_error`\n - `stripe_card_error`\n - `stripe_error`\n - `parameter_error`\n", "parameters": [{"required": true, "type": "integer", "description": "Completed request ID", "in": "path", "name": "request_id"}, {"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/CompletedRequestUpdate"}}], "tags": ["Completed Request"], "summary": "Update Completed Request", "security": [{"apiKey": []}], "responses": {"400": {"description": "Job status must be active.", "schema": {"$ref": "#/definitions/Error"}}, "304": {"description": "The request has already been answered. Check the job for the\ndetails.\n"}, "402": {"description": "Customer does not have any payment methods.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "This field can only be updated by the customer of the completed\nrequest.\n", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Request cannot be found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "200": {"description": "Successful response", "schema": {"type": "object", "properties": {"completed_request": {"$ref": "#/definitions/CompletedRequest"}}}}}}}, "/certification-documents/{document_id}/": {"put": {"description": "This endpoint is used internally to update the status of a job certification.\nWhen a response is set to this endpoint, the URL for the job certification\nwill be updated to point to the generated document.\n", "parameters": [{"description": "An ID that represents the JobDocument that was created for the\ncertification.\n", "in": "query", "required": true, "type": "integer", "example": 1, "name": "document_id"}], "tags": ["Job"], "summary": "Update a Job Certification Document", "security": [{"apiKey": []}], "responses": {"200": {"description": "This endpoint always returns 200."}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/user-profile/": {"get": {"description": "Returns the information for the authenticated user. Customer can get their details from here too.\n", "tags": ["User Profile"], "deprecated": true, "summary": "Get Authenticated User Profile", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"profile": {"$ref": "#/definitions/UserProfile"}}}}, "401": {"description": "User is not authorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Only users can reach this endpoint", "schema": {"$ref": "#/definitions/Error"}}}}}, "/countries/{country_id}/currency/": {"get": {"description": "Returns the currency code of a given country.\n", "parameters": [{"required": true, "type": "number", "example": 2, "in": "path", "name": "country_id"}], "tags": ["Delivery", "ReadonlyAccess"], "summary": "Get Country Currency", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"$ref": "#/definitions/CountryCurrency"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/{job_id}/reminders/": {"put": {"description": "This module is meant to be called from the task scheduler.\n", "parameters": [{"required": true, "type": "integer", "name": "job_id", "in": "path"}], "tags": ["Job Document"], "summary": "Sends a Reminder to Translator", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful."}, "401": {"description": "User is not authenticated."}}}}, "/promotions/{promotion_id}/status-update/": {"put": {"description": "This endpoint is called by Google App Engine Taskqueue. This will check If the promotion start date has begun\nand update the `is_active` value to true. If the `end_date` has passed, the `is_active` value will be set to\nfalse.\n", "parameters": [{"required": true, "type": "integer", "description": "The ID of the Promotion object.", "in": "path", "name": "promotion_id"}], "tags": ["Promotion"], "summary": "Update Promotion Status", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response."}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Payout is not found.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/jobs/delay-requests/decline-reasons/": {"get": {"responses": {"200": {"description": "Successful response", "schema": {"type": "object", "properties": {"decline_reasons": {"items": {"$ref": "#/definitions/DelayedRequestDeclineReason"}, "type": "array"}}}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Lists the decline reasons.\n", "tags": ["Delay Request"], "security": [{"apiKey": []}], "summary": "List Delay Request Decline Reasons"}}, "/lao-certifications/{certification_id}/": {"put": {"description": "Update the details of an LAOCertification.\n", "parameters": [{"required": true, "type": "integer", "name": "certification_id", "in": "path"}, {"required": true, "type": "object", "name": "body", "in": "body", "schema": {"$ref": "#/definitions/LAOCertification"}}], "tags": ["LAOCertification"], "summary": "Update LAO Certification", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"lao_certification": {"$ref": "#/definitions/LAOCertification"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}, "get": {"description": "Returns the details of an LAO certification.\n", "parameters": [{"required": true, "type": "integer", "name": "certification_id", "in": "path"}], "tags": ["LAOCertification"], "summary": "Get LAO Certifications", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"lao_certification": {"$ref": "#/definitions/LAOCertification"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/payouts/": {"get": {"description": "This is where you can list payouts. This endpoint is accessible by\nsystem managers. And translators can only list payouts that **belong\nto them**.\n\n**For now, only translators can access this endpoint.**\n", "parameters": [{"required": false, "type": "integer", "description": "This is the ID of the translator. When a translator is using this\nendpoint, this will be automatically set to the authenticated\ntranslator.\n", "in": "query", "name": "translator"}, {"required": false, "type": "integer", "description": "The current page to show. If none is given, defaults to the first\npage.\n", "in": "query", "name": "page"}, {"required": false, "type": "integer", "description": "The number of items to show on the page. Defaults to 10.", "in": "query", "name": "page_item_acount"}, {"required": false, "description": "This status change will always be automatic and will not accept\ninput from the outside.\nIf the type of the status is wrong, it will be ignored.\n\n- `0` (n/a): This means that the project is still in progress.\n\n- `1` (invalid): This is the status for an invalid Payout. This\n means that the translator did not finish the project.\n\n- `2` (processing): This is the status for an processing payout.\n This means that the money is currently being processed.\n\n- `3` (paid): This is the status for a paid payout. This means that\n the translator received the payout.\n", "in": "query", "enum": [0, 1, 2, 3], "type": "integer", "name": "status"}], "tags": ["Payout"], "summary": "List Payouts", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"allOf": [{"$ref": "#/definitions/Pagination"}, {"type": "object", "properties": {"payouts": {"items": {"$ref": "#/definitions/PayoutList"}}}}]}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "User doesn't have access here.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/natures/new/": {"post": {"description": "Only a System Manager can create a new nature.\nA `Nature` **must** be created first with the English name. After a `Nature` is created with the initial\nEnglish name translations can be added. **You cannot add a translation here.**\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/Nature"}}], "tags": ["Nature"], "summary": "Create Nature", "security": [{"apiKey": []}], "responses": {"400": {"description": "Parameter error", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successful response", "schema": {"type": "object", "properties": {"nature": {"$ref": "#/definitions/Nature"}}}}, "403": {"description": "Only system manager can access this endpoint.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/document-deliveries/": {"post": {"description": "Once the project is created, we can create a `DocumentDelivery`\nobject to indicate to the translator that the translated documents\nmust be mailed to the customer.\n\nThe `documents` must belong to the job that's being passed in the\nparameters.\n", "parameters": [{"required": true, "type": "object", "name": "body", "in": "body", "schema": {"$ref": "#/definitions/DocumentDeliveryCreate"}}], "tags": ["Delivery"], "summary": "Create a Document Delivery", "security": [{"apiKey": []}], "responses": {"200": {"description": "Successful response.", "schema": {"type": "object", "properties": {"document_delivery": {"$ref": "#/definitions/DocumentDelivery"}}}}, "401": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/users/payment-methods/{payment_method_id}/": {"put": {"responses": {"201": {"description": "Succesful.", "schema": {"type": "object", "properties": {"payment_method": {"$ref": "#/definitions/PaymentMethod"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Update the details of a payment method.\n\n# Error Codes\n\n- parameter_error: There are problems with the payload.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"$ref": "#/definitions/PaymentMethod"}}], "tags": ["Payment Method"], "summary": "Update Payment Method"}, "delete": {"responses": {"200": {"description": "Succesful.", "schema": {"type": "object", "properties": {"payment_method": {"$ref": "#/definitions/PaymentMethod"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "A card with the given ID cannot be found for this authenticated user.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Payment Method"], "description": "Delete the payment method that belongs to the authenticated user. You cannot delete the payment method If\nthere's only one payment method.\n\n# Error Codes\n\n- parameter_error: Cannot find the payment method.\n- must_have_default_payment_method: There's only one payment method left and it cannot be deleted.\n", "summary": "Delete Payment Method"}, "get": {"responses": {"200": {"description": "Succesful.", "schema": {"type": "object", "properties": {"payment_method": {"$ref": "#/definitions/PaymentMethod"}}}}, "401": {"description": "The user is not authenenticated", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "A card with the given ID cannot be found for this authenticated user.", "schema": {"$ref": "#/definitions/Error"}}}, "tags": ["Payment Method"], "description": "Get the details of the payment method. The payment method must belong to the authenticated user.\n\n# Error Codes\n\n- parameter_error: The payment method cannot be found.\n", "summary": "Get Payment Method Details"}}, "/translator-profile/government-ids/{government_id}/": {"put": {"responses": {"200": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"government_id": {"$ref": "#/definitions/GovernmentID"}}}}, "400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Currently, only the `status` field can be updated here. Once the\nupload is completed, the status must be set to `READY`.\n\n# Uploading a New File\n\nIf you want to change the uploaded file, you need to provide all of\nthe following fields:\n\n - `original_file_name`\n - `content_type`\n - `file_checksum`\n - `file_size`\n\nIf any of those fields are changed, all of them has to change. And a\nnew upload url will be provided. The status will also be set to\n`NULL`.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "government_id"}, {"required": true, "type": "object", "name": "payload", "in": "body", "schema": {"$ref": "#/definitions/GovernmentID"}}], "tags": ["Translator Profile"], "summary": "Update Government ID"}, "delete": {"responses": {"200": {"description": "Succesful response. Returns the deleted resource.", "schema": {"type": "object", "properties": {"government_id": {"$ref": "#/definitions/GovernmentID"}}}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "404": {"description": "Not found.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Deletes the given government ID and returns the deleted resource.\n", "parameters": [{"required": true, "type": "number", "example": 32, "in": "path", "name": "government_id"}], "tags": ["Translator Profile"], "summary": "Delete Government ID"}}, "/translator/language-certificates/new/": {"post": {"description": "This endpoint is only accessible by a translator. So you need to first create the translator. Language\ncertificate is not required when registering translator.\nIf the translator has the same language certificate with the same properties, `HTTP 400` is returned.\nThe language certificate is added to the authenticated translator.\n\nThis change will require an approval from the admins. So, If there's an active profile change request, that\nwill be updated to reflect the new changes. If there isn't one, a new request will be created. If a request\nwas created or updated, it will be returned with the `request` key with the response. If none was created or\nupdated, it will be `null`.\n", "parameters": [{"required": false, "type": "file", "description": "The file for the language certificate. This is an image file. There can only be one file.", "in": "formData", "name": "file"}, {"required": true, "type": "integer", "name": "language", "in": "formData"}, {"required": true, "type": "string", "name": "name", "in": "formData", "format": "char[128]"}, {"required": true, "type": "string", "name": "number", "in": "formData", "format": "char[64]"}], "tags": ["Language Certificate"], "summary": "Create Language Certificate", "security": [{"apiKey": []}], "consumes": ["multipart/form-data"], "responses": {"400": {"description": "Parameter error occurred.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Successfully uploaded.", "schema": {"type": "object", "properties": {"language_certificate": {"$ref": "#/definitions/LanguageCertificate"}}}}, "403": {"description": "User does not have access here.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "User is not authenticated.", "schema": {"$ref": "#/definitions/Error"}}}}}, "/translator-profile/language-pairs/": {"post": {"responses": {"400": {"description": "Parameter error.", "schema": {"$ref": "#/definitions/Error"}}, "201": {"description": "Succesful response.", "schema": {"type": "object", "properties": {"interpretation_language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "translation_language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}}}}, "403": {"description": "Unauthorized.", "schema": {"$ref": "#/definitions/Error"}}, "401": {"description": "Unauthenticated.", "schema": {"$ref": "#/definitions/Error"}}}, "description": "Language pairs must be added according to interpretation and\ntranslation pairs.\n\nYou cannot add translation language pairs If the translator does not\nprovide any translation services. The same situation applies to\ninterpretation as well.\n\nThat's why this endpoint cannot be used before adding the language\nservices.\n", "parameters": [{"required": true, "in": "body", "name": "body", "schema": {"type": "object", "properties": {"interpretation_language_pairs": {"items": {"$ref": "#/definitions/LanguagePairCreate"}, "type": "array"}, "translation_language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}}}}], "tags": ["Translator Profile"], "summary": "Add A Language Pair to Translator"}}}, "schemes": ["https", "http"], "produces": ["application/json"], "tags": [{"name": "JobCertification", "description": "`JobCertification` represents various certifications that may be\nneeded for a job. ATIO certification and certificate of translation\nare just a few examples of this that we are using right now.\n\n`JobCertification` can have a separate pricing model that will be used\nwhen a job is being priced. When such pricing is used, the other\npricing models will not take effect for the job that's using the\n`JobCertification`.\n\nA `JobCertification` can be created for interpretation or translation\njobs.\n\nIf a price model is set for this certification type, that price will\nbe used to calculate the price for the job. If a nature has a\nFixedDocument, then that the price model will price the translation\nbased on per page.\n"}, {"name": "Referral", "description": "The API provides a way for customers to have a referral code(s) of their\nown to share with others. When a customer registers, they are assigned\na default referral code that they can see on their profile. Each referral\ncode has assigned actions that they can be used for. For example, If\nwe do not enable it, a referral code cannot be used to register as a\nnew user or create a new project.\n\nEach referral comes with a `ReferralLimit`. This deterines hw many times\na referral code can be used by other customers, and which actions (e.g\nregister, create a project.) they can perform with that referral code.\n\nA promotion can be automatically applied to a referral code. So that\nwhenever somebody creates a project using that referral code, they\nget a discount as well.\n\nWhenever a customer uses a referral, its usage is saved as a\n`ReferralUsage`. This gives us a history of what referrals were used\nfor what actions.\n\n# Passing Referral Code\n\nThe endpoints that support referral codes are tagged with `Referral`.\nIn those endpoints, you can include a `referral_code` parameter in\nthe payload and it will be taken care of.\n\n# Promotions with Referrals\n\nA promotion can be attached to a referral to enable discounts for users.\nA user cannot use her own referral code. And If a promotion is attached\nto a referral, it can only be used for that referral.\n"}, {"name": "User Profile", "description": "`UserProfile` is the base model for all user types. If a user wants to\nbecome a translator, they first create a `UserProfile` and then attach\na translator to it by registering as a translator.\n\n# Logging In\n\nWhen logging in, users have two options:\n\n- Use password.\nUsing password is straightforward, you provide the email and the\npassword.\n\n- Use temporary password.\n\nFor this, you need to first generate a temporary password. A temporary\npassword is sent as an email to the user. If the email address does\nnot exist, it is not reported back to you.\n\n# Sign Up\n\nSign ups are always performed using temporary passwords.\n"}, {"name": "Payout", "description": "A `Payout` is represents a payout to a translator. A `Payout` is\ncreated when a job request is sent to the translator or proofreader.\nA payout is created per project per translator. If somewhere along\nthe way, a translator changes for a job, that translator will also\ntake the payout object with him/her. But the status of the payout\nobject will be invalid.\n\nIf there is a penalty for the translator, the amount paid will be\ndifferent. A translator can only hold one payout for one job. The\ntranslator must also belong to the job.\n\nIf the job request is not accepted, the `Payout` for that\ntranslator/proofreader will be **deleted.**\n"}, {"name": "Job Request", "description": "A `JobRequest` object is created to assign a translator to a job. You\ncannot send multiple requests for a job to the same translator. Or if\nthere's already a job request for a job, a new one cannot be sent.\n\nIf a translator fails to complete a job, the accepted job request can\nbe cancelled in the admin panel and a new one can be created for\nanother translator. Once a new one is created, the other translator\nwill be removed from the job and the `Payout` object will be deleted.\n\nIf the job request is canceled so a new translator can be assigned,\nthe created translator documents will still remain the same. But when\nthe new translator accepts the job request, those documents will be\nupdated to assign the new translator to them. And this will be done\nin `Job` model when the translator changes.\n\n# Proofreading Request\n\nProofreading requests also use `JobRequest`s. If a job has\n`proofreading_enabled` set to true, the required number of proofreader\nrequests will be sent automatically when the first translator accepts\nthe job request.\n\n# Translator Queue\n\nTranslator queue is used for all of the project requests. As usual,\nthe customer will select one translator and If that translator does\nnot respond or declines the request, a list of 10 translators will be\ngenerated and each one will get the request one by one.\n\nIf the job has `proofreading_enabled` set to true, then the\nproofreaders queue will be **started once the first translator accepts\nthe job request.**\n\n**Queue creation is automatic and does not require an outside\nintervention.** If the job request is canceled, a job request wil be\nsent to the next translator. If you want to cancel a translator queue,\nset `is_translator_canceled` or `is_proofreader_canceled` to false.\n\n## Queue Generation\n\nIf the associated project requires proofreading, proofreaders will\nalso be selected according to the following criteria.\n\nThe first step to pick translators for the queue is as follows:\n\n- Translator must serve to the project type.\n- Translator must serve to the project's languages.\n- Translator must serve to the project's nature group.\n\nAmong these translators, the ones with the highest rating will be\npicked first. If the ratings are equal, the one with the higher years\nof experience will be picked first. If no translator with the nature\ncannot be found, removes the nature prerequisite.\n"}, {"name": "Job", "description": "A `Job` object represents the two types of jobs: On-site and document.\nYou cannot directly set a translator on the job object, but you have\nto create a `JobRequest` to assign the translator.\nIf a job is an interpretation, the customer can set it to be a video\ninterpretation. In this case, only the interpreters that do video\ninterpretations will be listed.\n\nWhen viewing the details of the job, only the last request\n(`JobRequest`, `CompletedRequest`, `DelayRequest`) will be attached is\na single object to the job. But **in the case of proofreading**,\ncompletion request will not be shown until the proofreader sends a\ncompletion request.\n\n# Auto Translator Queue\n\nIf the job is a rush order, the translator queue will be generated\nonce the job's status is set to `offer`.\n\n# Multiple Translator Support\n\nMultiple translator support is only enabled for translation for now.\n"}, {"name": "Delay Request", "description": "A delay request is used to change the start date (Only for on-site\nprojects) and the end date of a project. A delay request is the only\nway to do this. If it's an on-site project, the change in the duration\nwill also affect the price of the project.\n\nWhen a delay request is accepted, it will be set to the latest\n`end_date` among the delay requests that belong to the job.\n\nEach delay request will be attached to the `Translator` in a `Job` and\nthey will have different deadlines according to the attached\n`DelayRequest` object. The default deadline is the `end_date` of the\nJob.\n"}, {"name": "Promotion", "description": "`Promotion` is used to create discounts for customers. They can be\ntime based, or usage based. A `Promotion` will be active as long as\nthe end date has not passed or the usage has not been exceeded by the\ncustomer. A `Promotion` will be marked as used when the customer\nsends a job request.\n"}, {"name": "Completed Request", "description": "This is created when the project is finished and it has to be reviewed\nby the customer before marking it as completed. For on-site projects,\na completed request **cannot** be sent If the project's deadline has\nnot yet passed.\n\nA request can only be responded once. If it is declined, a new one has\nto be created.\n\nFor on-site and video projects, when the request is completed, the\ncustomer's card will be charged in the model and any of the expected\nexceptions should be handled in the endpoint. If the purchase was\nalready charged, it will not return an error response.\n\n# Proofreading\n\nThe same model is used for sending a completion request for\nproofreading as well. In the case of a proofreading, the `request_type`\nfield of the model will be `1`.\n\nCompletion requests can be accepted individually. If there's a\nproofreading in progress, the job's status will not be `completed`\nuntil all of the proofreaders sent a completion request and they are\napproved by the customer.\n\nIn case of proofreading, the last completed request to be accepted\nwill change the job status and the job will be marked as complete.\n"}, {"name": "Progress Report", "description": "When a translation assignment begins, the translator will be asked to\nfill out progress reports for the document(s) that s/he is working on.\nOnce the project is accepted, a push notification and an email will be\nscheduled for 18:00 everyday to remind the translator to file a\nprogress report.\n\nThe push notifications will be scheduled in the job model when the\ntranslator is assigned. If the translator is changed when the job is\nactive, the notification will be canceled when the job request is\ncanceled.\n\nHere's the progress reporting flow.\n\n- Push notifications to remind the translator to report the progress\n will be scheduled when the project is accepted. (Also If the\n translator changes during the job.)\n- Translator will report the progress to the customer files. The\n client will just send a `PUT` request to the job document detail\n endpoint.\n- When the translator finishes the translation, s/he will upload the\n file.\n- When the translated number of pages equal the total page number,\n the notification will be canceled.\n"}, {"name": "Job Document", "description": "Contains information about the document uploaded for a job. Every\ndocument must belong to a job. Documents can be uploaded before\ncreating a job but after creating the job they must be assigned to\nthe job.\n\n# Proofreading\n\nIf proofreading is enabled for a job, the proofreader can start\nworking as soon as the translator uploads a document to the project\nand marks it as complete.\n\nAfter a job document is uploaded by a translator, it **must** be\nmarked complete for proofreader to start working on it.\n\n# Translator and Proofreader Assigning\n\nAs of now, there can only be one proofreader for a job. So when a\ntranslator uploads a file and marks it as complete, it will be\nassigned to the only proofreader.\n\n# Document Splitting\n\nWhen the first job request is sent, the customer documents are split\ninto easily translatable parts. A document must contain unique\ntranslators. When the documents are split, associated `AssignedPage`\ninstances are created with empty translators. When each translator\naccepts the project request, `AssignedPage.objects.assign_translator()`\ncan be used to assign that translator to the next available\n`AssignedPage`. After the translator is assigned, they can view the\nfiles they are assigned to.\n"}, {"name": "Delivery", "description": "While creating a translation project a customer can choose to have\nthe translated documents delivered to a certain address.\n\nIf they wish so, they first need to select which document they want\ndelivered to delivery address. These marked documents will need to be\nprovided when creating the `DocumentDelivery` object.\n\nA `DocumentDelivery` can only be created once a translation project\nis created. If any of the attached documents need to be delivered,\nthe customer will not be able to create a `JobRequest` until a\n`DocumentDelivery` is created for the project.\n\n# Integration Flow\n\n```\n-----------------------------------------\n| Keep a List of Documents for Delivery |\n-----------------------------------------\n ↓\n ------------------------------ ------------------------------\n | Send Request to Create Job | → | Create a Document Delivery |\n ------------------------------ ------------------------------\n ↓\n ----------------------\n | Send a Job Request |\n ----------------------\n```\n\nA customer can choose to ask for a delivery at any stage of the\nproject expect when it's completed.\n\nIf the customer selected a job certification type that has\n`hard_copy_available` set to true, then the delivery option is\nenforced.\n\nIf a customer decides that they want a delivery after the job request\nwas sent, the delivery price will be immediately charged to their\ncredit card.\n\nDepending on the selected certification type of the project, they\nmay not be able to request a hard copy after the translator has\naccepted the project request.\n\nIf the customer wants to enable the delivery option after the\ntranslator has accepted the project request and the translator's\naddress is not in the same country as the customer's, it will not\nbe allowed to create it. This behavior may change in the future, but\ncurrently deliveries are only available in the same country.\n\nWhen a job has an associated document delivery, it will be attached\nto the job.\n"}, {"name": "Translator Profile", "description": "Translator profile represents the anchor object that we refer to in\nall the translator related resources (e.g government ID, education\nhistory.). In order to register a translator and add all the related\ninformation, you will first need to initialize a translator profile.\n\nAfter initializing a translator profile, you can update the resources\nin any order you would like. Once all the related information is\ncompleted the `is_registration_completed` field of `TranslatorProfile`\nwill be set to `true`. But this does not mean that the translator\nprofile was approved.\n\nOnce the profile is completed, a request will be sent to the admins\nand once they approve the profile the translator will be able to\nreceive projects.\n\n```\n---------------------- ------------------------------\n| Initialize Profile | ---> | Update All Profile Details | <----|\n---------------------- ------------------------------ |\n | |\n | |\n V |\n ------------------- |\n-------------------- | A Translator | |\n| Translator Can | <-- Accepted -- | Request is Sent | |\n| Receive Projects | | to Admins | |\n-------------------- ------------------- |\n | |\n Declined |\n | |\n | |\n -- Repeat --|\n```\n"}], "securityDefinitions": {"apiKey": {"in": "header", "type": "apiKey", "description": "Make sure to include `JWT` prefix when typing your API key in the\ndialog.\n", "name": "Authorization"}}, "host": "cuz-tech.appspot.com", "definitions": {"PayoutList": {"required": ["translator", "job"], "type": "object", "description": "This will only have the job summary.\n", "properties": {"status": {"enum": [0, 1, 2, 3], "type": "integer", "description": "This status change will always be automatic and will not accept input\nfrom the outside.\n\n- `0` (n/a): This means that the project is still in progress.\n\n- `1` (invalid): This is the status for an invalid Payout. This means\n that the translator did not finish the project.\n\n- `2` (processing): This is the status for an processing payout. This\n means that the money is currently being processed.\n\n- `3` (paid): This is the status for a paid payout. This means that\n the translator received the payout.\n", "example": 0}, "earned_amount": {"format": "float", "type": "integer", "example": 23.32, "description": "This is the amount of money that the translator earns from the\nproject after the commision,\n"}, "paid_amount": {"format": "float", "type": "integer", "example": 23.32, "description": "This is the amount of money paid to the translator. This may differ\nfrom the `earned_amount` in case of a penalty to the translator or to\nthe customer.\n"}, "payout_date": {"format": "dateTime", "type": "string", "example": "2018-01-06T12:22", "description": "This is the date that translator received the money to their\naccounts. This is updated automatically when the status is changed.\n"}, "creation_date": {"format": "dateTime", "type": "string", "example": "2018-01-01T12:22", "description": "This is the date that this object was created at. This is added\nautomatically.\n"}, "translator": {"type": "integer", "description": "The ID of the translator.\n", "example": 1}, "currency": {"type": "string", "description": "This is the currency as\n[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#Active_codes)\nstandard.\n", "example": "cad"}, "job": {"$ref": "#/definitions/PayoutListJob"}, "hst_amount": {"format": "float", "type": "integer", "example": 2.34, "description": "This is the amount of money for HST tax calculated from earned\namount. The earned_amount does not contain this amount.\n"}, "bank_account": {"$ref": "#/definitions/BankAccount"}}}, "JobPaymentError": {"type": "object", "properties": {"purchase": {"$ref": "#/definitions/Purchase"}, "end_date": {"type": "string", "example": "2017-01-03T15:55", "format": "dateTime"}, "nature": {"$ref": "#/definitions/Nature"}, "page_count": {"type": "integer", "description": "If `job_type` is 'doc', this will have the page count. Otherwise,\nit will be 0.\n", "example": 2}, "job_type": {"required": true, "description": "- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Video Interpretation Job\n", "format": "int32", "enum": [0, 1, 2], "type": "integer", "example": 1}, "start_date": {"type": "string", "example": "2017-01-02T15:55", "format": "dateTime"}, "word_count": {"type": "integer", "description": "If `job_type` is 'doc', this will have the word count. Otherwise, it\nwill be 0.\n", "example": 1250}}}, "Certificate": {"type": "object", "description": "A certificate object", "properties": {"cloud_name": {"format": "char[128]", "type": "string", "example": "1.plan_to_destroy_the_world.jpeg", "description": "The file's name on the cloud."}, "name": {"format": "char[256]", "type": "string", "example": "How to Translate", "description": "Name will always be saved in lower case."}, "content_type": {"format": "char[127]", "type": "string", "example": "image/jpeg", "description": "The file's content type."}, "year": {"format": "int32", "type": "integer", "example": 1988, "description": "The year the certificate was earned."}, "file_name": {"format": "char[128]", "type": "string", "example": "plan_to_destroy_the_world.jpeg", "description": "The file's original name."}, "file_url": {"format": "url", "type": "string", "example": "http://www.file-url.com/asd.png", "description": "Name of the certificate."}, "file_checksum": {"format": "char[128]", "type": "string", "example": "12345qwertwqwe12345qwertwqwe12345qwertwqwe12345qwertwqwe12345qwertwqwe", "description": "File checksum."}}}, "Notification": {"type": "object", "properties": {"is_read": {"type": "boolean", "description": "This can be updated to true when the user reads the notification. Default value is false.\n", "example": false}, "sent_date": {"format": "dateTime", "type": "string", "description": "The date when the notification was sent.", "example": "2017-01-01T13:45"}, "user": {"type": "integer", "description": "The user ID.", "example": 1}, "read_date": {"format": "dateTime", "type": "string", "description": "The date when the user read the notification.", "example": "2017-01-01T13:45"}, "notification_type": {"type": "integer", "description": "This is app specific. The default value is -1 If it is not set.", "example": 2}, "data": {"type": "string", "example": "{}", "description": "A JSON object that represents the payload of the notification."}}}, "ProvinceTranslation": {"type": "object", "description": "The same province with different names can be added.\n", "properties": {"name": {"type": "string", "example": "United States", "format": "char[64]"}, "language": {"$ref": "#/definitions/Language"}}}, "DocumentDelivery": {"type": "object", "allOf": [{"$ref": "#/definitions/DocumentDeliveryBase"}, {"type": "object", "properties": {"delivery_type": {"$ref": "#/definitions/DeliveryType"}, "documents": {"items": {"$ref": "#/definitions/JobDocument"}, "type": "array"}, "address": {"$ref": "#/definitions/Address"}}}]}, "JobDeclineReason": {"type": "object", "description": "The reason the job was denied by the translator.", "properties": {"reason": {"format": "char[512]", "type": "string", "example": "Busy with other projects.", "description": "This is the reason the translator didn't accept the job.\nThe default language is English.\n"}}}, "UserProfileUpdate": {"type": "object", "description": "This is used when updating a user", "allOf": [{"$ref": "#/definitions/UserUpdate"}, {"properties": {"user_type": {"type": "integer", "description": "The user type.\n\n- `0` (company): User belongs to a company.\n\n- `1` (law firm): User belongs to a law firm.\n\n- `2` (individual): User is an individual.\n\n- `3` (translator): User is a translator.\n", "example": 2}, "address": {"type": "string", "description": "Address", "example": {"country": "Canada", "city": "Toronto"}}}}]}, "Penalty": {"required": ["job", "target", "incurred_percentage", "user_profile"], "type": "object", "description": "This object represents a Penalty incurred to a customer or a translator. A job can only have one associated\npenalty. In order to create a penalty for a job, that job's status must be failed.\n", "properties": {"status": {"enum": [0, 1, 2, 3], "type": "integer", "description": "The status of the penalty.\n\n- `0` (default): This means that the penalty has not been yet applied.\n\n- `1` (incurred): This means that the penalty was fully applied to the target.\n\n- `2` (cancelled): This means that the penalty was cancelled and will not be applied to the target.\n\n- `3` (partial): This means that the penalty was partially subjected and there is still money that needs to\n be taken from the target.\n", "example": 0}, "deactivation_date": {"format": "dateTime", "type": "string", "example": "2018-01-02T12:33", "description": "This is automatically added by the API. This is the date that the penalty was fully incurred.\n"}, "target": {"enum": [0, 1], "type": "integer", "description": "This is the target user for the penalty.\n\n- `0` (translator): This means that the job was cancelled or failed because of the translator and s/he will\n be subject to the penalty.\n\n- `1` (customer): This means that the job was canceled or failed because of the customer and s/he will be\n subject to the penalty.\n", "example": 0}, "remaining_amount": {"format": "float", "type": "integer", "example": 10, "description": "This is the amount of penalty still remaining.\n"}, "is_active": {"format": "float", "type": "integer", "example": true, "description": "This will be true as long as the remaining_amount is greater than 0.\n"}, "creation_date": {"format": "dateTime", "type": "string", "example": "2018-01-01T12:33", "description": "This is automatically added by the API. This is the date that the penalty is created.\n"}, "system_manager_note": {"format": "char[1024]", "type": "string", "example": "Something something danger zone.", "description": "This is the note that the system manager left for this penalty.\n"}, "job": {"$ref": "#/definitions/JobSummary"}, "user": {"$ref": "#/definitions/UserSummary"}, "incurred_percentage": {"format": "float", "type": "integer", "example": 0.13, "description": "This is the amount of percentage that will be cut from the project price for this penalty.\n"}, "incurred_amount": {"format": "float", "type": "integer", "example": 23, "description": "This is the amount of money for the penalty. It will be updated when the penalty is created and it cannot be\nchanged after. The job price will be multiplied by incurred_percentage to set this price.\n"}, "system_manager": {"type": "integer", "description": "This is the system manager who created the penalty. This can be null If the creation was automated.\n", "example": 1}}}, "JobDeclineReasonTranslation": {"type": "object", "description": "The reason the job was denied by the translator.", "properties": {"reason": {"format": "char[512]", "type": "string", "example": "Baska islerle mesgulum.", "description": "This is the reason the translator didn't accept the job."}, "language_code": {"format": "char[512]", "type": "string", "example": "Baska islerle mesgulum.", "description": "This is the reason the translator didn't accept the job."}}}, "CountryTranslation": {"type": "object", "description": "The same country with different names can be added. But the country with\nthe same country code will have the same cities. City names are not\ntranslatable.\n", "properties": {"name": {"type": "string", "example": "United States", "format": "char[64]"}, "language": {"$ref": "#/definitions/Language"}}}, "NatureDetailView": {"type": "object", "properties": {"price": {"type": "string", "description": "If nature price is constant, this field nature price"}, "translations": {"items": {"$ref": "#/definitions/NatureTranslation"}, "type": "array"}}}, "CountryCurrency": {"type": "object", "description": "Represents the currency of a country.\n", "properties": {"country": {"$ref": "#/definitions/Country"}, "code": {"format": "char[3]", "type": "string", "example": "cad", "description": "Three letter code of the currency."}, "name": {"format": "char[18]", "type": "string", "example": "Canadian Dollars", "description": "Name of the currency, English by default."}}}, "DeviceUpdate": {"type": "object", "properties": {"platform": {"enum": [0, 1, 2, 3, 4, 5], "type": "integer", "description": "- `0`: Not specified\n\n- `1`: iOS\n\n- `2`: Android\n\n- `3`: Web\n\n- `4`: Windows\n\n- `5`: macOS\n", "example": 1}, "pns_token": {"type": "string", "example": "qewrtyuhjgfasdsdfgbvc123", "format": "char[512]"}, "device_hash": {"type": "string", "example": "3416asdslfu3094rwsedf54_totally_not_an_id", "format": "char[256]"}, "device_name": {"type": "string", "example": "Google Pixel", "format": "char[256]"}}}, "UserProfile": {"type": "object", "description": "This is the main model used for customers and translators. When a customer\nwants to become a translator, the created translator is attached to\n`UserProfile`.\n", "allOf": [{"$ref": "#/definitions/User"}, {"properties": {"referrals": {"items": {"$ref": "#/definitions/ReferralSummary"}, "type": "array"}, "completed_video_live_jobs_count": {"type": "integer", "description": "The number of doc jobs this customer completed. This is increased\nwhenever a job is completed.\n", "example": 2}, "user_type": {"type": "integer", "description": "The user type.\n\n- `0` (company): User belongs to a company.\n\n- `1` (law firm): User belongs to a law firm.\n\n- `2` (individual): User is an individual.\n\n- `3` (translator): User is a translator.\n", "example": 2}, "translator": {"type": "integer", "description": "If the user is a translator this field will have the translator\nID. If the user is not a translator, this field will be empty.\n", "example": 2}, "is_payment_method_required": {"type": "bool", "description": "This field indicates whether a payment method is required from\nthis user to create a project. This will be false If the user\nhas an active and approved billing method. When this field is true\nthe user should not be asked for a payment method.\n", "example": false}, "lao_certification": {"$ref": "#/definitions/LAOCertification"}, "address": {"$ref": "#/definitions/Address"}, "completed_doc_jobs_count": {"type": "integer", "description": "The number of doc jobs this customer completed. This is increased\nwhenever a job is completed.\n", "example": 2}, "completed_live_jobs_count": {"type": "integer", "description": "The number of live jobs this customer completed. This is increased\nwhenever a job is completed.\n", "example": 23}}}]}, "DocumentExportSub": {"type": "object", "properties": {"file_url": {"format": "url", "type": "string", "example": "http://www.link.to/file", "description": "Translated file url."}, "translator_full_name": {"format": "char[128]", "type": "string", "example": "Cortlak Mahmut", "description": "Full name of the translator."}, "id": {"format": "in64", "type": "integer", "example": 1, "description": "Translated Document ID"}, "name": {"format": "char[64]", "type": "string", "example": "cortlak_mahmut_customer_doc.pdf", "description": "File name on local filesystem."}}}, "Translator": {"type": "object", "properties": {"bio": {"type": "string", "description": "Description of the user.", "example": "Here's a bio."}, "language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "user_profile": {"$ref": "#/definitions/UserProfile"}, "completed_video_live_jobs_count": {"type": "integer", "description": "The number of video interpretations jobs this translator completed. This\nis increased whenever a job is completed.\n", "example": 42}, "available_for_live_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make live\ntranslation.\n", "example": true}, "live_job_average_response": {"format": "float", "type": "integer", "example": 123.2, "description": "The response time is not affected by whether the translator accepted the\njob or denied it. It's about how long it took for the translator to\nrespond to the job. This is the average time that it took for the\ntranslator to respond to the job. It's in minutes.\n"}, "is_available_for_assignments": {"type": "boolean", "description": "Defaults to false. This can be set to false when the translator does not\nwant to receive assignments for a period of time.\n", "example": true}, "is_active": {"type": "boolean", "description": "If this is set to true, it means the translator is accepted by the\nadministrators.\n", "example": true}, "is_atio_certified": {"type": "boolean", "description": "If this is set to true, it means the translator is ATIO certified. ATIO\ncertified transaltors are required for translations of document types\nother than regular.\n", "example": false}, "latitude": {"format": "float", "type": "integer", "example": 43.99, "description": "The latitude of the translators location.\n"}, "address": {"$ref": "#/definitions/Address"}, "schools": {"items": {"$ref": "#/definitions/School"}, "type": "array"}, "nature_groups": {"items": {"$ref": "#/definitions/NatureGroup"}, "type": "array"}, "is_banned": {"type": "boolean", "description": "If this is set to true, it means the translator is blocked by the\nadministrators.\n", "example": false}, "job_certifications": {"items": {"$ref": "#/definitions/JobCertification"}, "type": "array"}, "live_job_video_average_response": {"format": "float", "type": "integer", "example": 13.2, "description": "The response time is not affected by whether the translator accepted the\njob or denied it. It's about how long it took for the translator to\nrespond to the job. This is the average time that it took for the\ntranslator to respond to the job. It's in minutes.\n"}, "hst_number": {"type": "string", "description": "HST number of the translator (usually it is a 15-digit number).\nhttps://turbotax.intuit.ca/tips/a-guide-to-business-numbers-6211\n", "example": "123456789RT0001"}, "completed_doc_jobs_count": {"type": "integer", "description": "The number of doc jobs this translator completed. This is increased\nwhenever a job is completed.\n", "example": 42}, "doc_job_average_response": {"format": "float", "type": "integer", "example": 123.2, "description": "The response time is not affected by whether the translator accepted\nthe job or denied it. It's about how long it took for the translator to\nrespond to the job. This is the average time that it took for the\ntranslator to respond to the job. It's in minutes.\n"}, "available_for_lao": {"type": "boolean", "description": "Indicates whether the translator accepts LAO projects.", "example": false}, "courses": {"items": {"$ref": "#/definitions/Course"}, "type": "array"}, "language_certificates": {"items": {"$ref": "#/definitions/LanguageCertificate"}, "type": "array"}, "available_for_live_video_job": {"type": "boolean", "description": "If this is set to true, it means the interpreter can join the video\ninterpretations. If this is set to true, the address will not be\nrequired.\n", "example": false}, "longitude": {"format": "float", "type": "integer", "example": 43.99, "description": "The latitude of the translators location.\n"}, "max_job_distance": {"type": "integer", "description": "The maximum distance that the translator can go. Unit kilometers\n", "example": 50}, "video_chat_accounts": {"$ref": "#/definitions/VideoChatAccounts"}, "available_for_doc_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make document\ntranslation.\n", "example": false}, "certificates": {"items": {"$ref": "#/definitions/Certificate"}, "type": "array"}, "years_of_experience": {"type": "integer", "description": "The number of years the interpreter has worked.", "example": 4}, "completed_live_jobs_count": {"type": "integer", "description": "The number of live jobs this translator completed. This is increased\nwhenever a job is completed.\n", "example": 32}, "overall_rating": {"format": "float", "type": "integer", "example": 4.3, "description": "This is updated whenever a translator is rated. This is calculated based\non the overall rating of the translator. This will be [-1, 5]. If it\nis -1, then it means we still don't have enough data to calculate a\nrating.\n"}}}, "Referral": {"type": "object", "description": "An account can only have one referral code. Referral code must be unique,\nregardless of the referral type. If the referral is internal, then the\nowner will be null.\nWhen a new referral is being created, it takes all the default limits.\n\nA promotion can be attached to a referral so that whenever a customer\nuses a referral code, they get the attached promotion. There can only\nbe one promotion per referral. If you want to have different promotion,\ncreate a new referral object for the owner.\n", "properties": {"is_default": {"type": "bool", "description": "Indicates whether this is the default referral that the customer owns.\n", "example": true}, "code": {"format": "char[32]", "type": "string", "example": "xfd23gh2", "description": "The unique referral code."}, "limits": {"items": {"$ref": "#/definitions/ReferralLimit"}, "type": "array"}, "owner": {"$ref": "#/definitions/UserProfile"}, "promotion": {"$ref": "#/definitions/Promotion"}, "referral_type": {"type": "string", "description": "Can be one of:\n - personal: Belongs to an account.\n\n - internal: Referrals by us.\n", "format": "char[16]"}}}, "TranslatorRatingSummary": {"type": "object", "properties": {"comment": {"type": "string", "example": "He's OK, I guess..."}, "would_you_use_again_rating": {"type": "integer", "description": "The question is \"Would you use this translator/translator for another project?\". This is between 1 and 5\ninclusive. This is asked for both types of jobs.\n", "example": 3}, "appearance_rating": {"type": "integer", "description": "The question is \"Did the translator show up with appropriate clothing?\". This is between 1 and 5 inclusive.\nThis is only asked for live jobs.\nexample: 3\n"}, "kindness_rating": {"type": "integer", "description": "The question is \"Was the translator polite, respectful and tactful?\". This is between 1 and 5 inclusive.\nThis is only asked for live jobs.\n", "example": 5}, "arrived_on_time": {"type": "integer", "description": "The question is \"Was the interpretation at the interpretation site on time?\". This is between 1 and 5\ninclusive. This is only asked for live jobs.\n", "example": 5}, "overall_rating": {"type": "integer", "description": "This is between 1 and 5 inclusive. This is asked for both types of jobs.", "example": 4}}}, "DocumentDeliveryUpdate": {"type": "object", "properties": {"documents": {"items": {"type": "number", "example": 23}, "type": "array"}, "address": {"$ref": "#/definitions/Address"}}}, "Nature": {"required": ["name", "multiplier", "nature_group"], "type": "object", "properties": {"nature_group": {"$ref": "#/definitions/NatureGroup"}, "per_page_pricing_with_certification_enabled": {"type": "bool", "description": "When this is enabled, job certification price will be applied to the\nnumber of pages in the documents instead of number of words.\n", "example": true}, "name": {"type": "string", "description": "Nature name. This **must** be in English when first creating the\nNature.\n", "example": "Doctor Appointment"}, "multiplier": {"format": "float", "type": "integer", "example": 1, "description": "This is the price that will multiply the base price of the project.\nThe default value is 1.0.\n"}, "is_archived": {"type": "boolean", "description": "If the nature is archived, it will not show up in any relevant listing\nbut will be accessible from any existing-related job.\n", "example": false}, "per_page_pricing_enabled": {"type": "bool", "description": "When this is enabled, normal job price calculation will be applied to\nthe number of pages in the documents instead of number of words.\n", "example": true}}}, "RushHourRate": {"type": "object", "description": "Holds information about the additional price that will be applied to\nprojects within certain time distance to its end date.\nOnce a `RushHourRate` is created, it cannot be changed.\n", "properties": {"additional_price": {"format": "float", "type": "integer", "example": 20000, "description": "This is the additional price that will be added to the final price of\nthe project. This amount is in the smallest unit of the currency that\nthis limit belongs to. e.g 50 cents or 500 cents for 5 dollars.\n"}, "deadline_limit": {"format": "int32", "type": "integer", "example": 120, "description": "This is the time distance from the deadline to the current date time.\nIf this deadline limit is met, the `multiplier` or the `additional_price`\nwill be applied to the price of the project.\nThis is in minutes.\n"}, "multiplier": {"format": "float", "type": "integer", "example": 1.2, "description": "This amount is applied to the final price of the project."}}}, "TranslatorUpdate": {"type": "object", "properties": {"bio": {"type": "string", "description": "Description of the user.", "example": "Here's a bio."}, "language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "max_job_distance": {"type": "integer", "description": "The maximum distance that the translator can go in kilometers.\n", "example": 50}, "address": {"$ref": "#/definitions/Address"}, "certificates": {"items": {"$ref": "#/definitions/Certificate"}, "type": "array"}, "is_available_for_assignments": {"type": "bool", "example": true}, "schools": {"items": {"$ref": "#/definitions/School"}, "type": "array"}, "nature_groups": {"items": {"$ref": "#/definitions/NatureGroup"}, "type": "array"}, "hst_number": {"type": "string", "description": "HST number of the translator.", "example": "123456789RT0001 (Usually it is a 15-digit number)."}, "available_for_lao": {"type": "boolean", "description": "Indicates whether the translator accepts LAO projects.", "example": false}, "language_certificates": {"items": {"$ref": "#/definitions/LanguageCertificate"}, "type": "array"}, "available_for_live_video_job": {"type": "boolean", "description": "If this is set to true, it means the interpreter can join the video\ninterpretations. If this is set to true, the address will not be\nrequired.\n", "example": false}, "courses": {"items": {"$ref": "#/definitions/Course"}, "type": "array"}, "video_chat_accounts": {"$ref": "#/definitions/VideoChatAccounts"}, "available_for_doc_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make document\ntranslation.\n", "example": false}, "available_for_live_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make live\ntranslation.\n", "example": true}, "years_of_experience": {"type": "integer", "description": "The number of years the interpreter has worked.", "example": 4}}}, "TranslatorRequest": {"type": "object", "properties": {"translator": {"$ref": "#/definitions/Translator"}, "response_date": {"type": "string", "description": "Response date for the translator request."}, "request_date": {"type": "string", "description": "Request date for the translator request."}, "admin_note": {"type": "string"}, "admin": {"$ref": "#/definitions/Admin"}, "is_accepted": {"type": "boolean", "description": "Accept/Decline for the translator request."}, "is_active": {"type": "boolean", "description": "If this is set to true, it means the translator request is accepted by\nthe administrators\n"}}}, "LanguagePair": {"required": ["name"], "type": "object", "description": "Used in Translator profile to search for translators that only translate\nfrom one language to another.\n", "properties": {"source_language": {"$ref": "#/definitions/Language"}, "target_language": {"$ref": "#/definitions/Language"}}}, "User": {"type": "object", "description": "A User object", "properties": {"username": {"type": "string", "description": "Unique user name of the user.", "example": "furkanzmc"}, "first_name": {"type": "string", "description": "First name of the user.", "example": "Furkan"}, "last_name": {"type": "string", "description": "Last name of the user.", "example": "Uzumcu"}, "gender": {"enum": [0, 1, 2], "type": "string", "description": "- `0`: Not specified\n\n- `1`: Male\n\n- `2`: Female\n", "example": 1}, "email_rules": {"$ref": "#/definitions/EmailRule"}, "is_active": {"type": "boolean", "description": "This will be false If the user is not active.", "example": true}, "birthday": {"type": "string", "description": "User birthday", "example": "1999-01-01"}, "profile_photo": {"type": "string", "description": "Profile photo", "example": "http://www.edmoware.com/gamze.png"}, "phone": {"type": "string", "example": "+905064569878"}, "password": {"type": "string", "description": "Password.", "example": "furkan12345"}, "requires_password_change": {"type": "bool", "description": "Indicates whether the password must be changed. When this field is\ntrue, the existing password will not be asked.\n", "example": false}, "last_login": {"format": "date", "type": "string", "example": "2017-01-01", "description": "This is a read-only field. It is updated every time a user sends a\nrequest.\n"}, "is_registration_completed": {"type": "bool", "description": "Whether or not the user has completed registration, i.e updated their\nprofile after sign up.\n", "example": true}, "email": {"type": "string", "description": "Email address of the user", "example": "furkan@zmc.com"}, "date_joined": {"format": "date", "type": "string", "example": "2017-01-01", "description": "This is a read-only field"}}}, "Province": {"type": "object", "properties": {"country": {"type": "integer", "description": "The country ID", "example": 23}, "name": {"format": "char[128]", "type": "string", "example": "Ontario", "description": "The name of the province in the country language"}}}, "Device": {"type": "object", "properties": {"last_visit_date": {"type": "string", "example": 1, "format": "dateTime"}, "login_count": {"format": "int32", "type": "integer", "example": 45, "description": "The count of login requests."}, "enabled": {"type": "boolean", "description": "If the device is enabled, it will be used to send a push notification.", "example": true}, "device_hash": {"type": "string", "example": "3416asdslfu3094rwsedf54_totally_not_an_id", "format": "char[256]"}, "register_date": {"type": "string", "example": "2017-01-01T13:45", "format": "dateTime"}, "platform": {"enum": [0, 1, 2, 3, 4, 5], "type": "integer", "description": "- `0`: Not specified\n\n- `1`: iOS\n\n- `2`: Android\n\n- `3`: Web\n\n- `4`: Windows\n\n- `5`: macOS\n", "example": 1}, "user": {"type": "integer", "description": "The user ID.", "example": 1}, "pns_token": {"format": "char[512]", "type": "string", "example": "qewrtyuhjgfasdsdfgbvc123", "description": "The PNS token for the push notification service being used."}, "device_name": {"type": "string", "example": "Google Pixel", "format": "char[256]"}}}, "LanguageCertificate": {"required": ["language", "name", "number"], "type": "object", "description": "Since language certificates are directly bundled with Translator profile, we are only going to use the language\nID and not the object itself.\n", "properties": {"name": {"format": "char[128]", "type": "string", "example": "Best Translator Certificate", "description": "Name of the certificate."}, "language": {"type": "integer", "example": 2}, "file_name": {"type": "string", "description": "The file's original name.", "example": "plan_to_destroy_the_world.jpeg"}, "file_url": {"format": "url", "type": "string", "example": "http://www.file-url.com/asd.png", "description": "File url for the certificate photo."}, "number": {"format": "char[64]", "type": "string", "example": 453618364, "description": "This the number of the certificate."}, "file_checksum": {"format": "char[128]", "type": "string", "example": "12345qwertwqwe12345qwertwqwe12345qwertwqwe12345qwertwqwe12345qwertwqwe", "description": "The file's checksum."}, "cloud_name": {"type": "string", "description": "The file's name on the cloud.", "example": "1.plan_to_destroy_the_world.jpeg"}, "content_type": {"type": "string", "description": "The file's content type.", "example": "image/jpeg"}}}, "TranslatorMinimal": {"type": "object", "description": "Used to display minimal information about the translator. The rating\nfield contains the rating for the job that this translator is attached to.\n", "properties": {"rating": {"$ref": "#/definitions/TranslatorRatingSummary"}, "first_name": {"type": "string", "description": "First name of the translator.", "example": "John"}, "last_name": {"type": "string", "description": "Last name of the translator.", "example": "Doe"}, "years_of_experience": {"type": "integer", "description": "Years of experience.", "example": 43}, "overall_rating": {"type": "integer", "description": "Overall rating.", "example": 4.3}, "profile_photo": {"format": "url", "type": "string", "example": "https://www.herei.am/me.png", "description": "Translator's profile photo"}}}, "BillingMethod": {"required": ["name", "owner", "payment_schedule"], "type": "object", "description": "A billing method is used to enable billing on a weekly/bi-weekly/monthly\nbasis. When a user belongs to an organization with a billing method,\nthey will not be required to add a payment method to their profiles.\n\nThis model is not yet exposed to the API.\n", "properties": {"billing_address": {"$ref": "#/definitions/Address"}, "name": {"format": "char[32]", "type": "string", "example": "My Billing", "description": "Billing method name."}, "owner": {"$ref": "#/definitions/UserSummary"}, "billing_email": {"format": "char[254]", "type": "string", "example": "billing@cuztranslation.com", "description": "The email address that will recieve the invoices. If this is not\nprovided, the email address of the owner will be used.\n"}, "is_active": {"type": "bool", "description": "Indicates whether this billing method can be used. There can be more\nthan one active billing method.\n", "example": true}, "payment_schedule": {"format": "char[16]", "type": "string", "example": "monthly", "description": "The payment schedule of the billing account.\n\n- `weekly`: Weekly payment schedule.\n- `bi_weekly`: Bi-weekly payment schedule.\n- `monthly`: Monthly payment schedule.\n"}}}, "JobRequestJobList": {"type": "object", "description": "Used to give brief information when listing the jobs.", "properties": {"response_date": {"type": "string", "example": "2017-01-01T15:33", "format": "dateTime"}, "request_end_date": {"type": "string", "example": "2017-01-01T15:48", "format": "dateTime"}, "request_date": {"type": "string", "example": "2017-01-01T12:33", "format": "dateTime"}, "is_cancelled": {"type": "boolean", "example": false}, "is_expired": {"type": "boolean", "example": false}, "is_lao_project": {"type": "boolean", "description": "Enable for LAO projects. Revision cannot be used for LAO projects.\n", "example": false}}}, "ReferralOwner": {"type": "object", "description": "This is used to only show the owner of the referral with brief information.\n", "properties": {"owner": {"type": "object", "properties": {"first_name": {"type": "string", "example": "Jane"}, "last_name": {"type": "string", "example": "Doe"}}}, "is_default": {"type": "bool", "description": "Indicates whether this is the default referral that the customer owns.\n", "example": true}, "use_count": {"format": "int32", "type": "number", "example": 32, "description": "The number of times that others used this referral.\n"}}}, "JobRequest": {"required": ["job", "translator", "request_type"], "type": "object", "description": "A job request is created when a customer wants to work with a translator.\nThere can only be one active job request for one job with the same\n`request_type` and until that one has expired, responded or canceled, a\nnew one cannot be sent. When a job request is sent, the job's status is\nset to offer.\n", "properties": {"request_date": {"format": "dateTime", "type": "string", "example": "2017-01-01T12:33", "description": "This is the date job was request."}, "job_decline_reason": {"$ref": "#/definitions/JobDeclineReason"}, "job_distance": {"type": "boolean", "description": "The distance to the job location from the translator's location. If\nthis is a document job it will be 0. This is used to update the\ncommute fee. This is required for live job requests.\n", "example": false}, "job": {"$ref": "#/definitions/JobSummary"}, "translator": {"$ref": "#/definitions/TranslatorMinimal"}, "response_date": {"format": "dateTime", "type": "string", "example": "2017-01-01T15:33", "description": "The date the translator responded to the request. If the request was\ncanceled by the customer, this will be the cancellation date.\n"}, "request_type": {"format": "int32", "enum": [0, 1], "type": "integer", "example": 0, "description": "Indicates the type of the request.\n\n- `0` (translator): The request is intended for a translator or an\n interpreter. This is the default value.\n\n- `1` (proofreader): The request is intended for a proofreader. This\n value is only available for document jobs.\n"}, "request_end_date": {"format": "dateTime", "type": "string", "example": "2017-01-01T12:48", "description": "This is the date that the job request will be closed to the\ntranslator.\n"}, "is_cancelled": {"type": "boolean", "description": "This is false by default. But when the request is canceled, it will\nbe true.\n", "example": false}, "is_accepted": {"type": "boolean", "example": true}, "is_expired": {"type": "boolean", "description": "This will be true when the request has expired.", "example": false}, "translator_note": {"format": "char[1024]", "type": "string", "example": "I'm busy with other projects.", "description": "If none is provided, this field will have an empty string."}}}, "JobSummary": {"type": "object", "properties": {"status": {"enum": [0, 1, 2, 3, 4, 5, 6], "type": "integer", "description": "- `0` (Draft): This means that the job is only visible to the customer\n and there's no translator in the Job.\n\n- `1` (Offer): The job is waiting response from the translator\n\n- `2` (Active): The job is in progress. Job details cannot be changed\n at this point. Only translator can upload documents.\n\n- `3` (Completed): The job is completed.\n\n- `4` (Failed): The job was not completed by the translator.\n\n- `5` (Invalid): Job is invalid.\n\n- `6` (completed Request Sent): This means that a request is sent to\n complete the job.\n", "example": 0}, "active_completion_request_count": {"type": "boolean", "description": "The number of active completion requests.", "example": 2}, "page_count": {"type": "integer", "description": "If `job_type` is 'doc', this will have the page count. Otherwise, it\nwill be 0.\n", "example": 2}, "end_date": {"type": "string", "example": "2017-01-03T15:55", "format": "dateTime"}, "title": {"type": "string", "example": "Awesome Job", "format": "char[512]"}, "from_language": {"$ref": "#/definitions/Language"}, "is_archived": {"type": "boolean", "example": false}, "to_language": {"$ref": "#/definitions/Language"}, "job_type": {"enum": [0, 1, 2], "type": "integer", "description": "- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Video Interpretation Job\n", "example": 0}, "is_lao_project": {"type": "boolean", "description": "Enable for LAO projects. Revision cannot be used for LAO projects.\n", "example": false}, "creation_date": {"type": "string", "example": "2017-01-02T15:55", "format": "dateTime"}, "active_job_request_count": {"type": "boolean", "description": "The number of active job requests.", "example": 2}, "active_delay_request_count": {"type": "boolean", "description": "The number of active delay requests.", "example": 3}, "is_archived_for_translator": {"type": "boolean", "example": false}, "start_date": {"type": "string", "example": "2017-01-02T15:55", "format": "dateTime"}}}, "Payout": {"required": ["translator", "job"], "type": "object", "description": "See Payout tag for more information.", "properties": {"status": {"enum": [0, 1, 2, 3], "type": "integer", "description": "This status change will always be automatic and will not accept input\nfrom the outside.\n\n- `0` (n/a): This means that the project is still in progress.\n\n- `1` (invalid): This is the status for an invalid Payout. This means\n that the translator did not finish the project.\n\n- `2` (processing): This is the status for an processing payout. This\n means that the money is currently being processed.\n\n- `3` (paid): This is the status for a paid payout. This means that\n the translator received the payout.\n", "example": 0}, "earned_amount": {"format": "float", "type": "integer", "example": 23.32, "description": "This is the amount of money that the translator earns from the\nproject after the commision.\n"}, "paid_amount": {"format": "float", "type": "integer", "example": 23.32, "description": "This is the amount of money paid to the translator. This may differ\nfrom the `earned_amount` in case of a penalty to the translator or to\nthe customer.\n"}, "payout_date": {"format": "dateTime", "type": "string", "example": "2018-01-06T12:22", "description": "This is the date that translator received the money to their accounts.\nThis is updated automatically when the status is changed.\n"}, "creation_date": {"format": "dateTime", "type": "string", "example": "2018-01-01T12:22", "description": "This is the date that this object was created at. This is added\nautomatically.\n"}, "translator": {"$ref": "#/definitions/TranslatorSummary"}, "currency": {"type": "string", "description": "This is the currency as\n[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#Active_codes)\nstandard.\n", "example": "cad"}, "job": {"$ref": "#/definitions/JobSummary"}, "hst_amount": {"format": "float", "type": "integer", "example": 2.34, "description": "This is the amount of money for HST tax calculated from earned amount.\n"}, "bank_account": {"$ref": "#/definitions/BankAccount"}}}, "Purchase": {"required": ["customer", "job", "address"], "type": "object", "description": "Purchases are used to pay for a job that the customer is creating.\n`address` refers to the location that the purchase is being made from. It\nwill be equal to the customer's address automatically. If a billing method\nwas used and it has an address, then the address of the purchase will be\nthe address of the billing method.\n\nStripe charge ID is required to change the purchase status.\nWhen the job is completed, this `Purchase` will be processed and the\ncustomer card will be charged. If the customer does not have a payment\nmethod, this will fail and raise `PaymentMethodRequired` in code.\n\n# Purchase with Billing Method\n\nIf the owner of the purchase has an active billing account, that one will\nautomatically be used for this purchase. **Not that this behaviour will\nchange with the future versions.**\n\nIf the job was done using a billing method, the status can be changed to\npaid manually when the payment is actually received from the customer.\n", "properties": {"customer": {"$ref": "#/definitions/UserProfileSummary"}, "billing_method": {"$ref": "#/definitions/BillingMethod"}, "price_information": {"$ref": "#/definitions/PriceInformation"}, "taxes": {"$ref": "#/definitions/Tax"}, "creation_date": {"format": "dateTime", "type": "string", "example": "2018-01-01T12:33", "description": "This is automatically added by the API. This is the date that the\npurchase is created.\n"}, "currency": {"type": "string", "description": "This is the currency as\n[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#Active_codes)\nstandard. This is not required If the promotion is 100%.\n", "example": "cad"}, "job": {"$ref": "#/definitions/JobSummary"}, "status": {"enum": [0, 1, 2], "type": "integer", "description": "This status change will always be automatic and will not accept input\nfrom the outside.\n\n- `-1` (error): There was an error processing the payment.\n\n- `0` (unpaid): This means that the money has not yet me charged. This\n is usually the case If a promotion was used or the customer is a\n trusted one and they will be charged once the project ends.\n\n- `1` (on_hold): This means that the money is on hold. It's not yet\n charged from the card.\n\n- `2` (paid): This means that the money has been charged and withdrawn\n from the customer payment method.\n", "example": 0}, "address": {"$ref": "#/definitions/Address"}, "promotion": {"$ref": "#/definitions/Promotion"}, "stripe_charge_id": {"type": "string", "description": "This is the ID that refers to the charge on Stripe. This is not\nrequired If the promotion is 100%.\n", "example": "ch_128347wsdfhg763rysg8237rsduf"}, "charged_date": {"format": "dateTime", "type": "string", "example": "2018-01-02T12:33", "description": "This is the date that the money was charged to customer's card.\n"}}}, "DelayRequestSummary": {"type": "object", "properties": {"response_date": {"type": "string", "example": "2017-02-09T23:43", "format": "dateTime"}, "is_accepted": {"type": "boolean", "example": true}, "request_date": {"type": "string", "example": "2017-02-09T23:43", "format": "dateTime"}, "end_date": {"type": "string", "example": "2017-02-19T23:43", "format": "dateTime"}}}, "NatureGroup": {"required": ["name", "group_type"], "type": "object", "properties": {"is_archived": {"type": "boolean", "description": "If the nature group is archived, it will not show up in any relevant\nlisting but will be accessible from any existing-related job.\n", "example": false}, "name": {"type": "string", "description": "The name of the nature group. Default language is English.", "example": "Medical"}, "group_type": {"enum": [0, 1], "type": "integer", "description": "The type of the nature group.\n\n- `0`: This means that this nature group contains natures for live\n projects.\n\n- `1`: This means that this nature group contains natures for document\n projects.\n", "example": 1}, "natures": {"items": {"$ref": "#/definitions/Nature"}, "type": "array"}}}, "Language": {"type": "object", "description": "A language object", "properties": {"tier": {"type": "integer", "description": "This is the tier that the language belongs. The higher the tier, the\nmore expensive the translation.\n", "example": 1}, "code": {"format": "char[6]", "type": "string", "example": "en", "description": "The ISO 639-1 standard for languages (eg: tr, en). This way, the API\ncan return translations of the country names according to the user's\nlanguage or the `Accept-Language` header. For the list of the codes\nsee [here](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)\n"}, "name": {"format": "char[64]", "type": "string", "example": "English", "description": "The name of the language in the native format"}}}, "TranslatorSummary": {"type": "object", "properties": {"proofreading_average_response": {"format": "float", "type": "integer", "example": 13.2, "description": "Average response time, in minutes, to proofreading assignment\nrequests.\n"}, "language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "user_profile": {"$ref": "#/definitions/UserProfileSummary"}, "completed_video_live_jobs_count": {"type": "integer", "description": "The number of video interpretations jobs this translator completed.\nThis is increased whenever a job is completed.\n", "example": 42}, "bio": {"type": "string", "description": "Description of the user.", "example": "Here's a bio."}, "nature_groups": {"items": {"$ref": "#/definitions/NatureGroup"}, "type": "array"}, "live_job_average_response": {"format": "float", "type": "integer", "example": 123.2, "description": "The response time is not affected by whether the translator accepted\nthe job or denied it. It's about how long it took for the translator\nto respond to the job. This is the average time that it took for the\ntranslator to respond to the job. It's in minutes.\n"}, "completed_doc_jobs_count": {"type": "integer", "description": "The number of doc jobs this translator completed. This is increased\nwhenever a job is completed.\n", "example": 42}, "years_of_experience": {"type": "integer", "description": "The number of years the interpreter has worked.", "example": 4}, "live_job_video_average_response": {"format": "float", "type": "integer", "example": 13.2, "description": "The response time is not affected by whether the translator accepted\nthe job or denied it. It's about how long it took for the translator\nto respond to the job. This is the average time that it took for the\ntranslator to respond to the job. It's in minutes.\n"}, "hst_number": {"type": "string", "description": "HST number of the translator.", "example": "123456789RT0001 (Usually it is a 15-digit number)."}, "is_atio_certified": {"type": "boolean", "description": "If this is set to true, it means the translator is ATIO certified.\nATIO certified transaltors are required for translations of document\ntypes other than regular.\n", "example": false}, "doc_job_average_response": {"format": "float", "type": "integer", "example": 123.2, "description": "The response time is not affected by whether the translator accepted\nthe job or denied it. It's about how long it took for the translator\nto respond to the job. This is the average time that it took for the\ntranslator to respond to the job. It's in minutes.\n"}, "available_for_lao": {"type": "boolean", "description": "Indicates whether the translator accepts LAO projects.", "example": false}, "completed_proofreading_count": {"type": "integer", "description": "Number of completed proofreading assignments.", "example": 42}, "available_for_live_video_job": {"type": "boolean", "description": "If this is set to true, it means the interpreter can join the video\ninterpretations. If this is set to true, the address will not be\nrequired.\n", "example": false}, "available_for_doc_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make document\ntranslation.\n", "example": false}, "available_for_live_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make live\ntranslation.\n", "example": true}, "is_certified": {"type": "boolean", "description": "Indicates whether the translator is certified or not.", "example": false}, "completed_live_jobs_count": {"type": "integer", "description": "The number of live jobs this translator completed. This is increased\nwhenever a job is completed.\n", "example": 32}, "overall_rating": {"format": "float", "type": "integer", "example": 4.3, "description": "This is updated whenever a translator is rated. This is calculated\nbased on the overall rating of the translator. This will be [-1, 5].\nIf it is -1, then it means we still don't have enough data to\ncalculate a rating.\n"}}}, "Address": {"type": "object", "description": "The country and province fields can be null.", "properties": {"province": {"$ref": "#/definitions/Province"}, "city": {"$ref": "#/definitions/City"}, "district": {"format": "char[128]", "type": "string", "example": "Northcote", "description": "The district name"}, "country": {"$ref": "#/definitions/Country"}, "longitude": {"type": "integer", "description": "If the latitude and longitude are not set, both values will be 0.0.", "example": 0.0}, "raw": {"type": "string", "description": "This is the concatenated version of the address. The\nformat is \"Street, City, State Postal Code, Country\".\nIf the raw is provided initially, it is used instead.\n", "example": "1 Somewhere Ave, Northcote, VIC 3070, AU"}, "street": {"format": "char[128]", "type": "string", "example": "Somewhere Ave", "description": "The street name"}, "postal_code": {"format": "char[64]", "type": "string", "example": 3070, "description": "The postal code"}, "country_code": {"format": "char[3]", "type": "string", "example": "AU", "description": "The country code. The standart is ISO 3166-1 alpha-2."}, "latitude": {"type": "integer", "description": "If the latitude and longitude are not set, both values will be 0.0.", "example": 0.0}, "city_name": {"format": "char[128]", "type": "string", "example": "Sydney", "description": "The city name. This is optional."}}}, "GovernmentID": {"required": ["country"], "type": "object", "description": "Represents a government ID for a translator profile.", "allOf": [{"$ref": "#/definitions/FileResourceBaseModel"}, {"required": ["country"], "type": "object", "properties": {"status": {"format": "char[6]", "enum": [null, "UPLOAD", "READY"], "type": "string", "example": "UPLOAD", "description": "- `NULL`: The file has not yet been uploaded.\n - `UPLOAD`: The upload URL was generated and it must be uploaded\n by the client.\n - `READY`: The file was uploaded by the client.\n"}, "country": {"$ref": "#/definitions/Country"}}}]}, "JobCertificationMinimal": {"type": "object", "description": "A minimal serializer with only the name.", "properties": {"name": {"format": "char[256]", "type": "string", "example": "ATIO Certification", "description": "The user facing name of the certification."}}}, "LanguagePairID": {"type": "object", "properties": {"language_pair": {"type": "number", "example": 32, "format": "int64"}}}, "Dashboard": {"type": "object", "properties": {"upcoming_on_site_assignments": {"type": "integer", "description": "The number of upcoming on-site assignments.", "example": 10}, "translation_project_offers": {"type": "integer", "description": "The number of offered document assignments.", "example": 3}, "active_document_assignments": {"type": "integer", "description": "The number of active document assignments.", "example": 3}, "interpretation_project_offers": {"type": "integer", "description": "The number of offered interpretation assignments.", "example": 3}}}, "Error": {"type": "object", "properties": {"message": {"type": "string", "example": "Parameter error ocurred.", "description": "The user friendly error message from the API."}, "code": {"type": "number", "example": 32, "description": "This is the context dependant error code.\n"}, "parameters": {"type": "object", "properties": {"field_name": {"items": {"type": "string", "example": "Error description."}, "type": "array", "description": "Each item in the array details the error. These errors are\nhuman readable so it can be showed to the user. If\n`Accept-Language` header is specified, these errors will be\ntranslated to that language.\n"}}}}}, "JobDocument": {"required": ["name", "content_type", "file_checksum", "file_size", "language_code"], "type": "object", "description": "`file_url` field is auto-generated when the upload is finished. The\ndefault URL time for documents are 5 days or 1 day after the job's end\ndate. `source_document` field is **always required** when a translator is\nuploading a document.\n\n`JobDocument`s with `certification_type` are only created internally while\nexporting the certification. These documents cannot be changed from the\noutside.\n", "properties": {"status": {"enum": [-1, 0, 1, 2, 3, 4, 5, 6], "type": "integer", "description": "Status of the document is only important If the job has proofreading\nenabled.\n\n- `-1`: N/A. Invalid status.\n\n- `0`: Draft. Default value for jobs that have proofreading enabled.\n\n- `1`: Completed. This is used to indicate that the document is ready\n for proofreading. You cannot delete a completed document.\n\n- `2`: Uploading. Used when the document is being uploaded by the\n client.\n\n- `3`: Ready. Default value.\n\n- `4`: Calculating. Used to indicate that the word count for this\n document is in progress.\n\n- `5`: Merged. Used to indicate that this document has been merged\n together as the final document. Merged documents does not accept\n any changes from the outside.\n\n- `6`: Generating. It means that the document is being generated.\n When the document is ready for download, the status will become\n ready.\n", "example": 0}, "upload_date": {"format": "dateTime", "type": "string", "example": "2017-05-02T13:34", "description": "The upload date"}, "language_code": {"format": "char[3]", "type": "string", "example": "en", "description": "Language code of the document."}, "page_count": {"type": "integer", "description": "The total count of pages in the document. For text files, this will\nalways be 1. This number indicates the page count for this document.\n", "example": 3}, "file_checksum": {"format": "char[128]", "type": "string", "example": 1, "description": "The file's content type."}, "word_count": {"type": "integer", "description": "The total count of words in the document.", "example": 34523}, "cloud_name": {"type": "string", "description": "The file's name on the cloud.", "example": "test_file.pdf"}, "job": {"type": "integer", "description": "Since documents are already attached to the jobs, only the job ID is\nprovided here.\n", "example": 2}, "content_type": {"type": "string", "description": "The file's content type.", "example": "application/pdf"}, "file_size": {"type": "integer", "description": "The file's size in bytes.", "example": 10023487}, "owner": {"$ref": "#/definitions/UserMinimal"}, "assigned_start_page": {"format": "int32", "type": "integer", "example": 5, "description": "The page start number for the translator.\nThis field is not in the model but generated when the request is sent.\nIf the authenticated user is not a translator, this field will be 0.\n"}, "certification_type": {"$ref": "#/definitions/JobCertificationMinimal"}, "assigned_end_page": {"format": "int32", "type": "integer", "example": 5, "description": "The page end number for the translator.\nThis field is not in the model but generated when the request is sent.\nIf the authenticated user is not a translator, this field will be 0.\n"}, "translated_page_count": {"format": "int32", "type": "integer", "example": 23, "description": "The number of translated pages. This field will only be updated for\ntranslator documents. If this is a translator document and proof\nreading is enabled, then this represents the proofread page count.\nThis field is not in the model but generated when the request is sent.\n"}, "document_type": {"format": "int32", "enum": [0, 1, 2, 3, 4, 5], "type": "integer", "example": 5, "description": "Used to indicate the purpose of the document. Only the default type is\nincluded in price calculation.\n\n**If anything other than default type is selected, then the job\nparameter must also point to an existing job.**\n\nDocument type cannot be changed from/to default once set.\n\n- `0` (Default): The default type. If a `document_type` is not\nprovided this type is used. Only this type of document is included in\nprice calculation and the translator is only required to translate the\ndefault type documents.\n- `1` (Supporting): This type of documents are used as supporting\nmaterial for the default type documents. Only customers can upload\nsupporting documents.\n- `2` (Preview): Preview files are visible to the translator before\naccepting the project. Only customers can upload preview files.\n- `3` (Certification): Only translators can upload an affidavit.\n- `4` (Confidentiality Agreement): Only translators can upload a\nconfidentiality\n"}, "name": {"type": "string", "description": "The file's original name.", "example": "plan_to_destroy_the_world.pdf"}, "file_url": {"format": "char[2048]", "type": "string", "example": "https://www.examplefile.com/file.png", "description": "The file's download URL."}, "source_document": {"format": "int32", "type": "integer", "example": 5, "description": "The source document that this translation belongs to. This field can\nonly be used by translators and proofreaders. When assigning the\nsource document, the translator/proofreader must be assigned to it.\n"}, "owner_type": {"enum": [1, 2, 3], "type": "integer", "description": "The owner UserProfile of the document.\n\n- `1`: Customer\n\n- `2`: Translator\n\n- `3`: Proofreader\n", "example": 2}}}, "CompletedRequestDeclineReason": {"type": "object", "description": "The reason the job completed request was denied by the customer. The\ndefault text is always in English.\n", "properties": {"reason": {"format": "char[1024]", "type": "string", "example": "Busy with other projects.", "description": "This is the reason the translator didn't accept the job."}, "translations": {"items": {"$ref": "#/definitions/CompletedRequestDeclineReasonTranslation"}, "type": "array"}}}, "UserProfileSummary": {"type": "object", "description": "This is the main model used for customers and translators. When a\ncustomer wants to become a translator, the created translator is attached\nto `UserProfile`.\n", "allOf": [{"$ref": "#/definitions/UserSummary"}, {"properties": {"translator": {"type": "integer", "description": "If the user is a translator this field will have the translator\nID. If the user is not a translator, this field will be empty.\n", "example": 27}, "is_payment_method_required": {"type": "bool", "description": "This field indicates whether a payment method is required from\nthis user to create a project. This will be false If the user\nhas an active and approved billing method. When this field is true\nthe user should not be asked for a payment method.\n", "example": false}, "address": {"$ref": "#/definitions/Address"}, "completed_doc_jobs_count": {"type": "integer", "description": "The number of doc jobs this customer completed. This is increaed\nwhenever a job is completed.\n", "example": 23}, "user_type": {"type": "integer", "description": "The user type.\n\n- `0` (company): User belongs to a company.\n\n- `1` (law firm): User belongs to a law firm.\n\n- `2` (individual): User is an individual.\n\n- `3` (translator): User is a translator.\n", "example": 2}, "completed_live_jobs_count": {"type": "integer", "description": "The number of live jobs this customer completed. This is increaed\nwhenever a job is completed.\n", "example": 2}}}]}, "TranslationExperience": {"type": "object", "description": "This object represents the years of experience for both translation and\ninterpretation.\n", "allOf": [{"$ref": "#/definitions/LanguageServiceType"}, {"required": ["language_pair", "years_of_experience", "service_type"], "type": "object", "properties": {"language_pair": {"$ref": "#/definitions/LanguagePair"}, "years_of_experience": {"type": "number", "description": "The service type indicates whether this is an interpretation or\ntranslation service.\n", "format": "int32"}}}]}, "LanguagePairCreate": {"required": ["source_language", "target_language"], "type": "object", "properties": {"source_language": {"type": "number", "example": 32, "format": "int64"}, "target_language": {"type": "number", "example": 23, "format": "int64"}}}, "ReferralUsage": {"type": "object", "description": "Everytime a customer is using a referral, a ReferralUsage is created.\nA referral might have a usage limit, so in that case you won't be able\nto create a ReferralUsage.\n", "properties": {"customer": {"format": "char[16]", "type": "string", "example": "create_account", "description": "Developer friendly, unique action name."}, "referral": {"format": "char[32]", "type": "string", "example": "Create Account", "description": "User friendly name."}}}, "DeliveryType": {"type": "object", "description": "Delivery types are specific to countries and provinces.\n", "properties": {"currency": {"format": "char[3]", "type": "string", "example": "cad", "description": "The currency of the price."}, "price": {"format": "float", "type": "number", "example": 34, "description": "The price of the delivery type for the intended address."}, "name": {"format": "char[16]", "type": "string", "example": "Canada Post", "description": "The name of the service provider."}, "country": {"$ref": "#/definitions/Country"}}}, "DelayRequestCreate": {"type": "object", "properties": {"job": {"type": "integer", "description": "THe job ID.", "example": 13}, "start_date": {"format": "date-time", "type": "string", "example": "2018-01-02T10:23", "description": "This is the new start date of the job. This will only be present for\nlive jobs. If it is left blank, it will have no effect.\n"}, "end_date": {"format": "date-time", "type": "string", "example": "2018-01-02T13:23", "description": "This is the new end date of the job."}}}, "PriceInformation": {"type": "object", "description": "Holds the calculated price for a job.\n", "properties": {"certification_payout": {"type": "string", "description": "If a one time certificate was purchased, returns the its payout.\nIf not, returns 0.\n", "example": "cad"}, "stripe_fee": {"format": "float", "type": "integer", "example": 0.61, "description": "The amount of money Stripe charges us for the interaction of `total`.\n"}, "rush_hour_rate": {"type": "bool", "description": "If rush hour rate was applied to this price information, this field\nindicates the additional price for the rush project.\n", "example": true}, "certification_price": {"type": "string", "description": "If a one time certificate was purchased, returns the its price.\nIf not, returns 0.\n", "example": 32}, "price": {"format": "float", "type": "integer", "example": 84, "description": "The price of the project for the given specifications. This will\nalways have the full price. If there's a discount it will be in the\ndiscount_amount field. This price represents the amount **without**\nthe discount.\n"}, "translator_payout": {"format": "float", "type": "integer", "example": 10.92, "description": "The amount of money that the translators will earn from this. This\nwill be -1 If enough information is not available to calculate it. If\nthere are multiple translators in the job, this will have the total\namount of payout to the translators.\n"}, "tax": {"format": "float", "type": "integer", "example": 10.92, "description": "This is the amount of tax that will be charged for the project price\nin the mentioned currency.\n"}, "delivery_fee": {"type": "number", "description": "If a job has document delivery this will reflect the delivery price.\n", "example": true}, "currency": {"type": "string", "description": "Purchase currency.", "example": "cad"}, "commission_amount": {"format": "float", "type": "integer", "example": 6, "description": "Our cut from the project."}, "commute_fee": {"format": "float", "type": "integer", "example": 49.95, "description": "If the job distance is more than the limit, this will have the amount\nof money that the translator will get for the commute.\n"}, "promotion": {"type": "integer", "description": "If a promotion was applied to the priceing, this will have that\npromotion id. Otherwise it will be -1.\n", "example": 1}, "total": {"format": "float", "type": "integer", "example": 10.92, "description": "This is the total amount of money that the customer will pay.\nIt's `(price + tax + commute_fee) - discount_amount`\n"}, "discount_amount": {"format": "float", "type": "integer", "example": 10.92, "description": "If a promotion was applied to the pricing, this will have the amount\nof discount from the price.\n"}}}, "Course": {"type": "object", "description": "A course object", "properties": {"name": {"type": "string", "description": "The name of the course. The name will always be in lowercase", "format": "char[256]"}, "year": {"type": "integer", "description": "The year the course was finished.", "format": "int32"}}}, "VideoChatAccounts": {"type": "object", "properties": {"skype": {"type": "string", "description": "The Skype username of the user.", "example": "MySkypeRocks"}, "hangouts": {"type": "string", "description": "Gmail address for Google Hangouts", "example": "LetsHangouts"}}}, "Education": {"type": "object", "description": "Information about translator's education.", "allOf": [{"$ref": "#/definitions/FileResourceBaseModel"}, {"required": ["institution_name", "graduation_year", "degree", "country"], "type": "object", "properties": {"status": {"format": "char[6]", "enum": [null, "UPLOAD", "READY"], "type": "string", "example": "UPLOAD", "description": "- `NULL`: The file has not yet been uploaded.\n - `UPLOAD`: The upload URL was generated and it must be uploaded\n by the client.\n - `READY`: The file was uploaded by the client.\n"}, "degree": {"$ref": "#/definitions/AcademicDegree"}, "translation_related": {"type": "boolean", "description": "Set this to true If the education is for translation/interpretation\npurposes. Defaults to `false`.\n", "example": false}, "graduation_year": {"type": "integer", "example": 2001, "format": "int32"}, "country": {"$ref": "#/definitions/AcademicDegree"}, "institution_name": {"type": "string", "example": "MIT", "format": "char[32]"}}}]}, "TranslatorRating": {"required": ["translator", "job", "overall_rating", "would_you_use_again_rating"], "type": "object", "properties": {"customer": {"type": "integer", "description": "The ID of the customer who submitted the rating.", "example": 4}, "would_you_use_again_rating": {"type": "integer", "description": "The question is \"Would you use this translator/translator for another project?\". This is between 1 and 5\ninclusive. This is asked for both types of jobs.\n", "example": 3}, "appearance_rating": {"type": "integer", "description": "The question is \"Did the translator show up with appropriate clothing?\". This is between 1 and 5 inclusive.\nThis is only asked for live jobs.\n", "example": 3}, "comment": {"type": "string", "description": "The comment from the customer. This has no character limit.", "example": "He's OK, I guess..."}, "translator": {"type": "integer", "description": "The ID of the recipient translator.", "example": 4}, "job": {"type": "integer", "description": "The ID of the Job this rating was done for.", "example": 4}, "kindness_rating": {"type": "integer", "description": "The question is \"Was the translator polite, respectful and tactful?\". This is between 1 and 5 inclusive.\nThis is only asked for live jobs.\n", "example": 5}, "arrived_on_time": {"type": "integer", "description": "The question is \"Was the interpretation at the interpretation site on time?\". This is between 1 and 5\ninclusive. This is only asked for live jobs.\n", "example": 5}, "overall_rating": {"type": "integer", "description": "This is between 1 and 5 inclusive. This is asked for both types of jobs.", "example": 4}}}, "City": {"deprecated": true, "type": "object", "properties": {"province": {"$ref": "#/definitions/Province"}, "country": {"deprecated": true, "type": "integer", "description": "The country ID.", "example": 23}, "name": {"deprecated": true, "format": "char[64]", "type": "string", "example": "Ankara", "description": "The name of the city in the country language."}}, "description": "This model is deprecated. Use the `city_name` field of `Address` instead.\n"}, "UserMinimal": {"type": "object", "description": "Provides minimal information about a user.", "properties": {"first_name": {"type": "string", "description": "First name of the user.", "example": "Furkan"}, "last_name": {"type": "string", "description": "Last name of the user.", "example": "Uzumcu"}, "id": {"type": "integer", "description": "User ID.", "example": 1}}}, "DelayedRequestDeclineReasonTranslation": {"type": "object", "description": "The reason the job was denied by the translator.", "properties": {"reason": {"format": "char[512]", "type": "string", "example": "Baska islerle mesgulum.", "description": "This is the reason the translator didn't accept the job."}, "language_code": {"format": "char[512]", "type": "string", "example": "Baska islerle mesgulum.", "description": "This is the reason the translator didn't accept the job."}}}, "TranslatorQueue": {"type": "object", "description": "Translator queue is used to send automatic job requests to translators when the original translator did not accept\nthe original job request. `TranslatorQueue` is created when the original `JobRequest` is declined by the\ntranslator. When a job request is sent out for one of the translators in the queue, that translator will be\nremoved from the `translators` field.\n\nThe queue can be re-generated by setting `in_progress` to true when there are no more translators in the list.\n", "properties": {"proofreader_completion_date": {"format": "dateTime", "type": "string", "example": "2017-01-01T12:48", "description": "The date that the queue was completed. Copletion either means that somebody accepted the proofreading request\nor we ran out of proofreaders.\n"}, "translator_completion_date": {"format": "dateTime", "type": "string", "example": "2017-01-01T12:48", "description": "The date that the queue was completed. Copletion either means that somebody accepted the job request or we\nran out of translators.\n"}, "remaining_translator_count": {"format": "int32", "type": "integer", "example": 10, "description": "This is the number of translators that are currently in the queue. This number will initially be the same\nas `translator_queue_length`.\n"}, "proofreader_in_progress": {"type": "bool", "description": "This will be true as long as the queue is running for proofreaders. This field can be changed in the admin\npanel to pause or resume a queue. But note that it cannot be set to true If the job already has a translator.\n", "example": true}, "remaining_proofreader_count": {"format": "int32", "type": "integer", "example": 10, "description": "This is the number of proofreaders that are currently in the queue. This number will initially be the same\nas `proofreader_queue_length`.\n"}, "creation_date": {"format": "dateTime", "type": "string", "example": "2017-01-01T12:33", "description": "The date that the queue was created. This is added automatically."}, "job": {"format": "int64", "type": "integer", "example": 23, "description": "Job's ID"}, "proofreaders": {"items": {"$ref": "#/definitions/TranslatorMinimal"}, "type": "array"}, "translators": {"items": {"$ref": "#/definitions/TranslatorMinimal"}, "type": "array"}, "translator_queue_length": {"format": "int32", "type": "integer", "example": 10, "description": "This is the number of translators that is generated for this queue. This number is constant and does\nnot change.\n"}, "translator_in_progress": {"type": "bool", "description": "This will be true as long as the queue is running. This field can be changed in the admin panel to pause\nor resume a queue. But note that it cannot be set to true If the job already has a translator.\n", "example": true}, "proofreader_queue_length": {"format": "int32", "type": "integer", "example": 10, "description": "This is the number of proofreaders that is generated for this queue. This number is constant and does\nnot change.\n"}}}, "TranslatorProfile": {"type": "object", "description": "This is the new model that keeps the translator information.", "allOf": [{"$ref": "#/definitions/TranslatorUser"}, {"required": ["additional_details", "is_registration_completed"], "type": "object", "properties": {"language_services": {"items": {"$ref": "#/definitions/LanguageService"}, "type": "array"}, "interpretation_language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "addresses": {"items": {"$ref": "#/definitions/Address"}, "type": "array"}, "mother_tongue": {"$ref": "#/definitions/Language"}, "additional_details": {"type": "string", "example": "I live and breathe translation.", "format": "char[2048]"}, "translation_language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "is_registration_completed": {"type": "boolean", "description": "This will be true once the translator have put in all the required\ninformation. This does not mean that the translator was approved.\n", "example": true}}}]}, "NatureGroupTranslation": {"type": "object", "properties": {"name": {"type": "string", "description": "The translated name"}, "translation_language": {"$ref": "#/definitions/Language"}}}, "PenaltyCreate": {"required": ["job", "target", "incurred_percentage", "user_profile"], "type": "object", "properties": {"status": {"enum": [0, 1, 2], "type": "integer", "description": "The status of the penalty. **This is not required.**\n\n- `0` (incurred): This means that the penalty was fully applied to the target.\n\n- `1` (cancelled): This means that the penalty was cancelled and will not be applied to the target.\n\n- `2` (partial): This means that the penalty was partially subjected and there is still money that needs to\n be taken from the target.\n", "example": 0}, "system_manager": {"type": "integer", "description": "This is the system manager who created the penalty. This can be null If the creation was automated.\nIf a system manager is creating it, it will be set automatically.\n", "example": 1}, "user_profile": {"type": "integer", "description": "The user profile ID for the user profile for which we are creating a penalty.", "example": 2}, "remaining_amount": {"format": "float", "type": "integer", "example": 10, "description": "This is the amount of penalty still remaining."}, "system_manager_note": {"format": "char[1024]", "type": "string", "example": "Something something danger zone.", "description": "This is the note that the system manager left for this penalty.\n"}, "job": {"type": "integer", "description": "The job ID for the job for which we are creating a penalty.", "example": 23}, "incurred_percentage": {"format": "float", "type": "integer", "example": "113.123.23.231", "description": "This is the amount of percentage that will be cut from the project price for this penalty.\n"}, "incurred_amount": {"format": "float", "type": "integer", "example": 0, "description": "This is the amount of money that is used for this penalty. The default value is 0.\n"}, "target": {"enum": [0, 1], "type": "integer", "description": "This is the target user for the penalty. See the available options at the top of the page.\n\n- `0` (translator): This means that the job was cancelled or failed because of the translator and s/he will\n be subject to the penalty.\n\n- `1` (customer): This means that the job was canelled or failed because of the customer and s/he will be\n subject to the penalty.\n", "example": 0}}}, "LanguageTranslation": {"required": ["name"], "type": "object", "description": "The same language with different names can be added.", "properties": {"name": {"type": "string", "example": "Amerika", "format": "char[64]"}, "translation_language": {"$ref": "#/definitions/Language"}}}, "PhoneNumberMixin": {"type": "object", "properties": {"phone": {"type": "string", "example": "+905064569878", "format": "char[15]"}}}, "PayoutListJob": {"type": "object", "properties": {"job_type": {"enum": [0, 1, 2], "type": "integer", "description": "- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Video Interpretation Job\n", "example": 0}, "start_date": {"type": "string", "example": "2017-01-02T15:55", "format": "dateTime"}, "end_date": {"type": "string", "example": "2017-01-03T15:55", "format": "dateTime"}, "title": {"type": "string", "example": "Awesome Job", "format": "char[512]"}}}, "LAOCertification": {"required": ["number"], "type": "object", "description": "Represents an LAO certification.", "properties": {"owner": {"$ref": "#/definitions/UserProfileSummary"}, "expiration_date": {"format": "datetime", "type": "string", "example": 1, "description": "Indicates the date when this certification will be expired.\n"}, "number": {"format": "char[128]", "type": "string", "example": "en", "description": "Customer's LAO Certification number."}, "creation_date": {"format": "datetime", "type": "string", "example": "18-01-2020T15:26", "description": "The date that this certification was added to the profile."}}}, "CompletedRequestUpdate": {"type": "object", "description": "Used when listing the jobs.", "properties": {"decline_note": {"type": "string", "example": "The document is not translated properly.", "format": "char[1024]"}, "is_accepted": {"type": "boolean", "example": false}, "decline_reason": {"type": "integer", "example": 1}}}, "AssignedPage": {"type": "object", "description": "This model is used to store the assigned pages to a translator for a\ndocument. AssignedPage can be created without a translator. When a\ntranslator accepts the project request, you can get the next available\nAssignedPage and assign the translator to it.\n", "properties": {"translator": {"$ref": "#/definitions/TranslatorMinimal"}, "document": {"$ref": "#/definitions/JobDocument"}, "start_page": {"type": "integer", "description": "The page number to start translating. This page is included.\n", "example": 3}, "word_count": {"type": "integer", "description": "The number of pages in the assigned pages.", "example": 500}, "end_page": {"type": "integer", "description": "The page number to stop translating. This page is included.", "example": 10}}}, "BankAccount": {"required": ["name", "branch_number", "institution_number", "account_number", "paypal_username"], "type": "object", "description": "A BankAccount is used to transfer money to the translator. A translator\ncan have multiple accounts but only one can be active. When a translator\ncreates a new account, the old one is set to inactive. If paypal account\nis not provided, the bank account details are required.\n\nIf a payout was done to a bank account, it cannot be deleted or edited.\nA deactivated bank account can be activated again, and when it is\nactivated the `deactivation_date` is set to null.\n", "properties": {"deactivation_date": {"format": "date-time", "type": "string", "example": "2018-02-08T12:33", "description": "The date that this account was set to inactive."}, "translator": {"$ref": "#/definitions/Translator"}, "name": {"format": "char[32]", "type": "string", "example": "TD Bank", "description": "The user given name to this account."}, "is_active": {"type": "boolean", "description": "Whether this bank account is being used or not. There can only be one\nactive bank account.\n", "example": true}, "paypal_username": {"format": "char[128]", "type": "string", "example": "PayBuddy", "description": "If it is not set, this will be an empty string. If this field is\nprovided, the bank account details are not mandatory.\n"}, "institution_number": {"format": "char[16]", "type": "string", "example": 3233, "description": "Institution number of the bank account. If it is not set, this will be\nan empty string.\n"}, "account_number": {"format": "char[16]", "type": "string", "example": 273628465, "description": "Account number for the bank account. If it is not set, this will be an\nempty string.\n"}, "payout_count": {"format": "int32", "type": "integer", "example": 1, "description": "The number of payouts done to this account. This is not in the model\nbut returned with the serializer.\n"}, "creation_date": {"format": "date-time", "type": "string", "example": "2018-01-08T12:33", "description": "The date that this account was created."}, "branch_number": {"format": "char[16]", "type": "string", "example": 132, "description": "The branch number of the bank account. If it is not set, this will be\nan empty string.\n"}}}, "TemporaryPassword": {"type": "object", "description": "Used to store the temporary passwords for a user. The default life time of\na temporary password is 3 minutes.\n", "properties": {"password_type": {"format": "int32", "enum": [0, 1, 2], "type": "integer", "example": 0, "description": "Indicates the type of the password.\n\n- `0` (login): Used to log in.\n\n- `1` (signup): Used to sign up.\n\n- `2` (signup): Used to reset password.\n"}, "user": {"$ref": "#/definitions/User"}, "is_used": {"type": "bool", "description": "Indicates whether the password was used or not. Used passwords cannot\nbe used again.\n", "example": false}, "expiration_date": {"format": "date-time", "type": "string", "example": "2018-02-06T12:15", "description": "The date that this password will expire."}, "password": {"type": "string", "description": "Hashed temporary password. When the password expires, this filed will\nbe reset to an empty string.\n", "example": "pdf2348dn373ha"}, "is_expired": {"type": "bool", "description": "Indicates whether the password has expired.", "example": false}}}, "LanguageService": {"type": "object", "description": "Describes a service that a translator provides for us.", "allOf": [{"$ref": "#/definitions/LanguageServiceType"}, {"required": ["name"], "type": "object", "properties": {"name": {"type": "string", "example": "Transcription", "format": "char[64]"}, "description": {"type": "string", "example": "Translator transcribes the audio/video and translates it.", "format": "char[2048]"}}}]}, "ReferralAction": {"type": "object", "description": "An action is used to determine what a user can do with a referral. When\nan action is executed, a ReferralUsage will be created with this action.\nIf an action is not in the list of available actions of a Referral, then\nnothing will happen.\n", "properties": {"codename": {"format": "char[16]", "type": "string", "example": "create_account", "description": "Developer friendly, unique action name."}, "name": {"format": "char[128]", "type": "string", "example": "Create Account", "description": "User friendly name."}}}, "DelayRequestUpdate": {"type": "object", "description": "Use to update a request.", "properties": {"decline_note": {"type": "string", "example": "The document is not translated properly.", "format": "char[1024]"}, "is_accepted": {"type": "boolean", "example": false}, "decline_reason": {"type": "integer", "example": 1}}}, "JobCertification": {"required": ["name", "price_model", "job_type"], "type": "object", "description": "Represents a job certification. See the tag documentation for details.\n`price_model` field is not exposed to the API.\n", "properties": {"job_type": {"required": true, "description": "- `-1`: All types.\n\n- `0`: Document Job.\n\n- `1`: On-Site Job.\n\n- `2`: Video Interpretation Job.\n", "format": "int32", "enum": [-1, 0, 1, 2], "type": "integer", "example": 1}, "name": {"format": "char[256]", "type": "string", "example": "ATIO Certification", "description": "The user facing name of the certification."}}}, "JobRequestCreate": {"required": ["job", "translator"], "type": "object", "description": "JobRequest is used to log the responses to jobs by translators.", "properties": {"translator": {"format": "int32", "type": "integer", "example": 12, "description": "The translator for the job."}, "job_distance": {"format": "int32", "type": "integer", "example": 23, "description": "Distance in kilometers."}, "job": {"type": "integer", "example": 21, "format": "int32"}, "auto_assign": {"type": "bool", "description": "Set to true to let the API assign a translator automatically. If this\nis set to true, you can skip `translator` paramter.\n", "example": false}}}, "Job": {"required": ["customer", "title", "job_type", "end_date", "from_language", "to_language", "nature"], "type": "object", "description": "The `payout` fields contains the payout for the authenticated user.", "properties": {"active_completion_request_count": {"type": "boolean", "description": "The number of active completion requests.", "example": 2}, "is_archived": {"type": "boolean", "description": "A job can be archived.", "example": false}, "page_count": {"type": "integer", "description": "If `job_type` is 'doc', this will have the page count. Otherwise, it will\nbe 0.\n", "example": 2}, "job_type": {"required": true, "description": "- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Video Interpretation Job\n", "format": "int32", "enum": [0, 1, 2], "type": "integer", "example": 1}, "word_count": {"type": "integer", "description": "If `job_type` is 'doc', this will have the word count. Otherwise, it will\nbe 0.\n", "example": 1250}, "creation_date": {"type": "string", "description": "Job's creation date.", "example": "2017-01-01T12:55"}, "active_delay_request_count": {"type": "boolean", "description": "The number of active delay requests.", "example": 3}, "is_archived_for_translator": {"type": "boolean", "description": "This is the archiving control for translator.", "example": false}, "note": {"format": "char[1048]", "type": "string", "example": "Please be nice.", "description": "Customer's note to the translator."}, "title": {"format": "char[512]", "required": true, "type": "string", "example": "Awesome Job", "description": "Job's title"}, "is_rush_order": {"type": "boolean", "description": "Set this to true to enable rush order. This should be set to true If the\ncustomer's deadline is before the estimated delivery for one translator.\n", "example": false}, "total_duration": {"type": "integer", "description": "if job_type is 'live', this is the total duration of the job in minutes.\nThis is calculated whenever the `start_date` and `end_date` properties of\nthe job changes. If the job type is `doc`, then this is the total duration\nin minutes after the translator accepts the job.\n", "example": 1440}, "video_caller": {"format": "int32", "enum": [0, 1, 2], "type": "integer", "example": 1, "description": "Determines who is calling who for a video interpretation job. The default\nvalue is `not_specified`. It is required for a video job.\n\n- `0`: Not Specified. This means that the job type is not video.\n\n- `1`: Customer is calling the interpreter.\n\n- `2`: Interpreter is calling the customer.\n"}, "document_delivery": {"$ref": "#/definitions/DocumentDelivery"}, "active_job_request_count": {"type": "boolean", "description": "The number of active job requests.", "example": 2}, "response_date": {"type": "string", "description": "Job response date", "example": "2017-01-01T15:55"}, "note_for_cuz": {"format": "char[1048]", "type": "string", "example": "Some note.", "description": "Customer's note to CUZ."}, "is_accepted": {"type": "boolean", "description": "Job accept/decline", "example": true}, "start_date": {"format": "dateTime", "type": "string", "example": "2017-01-02T15:55", "description": "if job_type is 'live', start_date is the translation start time. If the\njob type is document, then the job start date will be `null` until the\ntranslator accepts the job.\n"}, "proofreaders": {"items": {"$ref": "#/definitions/TranslatorMinimal"}, "type": "array"}, "status": {"format": "int32", "enum": [0, 1, 2, 3, 4, 5, 6], "type": "integer", "example": 0, "description": "The default value is draft.\n\n- `0` (Draft): This means that the job is only visible to the customer and\n there's no translator in the Job.\n\n- `1` (Offer): The job is waiting response from the translator\n\n- `2` (Active): The job is in progress. Job details cannot be changed at\n this point. Only translator can upload documents.\n\n- `3` (Completed): The job is completed.\n\n- `4` (Failed): The job was not completed by the translator, or the\n customer didn't arrive for the job.\n\n- `5` (Invalid): Job is invalid.\n\n- `6` (completed Request Sent): This means that a request is sent to\n complete the job.\n"}, "customer": {"$ref": "#/definitions/UserProfileSummary"}, "translator_queue": {"$ref": "#/definitions/TranslatorQueue"}, "end_date": {"format": "dateTime", "required": true, "type": "string", "example": "2017-01-03T15:55", "description": "if job_type is 'doc', end_date is the last hand-in date for the document\ntranslation. if job_type is 'live', end_date is the translation end time.\n"}, "nature": {"$ref": "#/definitions/Nature"}, "is_lao_project": {"type": "boolean", "description": "Enable for LAO projects. Revision cannot be used for LAO projects.\n", "example": false}, "address": {"$ref": "#/definitions/Address"}, "proofreading_enabled": {"type": "boolean", "description": "This field indicates that the project requires proofreading. If the\nproject is not a translation, this field will always be false.\n", "example": false}, "certification_type": {"$ref": "#/definitions/JobCertification"}, "from_language": {"$ref": "#/definitions/Language"}, "payout": {"$ref": "#/definitions/PayoutSummary"}, "purchase": {"$ref": "#/definitions/Purchase"}, "job_distance": {"type": "number", "description": "If job_type is 'live', this will have the distance between the live job\nlocation and the location of the appointed translator. Otherwise it ill\nbe 0.\n", "example": 0}, "to_language": {"$ref": "#/definitions/Language"}, "over_the_phone": {"type": "boolean", "description": "Whether the interpretation to be done over the phone. The\nnecessary contact details must be given in the \"note\" field.\n", "example": false}, "video_chat_accounts": {"$ref": "#/definitions/VideoChatAccounts"}, "translators": {"items": {"$ref": "#/definitions/TranslatorMinimal"}, "type": "array"}, "dress_code": {"format": "int32", "enum": [0, 1, 2, 3], "type": "integer", "example": 1, "description": "Dress code for the live interpretation.\n\n- `0`: Not Specified\n\n- `1`: Formal\n\n- `2`: Semi-Formal\n\n- `3`: Casual\n"}, "referral": {"$ref": "#/definitions/ReferralSummary"}}}, "AcademicDegree": {"required": ["name"], "type": "object", "description": "Academic degree.", "properties": {"name": {"type": "string", "example": "Master's Degree", "format": "char[32]"}}}, "UserSummary": {"type": "object", "properties": {"username": {"type": "string", "example": "john_wayne", "format": "char[150]"}, "phone": {"type": "string", "example": 905023659878, "format": "char[15]"}, "first_name": {"type": "string", "example": "John", "format": "char[30]"}, "last_name": {"type": "string", "example": "Wayne", "format": "char[30]"}, "last_login": {"type": "string", "example": "2017-01-03T12:45", "format": "dateTime"}, "email": {"type": "string", "example": "user@user.com", "format": "char[254]"}, "profile_photo": {"type": "string", "example": "https://www.blah.bleh/profile.jpg", "format": "url"}}}, "FileResourceBaseModel": {"required": ["original_file_name", "content_type", "file_checksum", "file_size"], "type": "object", "properties": {"upload_date": {"type": "string", "example": "2020-01-01T12:33", "format": "datetime"}, "original_file_name": {"type": "string", "description": "The file name on the local file system.", "example": "passport.jpeg"}, "content_type": {"type": "string", "example": "image/jpeg"}, "cloud_name": {"type": "string", "description": "This is auto generated.", "example": "1234567890ABCDEF.jpeg"}, "url": {"type": "string", "description": "Url government ID is accessible at.", "example": "https://example.com/example.png"}, "file_size": {"type": "integer", "description": "In bytes.", "example": 12345}, "file_checksum": {"type": "string", "example": "1234567890ABCDEF"}}}, "NatureTranslation": {"type": "object", "properties": {"name": {"type": "string", "description": "The translated name"}, "translation_language": {"$ref": "#/definitions/Language"}}}, "CompletedRequest": {"type": "object", "description": "Definition for the completed request model.", "properties": {"request_date": {"type": "string", "description": "Completed request request date", "example": "2017-09-92T12:34"}, "response_date": {"type": "string", "description": "Completed request response date", "example": "2017-09-92T12:34"}, "is_active": {"type": "boolean", "description": "Completed request active/deactive. When the request is responded, this\nwill be false.\n", "example": true}, "job": {"$ref": "#/definitions/JobSummary"}, "translator": {"$ref": "#/definitions/TranslatorMinimal"}, "decline_note": {"format": "char[1024]", "type": "string", "example": "Here's why I am declining this.", "description": "If `is_accepted` is `false` then this field is mandatory. If the job\nis accepted this will be an empty string.\n"}, "request_type": {"format": "int32", "enum": [0, 1], "type": "integer", "example": 0, "description": "Indicates the type of the request.\n\n- `0` (translator): The request is intended for a translator or an\n interpreter. This is the default value.\n\n- `1` (proofreader): The request is intended for a proofreader. This\n value is only available for document\n jobs.\n"}, "is_cancelled": {"type": "boolean", "description": "Whether the request is cancelled or not. When the request is cancelled,\nit will no longer be active.\n", "example": false}, "is_accepted": {"type": "boolean", "description": "Completed request accept/decline", "example": true}, "decline_reason": {"$ref": "#/definitions/CompletedRequestDeclineReason"}}}, "JobRequestSummary": {"properties": {"request_date": {"type": "string", "example": "2017-01-01T12:33", "format": "dateTime"}, "job_decline_reason": {"$ref": "#/definitions/JobDeclineReason"}, "translator": {"$ref": "#/definitions/TranslatorMinimal"}, "response_date": {"type": "string", "example": "2017-01-01T15:33", "format": "dateTime"}, "is_cancelled": {"type": "boolean", "example": false}, "is_accepted": {"type": "boolean", "example": true}, "is_expired": {"type": "boolean", "example": false}, "translator_note": {"type": "string", "example": "I'm busy with other projects.", "format": "char[1024]"}}, "type": "object", "description": "Used to list the job requests along with the job.", "is_lao_project": {"type": "boolean", "request_end_date": {"type": "string", "example": "2017-01-01T12:33", "format": "dateTime"}, "description": "Enable for LAO projects. Revision cannot be used for LAO projects.\n", "example": false}}, "DocumentDeliveryBase": {"required": ["job", "address", "delivery_type", "documents"], "type": "object", "properties": {"status": {"type": "string", "description": "The status of the delivery.\nOptions are:\n\n- `pending`: The package is not ready.\n\n- `processing`: The package is being prepared to be shipped.\n\n- `shipped`: The package has been given to the delivery service\nprovider. See the tracking ID to track the delivery status.\n", "example": "pending"}, "job": {"format": "int64", "type": "int", "example": 1, "description": "The job for which we are doing the delivery."}, "tracking_id": {"format": "char[24]", "type": "string", "example": "0000 0000 0000 0000", "description": "The tracking ID provided by the delivery service provider."}, "address": {"$ref": "#/definitions/Address"}}}, "ProgressReport": {"type": "object", "description": "Used to report the latest situation of a document. The `document` field is\nthe document that the progress is being reported on.\n", "properties": {"translator": {"$ref": "#/definitions/TranslatorMinimal"}, "page_count": {"format": "int32", "required": true, "type": "int", "example": 32, "description": "The currently translated total number of pages. The value for this\nfield cannot be less than 0.\n"}, "document": {"$ref": "#/definitions/JobDocument"}, "creation_date": {"format": "date-time", "required": false, "type": "string", "example": "2018-01-05T12:22", "description": "The date that this report was created. It's a UTC ISO date time\nstring. This is auto generated.\n"}}}, "Pagination": {"type": "object", "properties": {"next_page": {"type": "integer", "description": "If there's no next page, this will be None", "example": 3}, "page_count": {"type": "integer", "example": 3}, "previous_page": {"type": "integer", "description": "If there's no next page, this will be None", "example": 1}, "has_next_page": {"type": "boolean"}, "has_previous_page": {"type": "boolean", "example": true}}}, "TranslatorAddress": {"type": "object", "description": "Has the same rules and fileds as `Address` model, but this one extends it\nwith `address_type`.\n", "allOf": [{"$ref": "#/definitions/Address"}, {"required": ["address_type"], "type": "object", "properties": {"address_type": {"enum": ["CON"], "type": "string", "description": "- `CON`: Contact address.\n", "format": "char[3]"}}}]}, "DeviceCreate": {"type": "object", "properties": {"platform": {"enum": [0, 1, 2, 3, 4, 5], "type": "integer", "description": "- `0`: Not specified\n\n- `1`: iOS\n\n- `2`: Android\n\n- `3`: Web\n\n- `4`: Windows\n\n- `5`: macOS\n", "example": 1}, "pns_token": {"type": "string", "example": "qewrtyuhjgfasdsdfgbvc123", "format": "char[512]"}, "device_hash": {"type": "string", "example": "3416asdslfu3094rwsedf54_totally_not_an_id", "format": "char[256]"}, "device_name": {"type": "string", "example": "Google Pixel", "format": "char[256]"}}}, "PayoutSummary": {"type": "object", "description": "Used when attaching to the job for the authenticated user.", "properties": {"status": {"enum": [0, 1, 2, 3], "type": "integer", "description": "This status change will always be automatic and will not accept input\nfrom the outside.\n\n- `0` (n/a): This means that the project is still in progress.\n\n- `1` (invalid): This is the status for an invalid Payout. This means\n that the translator did not finish the project.\n\n- `2` (processing): This is the status for an processing payout. This\n means that the money is currently being processed.\n\n- `3` (paid): This is the status for a paid payout. This means that\n the translator received the payout.\n", "example": 0}, "currency": {"type": "string", "description": "This is the currency as\n[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#Active_codes)\nstandard.\n", "example": "cad"}, "payout_date": {"format": "dateTime", "type": "string", "example": "2018-01-06T12:22", "description": "This is the date that translator received the money to their\naccounts. This is updated automatically when the status is changed.\n"}, "earned_amount": {"format": "float", "type": "integer", "example": 23.32, "description": "This is the amount of money that the translator earns from the\nproject after the commision,\n"}, "hst_amount": {"format": "float", "type": "integer", "example": 2.34, "description": "This is the amount of money for HST tax calculated from earned\namount. The earned_amount does not contain this amount.\n"}}}, "Admin": {"type": "object", "properties": {"is_supervisor": {"type": "boolean", "description": "Supervisor permission of the admin."}, "is_system_manager": {"type": "boolean", "description": "System manager permission of the admin."}, "user": {"$ref": "#/definitions/UserSummary"}}}, "Country": {"type": "object", "description": "The same country with different names can be added. But the country with\nthe same country code will have the same cities. City names are not\ntranslatable.\n", "properties": {"code": {"format": "char[3]", "type": "string", "example": "us", "description": "The ISO 3166-1 alpha-2 is used to determine the countries\n(eg: TR, US). This way, the API can return translations of the country\nnames according to the user's language or the `Accept-Language`\nheader. For the list of the codes see\n[here](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)\n"}, "name": {"format": "char[64]", "type": "string", "example": "United States", "description": "The name is in country's native language."}}}, "LanguageServiceType": {"type": "object", "properties": {"service_type": {"format": "char[16]", "enum": ["TRANSLATION", "INTERPRETATION"], "type": "string", "example": "TRANSLATION", "description": "The service type indicates whether this is an interpretation or\ntranslation service.\n"}}}, "PayoutOverview": {"type": "object", "description": "This is used in /payouts/overview/\n", "properties": {"total_income_for_last_month": {"format": "float", "type": "integer", "example": 1250, "description": "This is the amount of money that the translator made last month.\nThis amount will be in CAD for now.\n"}, "total_earned_amount_in_progress": {"format": "float", "type": "integer", "example": 11250, "description": "The amount of money that is currently being processed to be transferred.\nThis amount will be in CAD for now.\n"}, "total_income_for_last_year": {"format": "float", "type": "integer", "example": 11250, "description": "This is the amount of money that the translator earned the last year.\nThis amount will be in CAD for now.\n"}, "earned_amount_for_current_month": {"format": "float", "type": "integer", "example": 320, "description": "The amount of money that was transferred during the current month.\nThis amount will be in CAD for now.\n"}}}, "JobDocumentUpdate": {"type": "object", "properties": {"document_type": {"format": "int32", "enum": [0, 1, 2, 3, 4, 5], "type": "integer", "example": 5, "description": "Used to indicate the purpose of the document. Only the default type is\nincluded in price calculation.\n\n**If anything other than default type is selected, then the job\nparameter must also point to an existing job.**\n\nDocument type cannot be changed from/to default once set.\n\n- `0` (Default): The default type. If a `document_type` is not\nprovided this type is used. Only this type of document is included in\nprice calculation and the translator is only required to translate the\ndefault type documents.\n- `1` (Supporting): This type of documents are used as supporting\nmaterial for the default type documents. Only customers can upload\nsupporting documents.\n- `2` (Preview): Preview files are visible to the translator before\naccepting the project. Only customers can upload preview files.\n- `3` (Certification): Only translators can upload an affidavit.\n- `4` (Confidentiality Agreement): Only translators can upload a\nconfidentiality\n"}, "source_document": {"format": "int32", "type": "integer", "example": 5, "description": "The source document that this translation belongs to. This field can\nonly be used by translators and proofreaders. When assigning the\nsource document, the translator/proofreader must be assigned to it.\n"}, "language_code": {"format": "char[3]", "type": "string", "example": "en", "description": "Language code of the document."}}}, "Promotion": {"required": ["code", "discount", "start_date", "end_date", "usage_limit", "job_type"], "type": "object", "description": "When a promotion's `is_active` is set to false, you cannot change it back\nto true. If any field of this promotion is set any value except the\ndefault one then those fields will be treated as a must for a job.\n", "properties": {"customers": {"items": {"$ref": "#/definitions/User"}, "type": "array"}, "code": {"format": "char[24]", "type": "string", "example": "TTC", "description": "The codename of the promotion. When people want to use the promotion,\nthey will refer to it with this code. Only one code with the same name\ncan be active. **So, you cannot add a new promotion with the same\nname until it expires or you delete it explicitly or deactivate it.**\n\nIf you want to allow only a set of customers to be able to use the\npromotion, use the `customers` field. If you want all customers to be\nable to use the promotion, just leave it blank. This is\ncase-insensitive and always in lowercase.\n\nThere can only be one discount specifier.\nSo only one of the following values can be set for on promotion:\n - `discount`\n - `discount_amount`\n - `word_count`\n - `job_duration`\n\n`job_duration` and `word_count` can be set together if the Promotion\nis being created for both job types.\n"}, "end_date": {"format": "date-time", "type": "string", "example": "2018-02-02T12:23", "description": "This is the end day of the promotion."}, "is_active": {"type": "bool", "description": "As long as this is set to true, the promotion will be active. This\nwill be set to false when the promotion expires.\n", "example": true}, "explicit_usage_limit": {"type": "integer", "description": "The number of times this promotion can be used in total.\nIf it is set to 3, then only three customers can use it.\nWehereas, with usage limit, each customer gets to use it the set\namount of times. If explicit usage limit is used, then the used_limit\ncannot be used.\n", "example": 3}, "usage_limit": {"type": "integer", "description": "The number of times that this promotion can be used for a customer.\nThe customer will not be eligible for a promotion If the customer has\nalready used it this many times before. If this is a time based\npromotion, you can set this to -1.\n", "example": 3}, "word_count": {"format": "int32", "type": "integer", "example": 32, "description": "The number of words we give out for free.\n"}, "discount": {"format": "float", "type": "integer", "example": 0.2, "description": "This is a value between 0 and 1. 1 means a full discount, which means\nthat when the promotion is used the project will be free.\n"}, "job_types": {"format": "int32", "enum": [-1, 0, 1, 2], "type": "integer", "example": 2, "description": "This promotion will only be available for the selected job type. The\ndefault value is `-1`.\n\n- `-1`: All Types\n\n- `0`: Document Job\n\n- `1`: On-Site Job\n\n- `2`: Fixed Document\n"}, "natures": {"items": {"$ref": "#/definitions/Nature"}, "type": "array"}, "job_duration": {"format": "int32", "type": "integer", "example": 32, "description": "The number of hours of interpretation we give out for free.\n"}, "nature_groups": {"items": {"$ref": "#/definitions/NatureGroup"}, "type": "array"}, "start_date": {"format": "date-time", "type": "string", "example": "2018-01-02T12:23", "description": "This is the effective immediately start day of the promotion."}, "discount_amount": {"format": "float", "type": "integer", "example": 32, "description": "The amount of discount to be applied. This cannot be used along with\ndiscount. This is the dollar value discount.\n"}}}, "DocumentExport": {"type": "object", "properties": {"documents": {"items": {"type": "object", "properties": {"translated_documents": {"items": {"$ref": "#/definitions/DocumentExportSub"}, "type": "array"}, "file_url": {"format": "url", "type": "string", "example": "http://www.link.to/file", "description": "Customer document download URL."}, "id": {"format": "int64", "type": "integer", "example": 2, "description": "Customer document ID."}, "proofread_documents": {"items": {"$ref": "#/definitions/DocumentExportSub"}, "type": "array"}, "name": {"format": "char[64]", "type": "string", "example": "customer_doc.pdf", "description": "Customer document name."}}}, "type": "array"}, "folder_name": {"format": "char[512]", "type": "string", "example": "X Files", "description": "The top folder name."}, "job_id": {"format": "int64", "type": "int", "example": 12, "description": "Job ID."}}}, "PaymentMethod": {"required": ["last_digits", "expiration_date", "card_owner_full_name", "stripe_card_id", "currency", "brand"], "type": "object", "description": "We can save the last for digits and the expiration date of the payment method and still be PCI compliant.\nAlong with those, the Stripe token is also saved. If an existing card is being updated, all of the information\nis required again.\n", "properties": {"card_owner_full_name": {"format": "char[64]", "type": "string", "example": "Cart Curt", "description": "The full name of the owner of the card. This may be different than the name of the user_profile."}, "last_digits": {"format": "char[4]", "type": "string", "example": 6666, "description": "This is the last 4 digits of the payment method."}, "user_profile": {"$ref": "#/definitions/UserProfileSummary"}, "expiration_date": {"format": "char[5]", "type": "string", "example": "12/08", "description": "This is the expiration date in the following format MM/YY"}, "brand": {"format": "char[32]", "type": "string", "example": "American Express", "description": "The name of the brand of the card."}, "is_default": {"type": "bool", "description": "Whether this card is used by default or not. There can only be one default card.", "example": true}, "currency": {"type": "string", "description": "This is the currency as [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217#Active_codes) standard.\n", "example": "cad"}, "stripe_card_id": {"format": "char[255]", "type": "string", "example": "tok_1BYfmyC1pSuA14ZwtBWBGpml", "description": "The card token created by the libraries. Stripe token is expected to be unique."}}}, "DocumentDeliveryCreate": {"type": "object", "properties": {"job": {"type": "int", "example": 1, "format": "int64"}, "documents": {"items": {"type": "number", "example": 23}, "type": "array"}, "delivery_type": {"type": "int", "example": 1, "format": "int64"}, "address": {"$ref": "#/definitions/Address"}}}, "TranslatorRegister": {"type": "object", "description": "Used when registering translator.", "properties": {"bio": {"type": "string", "description": "Description of the user.", "example": "Here's a bio."}, "language_pairs": {"items": {"$ref": "#/definitions/LanguagePair"}, "type": "array"}, "max_job_distance": {"type": "integer", "description": "The maximum distance that the translator can go in kilometers.\n", "example": 50}, "certificates": {"items": {"$ref": "#/definitions/Certificate"}, "type": "array"}, "address": {"$ref": "#/definitions/Address"}, "schools": {"items": {"$ref": "#/definitions/School"}, "type": "array"}, "nature_groups": {"items": {"$ref": "#/definitions/NatureGroup"}, "type": "array"}, "hst_number": {"type": "string", "description": "HST number of the translator.", "example": "123456789RT0001 (Usually it is a 15-digit number)."}, "available_for_lao": {"type": "boolean", "description": "Indicates whether the translator accepts LAO projects.", "example": false}, "language_certificates": {"items": {"$ref": "#/definitions/LanguageCertificate"}, "type": "array"}, "available_for_live_video_job": {"type": "boolean", "description": "If this is set to true, it means the interpreter can join the video\ninterpretations. If this is set to true, the address will not be\nrequired.\n", "example": false}, "courses": {"items": {"$ref": "#/definitions/Course"}, "type": "array"}, "video_chat_accounts": {"$ref": "#/definitions/VideoChatAccounts"}, "available_for_doc_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make document\ntranslation.\n", "example": false}, "available_for_live_job": {"type": "boolean", "description": "If this is set to true, it means the translator can make live\ntranslation.\n", "example": true}, "years_of_experience": {"type": "integer", "description": "The number of years the interpreter has worked.", "example": 4}}}, "ReferralSummary": {"type": "object", "description": "This is used when listing the referrals.\n", "properties": {"is_default": {"type": "bool", "description": "Indicates whether this is the default referral that the customer owns.\n", "example": true}, "use_count": {"format": "int32", "type": "number", "example": 32, "description": "The number of times that others used this referral.\n"}, "code": {"format": "char[32]", "type": "string", "example": "xfd23gh2", "description": "The unique referral code."}}}, "DelayedRequestDeclineReason": {"type": "object", "description": "The reason the job delayed request was denied by the customer. The default\ntext is always in English.\n", "properties": {"reason": {"format": "char[1024]", "type": "string", "example": "Busy with other projects.", "description": "This is the reason the translator didn't accept the job."}, "translations": {"items": {"$ref": "#/definitions/DelayedRequestDeclineReasonTranslation"}, "type": "array"}}}, "CompletedRequestSummary": {"type": "object", "properties": {"response_date": {"type": "string", "example": "2017-02-09T23:43", "format": "dateTime"}, "is_accepted": {"type": "boolean", "example": true}, "request_date": {"type": "string", "example": "2017-02-09T23:43", "format": "dateTime"}}}, "TranslatorReference": {"type": "object", "allOf": [{"$ref": "#/definitions/PhoneNumberMixin"}, {"$ref": "#/definitions/LanguageServiceType"}, {"required": ["name", "phone", "service_type"], "type": "object", "properties": {"name": {"type": "string", "example": "Jane Doe", "format": "char[32]"}, "email": {"type": "string", "example": "jane@doe.com", "format": "char[254]"}}}]}, "Resume": {"type": "object", "description": "Resume object.", "allOf": [{"$ref": "#/definitions/FileResourceBaseModel"}]}, "UserUpdate": {"type": "object", "description": "This is used when updating a user", "properties": {"phone": {"format": "char[15]", "type": "string", "example": 905023659878, "description": "Phone of the supervisor"}, "first_name": {"format": "char[30]", "type": "string", "example": "Murtaza", "description": "Name of the supervisor"}, "last_name": {"format": "char[30]", "type": "string", "example": "Zerafetli", "description": "Surname of the supervisor"}, "gender": {"format": "char[6]", "enum": [0, 1, 2], "type": "string", "example": 1, "description": "- `0`: Not specified\n\n- `1`: Male\n\n- `2`: Female\n"}, "email": {"format": "char[254]", "type": "string", "example": "zerafetli_mustafa_can@zerafet_sokagi.com", "description": "Email of the supervisor"}, "birthday": {"format": "date", "type": "string", "example": "07-10-1993", "description": "The birthday of the user. In ISO date format."}}}, "CompletedRequestDeclineReasonTranslation": {"type": "object", "description": "The reason the job was denied by the translator.", "properties": {"reason": {"format": "char[512]", "type": "string", "example": "Baska islerle mesgulum.", "description": "This is the reason the translator didn't accept the job."}, "language_code": {"format": "char[3]", "type": "string", "example": "tr", "description": "The language code for translation."}}}, "JobRequestUpdate": {"type": "object", "description": "JobRequest is used to log the responses to jobs by translators.", "properties": {"is_cancelled": {"type": "boolean", "description": "If this is provided, all the other fields will be ignored. This can\nonly be updated by the request owner customer.\n", "example": false}, "is_accepted": {"type": "boolean", "description": "This is not required If the request is being canceled. If set to true,\nthe request will be accepted.\n", "example": true}, "translator_note": {"format": "char[1024]", "type": "string", "example": "I'm busy with other projects.", "description": "Additional information that the translator wants to include as to why\ns/he declined the project request.\n"}, "job_decline_reason": {"type": "integer", "description": "ID of the job decline reason object.", "example": 2}}}, "Tax": {"required": ["country", "name"], "type": "object", "description": "A tax object contains information about a single tax in a single country and province. Only one active tax\ncan exist for the same country and province and name. If a new one is added, it will automatically supersede the\nold one. Name is added in lowercase. When a new purchase is being created, that purchase will take all of the\nactive taxes in the database for the country and province of that purchase.\n", "properties": {"province": {"$ref": "#/definitions/Province"}, "deactivation_date": {"format": "date-time", "type": "string", "example": "2018-03-09T12:33", "description": "This is the date that this tax was deactivated."}, "name": {"format": "char[256]", "type": "string", "example": "HST", "description": "The name of the tax in the country and province in lowercase."}, "country": {"$ref": "#/definitions/Province"}, "description": {"format": "char[256]", "type": "string", "example": "This is not a drill. This is a tax.", "description": "This is not required but can be used to provide additional information about the tax."}, "is_active": {"type": "boolean", "description": "Whether this tax is in affect or not.", "example": false}, "creation_date": {"format": "date-time", "type": "string", "example": "2018-02-09T12:33", "description": "This is the date that this tax was created."}}}, "ReferralLimit": {"type": "object", "description": "This limits the number of times a referral can be used, or the projects\nor actions it can be used on. A ReferralLimit does not belong to an\nindividual referral, it can be used multiple times with other referrals.\n", "properties": {"use_count": {"format": "int32", "type": "number", "example": 1, "description": "The number of times this referral can be used by each customer.\nIf set to -1, can be used indefinately.\n"}, "actions": {"items": {"$ref": "#/definitions/ReferralAction"}, "type": "array", "description": "The actions a referral can be used for."}}}, "ReferralActionTranslation": {"type": "object", "description": "Translation for ReferralAction.", "properties": {"name": {"type": "string", "example": "United States", "format": "char[64]"}, "language": {"$ref": "#/definitions/Language"}}}, "School": {"required": ["name", "year", "degree"], "type": "object", "description": "An object that represents a school.", "properties": {"name": {"type": "string", "example": "MIT", "format": "char[256]"}, "degree": {"format": "char[16]", "enum": [0, 1, 2, 3, 4], "type": "string", "example": 1, "description": "Whether it was master's degree, bachelor's degree or or something else.\n\n- `0`: Bachelor's Degree.\n\n- `1`: Master's Degree.\n\n- `2`: Doctoral Degree.\n\n- `3`: Professional Degree.\n\n- `4`: Associate's Degree.\n"}, "year": {"format": "int32", "type": "integer", "example": 2001, "description": "The graduation year."}}}, "EmailRule": {"required": ["email_type"], "type": "object", "description": "An EmailRule is used to allow administrators to subscribe to emails\nthat get sent out automatically through the functions of the app.\n\nWhenever an email is sent of a particular type, if an admin is\nsubscribed to that type via an EmailRule, it will be sent to them as\nwell.\n\nThis is done in an effort to give admins the ability to control\nwhich email types they are notified about.\n", "properties": {"is_internal": {"type": "boolean", "description": "Whether this EmailRule is meant for internal use.", "example": true}, "email_type": {"format": "int32", "type": "integer", "example": 1, "description": "The type of the email to subscribe to."}, "description": {"format": "char[256]", "type": "string", "example": "Errors with Customer Job Payments.", "description": "A description of the email rule."}}}, "DelayRequest": {"required": ["job", "end_date", "request_type", "translator"], "type": "object", "properties": {"end_date": {"format": "date-time", "type": "string", "example": "2018-01-02T13:23", "description": "This is the new end date of the job."}, "request_date": {"format": "date-time", "type": "string", "example": "2018-01-02T10:23", "description": "The date that the request was sent."}, "response_date": {"format": "date-time", "type": "string", "example": "2018-01-02T13:10", "description": "The date that the user responded to the request."}, "is_active": {"type": "boolean", "description": "Whether the request is active or not. When the request is responded\nor cancelled, it will no longer be active.\n", "example": false}, "job": {"$ref": "#/definitions/JobSummary"}, "translator": {"$ref": "#/definitions/TranslatorMinimal"}, "decline_note": {"format": "char[1024]", "type": "string", "example": "Because I cannot afford a delay.", "description": "If `is_accepted` is `false` then this field is mandatory. If the job\nis accepted this will be an empty string.\n"}, "request_type": {"format": "int32", "enum": [0, 1, 2], "type": "integer", "example": 0, "description": "Indicates the type of the request.\n\n- `0` (translator): The request is intended for a translator or an\n interpreter. This is the default value.\n\n- `1` (proofreader): The request is intended for a proofreader. This\n value is only available for document jobs.\n\n- `2` (customer): This is set when the delay request is sent for an\n on-site or video job.\n"}, "is_cancelled": {"type": "boolean", "description": "Whether the request is cancelled or not. When the request is cancelled,\nit will no longer be active.\n", "example": false}, "is_accepted": {"type": "boolean", "description": "Whether the request is granted or not. If it was not responded, this\nwill be null.\n", "example": true}, "start_date": {"format": "date-time", "type": "string", "example": "2018-01-02T10:23", "description": "This is the new start date of the job. This will only be present for\nlive jobs. If it is left blank, it will\nhave no effect.\n"}, "decline_reason": {"$ref": "#/definitions/DelayedRequestDeclineReason"}}}, "TranslatorUser": {"required": ["first_name", "last_name", "email", "phone"], "type": "object", "description": "A User object that's specific for translators.", "properties": {"first_name": {"type": "string", "example": "Jane"}, "last_name": {"type": "string", "example": "Doe"}, "gender": {"enum": [0, 1, 2], "type": "string", "description": "- `0`: Not specified\n\n- `1`: Male\n\n- `2`: Female\n", "example": 1}, "profile_photo": {"type": "string", "description": "Profile photo", "example": "http://www.edmoware.com/gamze.png"}, "phone": {"type": "string", "example": "+905064569878"}, "requires_password_change": {"type": "boolean", "description": "Indicates whether the password must be changed. When this field is\ntrue, the existing password will not be asked.\n", "example": false}, "last_login": {"format": "date", "type": "string", "example": "2017-01-01", "description": "This is a read-only field. It is updated every time a user sends a\nrequest.\n"}, "email": {"type": "string", "description": "Email address of the user", "example": "furkan@zmc.com"}, "date_joined": {"format": "date", "type": "string", "example": "2017-01-01", "description": "This is a read-only field"}}}}, "swagger": "2.0", "consumes": ["application/json"]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment