{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"211b8398-7ee1-4b43-ab49-cce7cdb0a373","name":"Vertex PLM Integration API","description":"The API schema for the PLM integration kernel. The integration kernel\nexposes a RESTful interface that PLM extensions call to schedule part\nimports to Vertex.\n \n## Concepts\n\n  * **Registered Part**: Represents a part or assembly that a PLM intends\n    to sync to Vertex. Parts must be given a unique PLM identifier. The \n    kernel ensures that duplicate parts are not being registered.\n  * **Registered Part Revision**: Represents a revision of a registered\n    part. Revisions must be given a unique version identifier that is \n    assigned by the PLM system, and must be unique to the part.\n  * **Revision Jobs**: Represents a job that will perform the import of a \n    CAD file or assembly creation in Vertex. Jobs are associated to \n    revisions. The kernel ensures a revision only has a single job \n    scheduled at any given time. It also handles the scheduling of jobs \n    for assemblies that have dependencies to other parts.\n\n## Usage\n\nImport of a CAD model using the integration kernel should generally follow \nthis process:\n\n1. Checking if a part has already been registered with the kernel using \n   the `GET /registered-parts` endpoint and passing a `plmId` query param. \n   The kernel does not allow for multiple parts of the same `plmId` to \n   be created.\n2. If a part does not exist, registering a part using the \n   `POST /registered-parts` endpoint.\n3. Checking if a revision has already been registered with the kernel for\n   a part using the `GET /registered-parts/:id/revisions` endpoint, and\n   passing a `plmRevisionId` query param. The kernel does not allow for \n   duplicate `plmRevisionId`s within a part.\n4. If a revision does not exist, registering the revision using the \n   `POST /registered-parts/:id/revisions` endpoint.\n5. Checking if an active revision job exists using the\n   `GET /registered-part-revisions/:id/jobs` endpoint and passing the\n   `statuses=running&statuses=success` query params. The kernel does not\n   allow a new job to be created if there's a running job or if the revision\n   has been already imported successfully.\n6. Creation of a revision import job using the \n   `POST /registered-part-revisions/:id/jobs` endpoint. This endpoint \n   supports creation of both assemblies and non-assemblies. For \n   non-assemblies, you include the CAD file and filename as part of the \n   request. For assembly jobs, you will need to pass an `AssemblyDefinition` \n   that includes a reference to the part and transform for each instance\n   in the assembly.\n7. Polling for the status of the import job using the \n   `GET /registered-part-revision-jobs/:id` endpoint. The result will\n   indicate if the job is running, failed or successful and will include\n   any result or error data associated to the job.\n\n## Dependency Graph\n\nInternally the kernel maintains a dependency graph between parts and\nassemblies, and handles the scheduling logic of imports. For example,\nthe kernel waits to import an assembly until all of its dependent parts \nhave been imported to Vertex. Practically this means interactions from \nthe extension can schedule jobs without dependents having been imported \nyet.\n\n## Auto-generation of API Clients\n\nThe kernel exposes an OpenAPI v3 spec file at `http://<host>/docs/docs.yaml`. \nIt's recommended to auto-generate an API client from this spec file and \nhave it integrated as part of your build process. This makes it easier \nto incorporate changes and be warned of breaking changes.\n\nSee [https://openapi-generator.tech](https://openapi-generator.tech) for \nsupported languages and build tool integrations.\n\n**Note:** You will need to set `--global-property skipFormModel=true` in \nthe generators global settings for all the models to be correctly generated. \nSee [OpenAPI generator customization](https://openapi-generator.tech/docs/customization/#selective-generation)\nfor more information.\n\n## Deployment\n\n### Docker\n\nDocker is recommended for local development and for simple production\ndeployments. It can deployed alongside a single PLM instance or on a \nseparate container that is accessible by the PLM instance. Ask a Vertex\nrepresentative for access to the Docker image.\n\nHere's an example compose file to spin up the kernel and its dependencies.\n\n```\n# docker-compose.yml\nversion: \"3\"\n\nservices:\n  plm-integration-kernel:\n    image: vertexvis/plm-integration-kernel:latest\n    ports:\n      - 8080:8080\n    environment:\n      DATABASE_URL: jdbc:postgresql://localhost:5432/plm-integration-service-data\n      DATABASE_USER: ${postgres-user}\n      DATABASE_PASSWORD: ${postgres-pass}\n      \n      RABBITMQ_URL: amqp://127.0.0.1:5672\n      RABBITMQ_USER: ${rabbitmq-user}\n      RABBITMQ_PASS: ${rabbitmq-pass}\n      \n      VERTEX_BASE_URL: https://platform.platprod.vertexvis.io\n      VERTEX_CLIENT_ID: ${vertex-client-id}\n      VERTEX_CLIENT_SECRET: ${vertex-client-secret}\n    volumes:\n      - ./.kernel/files/:/tmp/plm-integration-service/files\n  \n  postgres:\n    image: postgres:13.0-alpine\n    ports:\n      - 5432:5432\n    restart: always\n    environment:\n      POSTGRES_USER: ${postgres-user}\n      POSTGRES_PASSWORD: ${postgres-pass}\n      POSTGRES_DB: plm-integration-service-data\n    volumes:\n      - ./.postgres:/var/lib/postgresql/data\n\n  rabbitmq:\n    image: rabbitmq:3.12-management-alpine\n    ports:\n      - 5672:5672\n      - 9102:15672\n    environment:\n      RABBITMQ_DEFAULT_USER: ${rabbitmq-user}\n      RABBITMQ_DEFAULT_PASS: ${rabbitmq-pass}\n    volumes:\n      - ./.rabbitmq/data/:/var/lib/rabbitmq\n      - ./.rabbitmq/log/:/var/log/rabbitmq\n```\n\nThen run `docker compose up -d` to start the necessary services.\n\n### AWS\n\nAsk a Vertex representative for more information about deploying\nthe kernel to a managed AWS environment.\n","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":true,"owner":"19169840","team":1199248,"collectionId":"211b8398-7ee1-4b43-ab49-cce7cdb0a373","publishedId":"2sAXjJ7ZLe","public":true,"publicUrl":"https://docs-plm.vertex3d.com","privateUrl":"https://go.postman.co/documentation/19169840-211b8398-7ee1-4b43-ab49-cce7cdb0a373","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.10.1","publishDate":"2024-08-29T03:11:35.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/c7a99ab6042622003702a48197c75803906fe2efd9433ea5524c0d2d1e2d92fa","favicon":"https://res.cloudinary.com/postman/image/upload/v1599231592/team/wlfm2vy7k5fkq5gxiuvp.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://docs-plm.vertex3d.com/view/metadata/2sAXjJ7ZLe"}