> ## Documentation Index
> Fetch the complete documentation index at: https://developers.gojoe.de/llms.txt
> Use this file to discover all available pages before exploring further.

# Your articles as GO JOE holds them

> Every article you pushed for a pharmacy, what you last sent, whether
GO JOE has mapped it, and what the shop sells right now. Use it to
check your pushes and to see which numbers still wait for mapping.
Sorted by `pharmacy_sku` and paged: follow `next_cursor` until
`has_more` is false.




## OpenAPI

````yaml /openapi.yaml get /inventory
openapi: 3.1.0
info:
  title: GO JOE Pharmacy API
  version: 1.0.0-prototype
  summary: >-
    Receive GO JOE orders in your ERP, report back what happens to them, and
    keep GO JOE's stock and prices current.
  description: >
    The GO JOE Pharmacy API lets a pharmacy (or the ERP of a pharmacy group)

    receive paid, doctor-approved GO JOE orders and report their progress.


    **How it works**


    1. GO JOE sends a short, signed **webhook** (`order.created`) to your
    endpoint.

    2. Your ERP **fetches the full order** with `GET /orders/{id}` and downloads
    the
       prescription with `GET /orders/{id}/prescription`.
    3. You **accept** the order with your own order number (`POST
    /orders/{id}/accept`).

    4. You **report progress**: `packed`, `ready_for_pickup`,
    `out_for_delivery`,
       `completed` (`POST /orders/{id}/status`).
    5. Missed a webhook? Everything is also in the **event feed** (`GET
    /events`),
       which you can replay from your last cursor.
    6. Keep **stock and prices** current with `PUT
    /pharmacies/{pharmacy_id}/inventory`
       (whole catalogue or changed rows) and `PATCH …/inventory/{pharmacy_sku}` (one article).

    **Prescriptions come in two stages.** An order appears as soon as the

    *Vorab-Rezept* exists (`prescription.stage = vorab`). When the doctor's

    qualified electronic signature (QES) is done you receive

    `order.prescription_signed`; download the document again and file the signed

    version in place of the Vorab-Rezept.


    **Conventions:** JSON, UTF-8, timestamps in ISO-8601 UTC, money in integer

    cents (EUR, gross), quantities in g (flower) or ml (extracts). Ignore fields

    you don't know: new fields can appear at any time without a version change.

    Errors are `application/problem+json` with a stable `code`.
  contact:
    name: GO JOE Integrations
    email: support@gojoe.de
servers:
  - url: https://gojoe.de/api/pharm/v1
    description: Production (live keys, gj_live_…)
  - url: https://sandbox-api.gojoe.de/api/pharm/v1
    description: Sandbox (test keys, gj_test_…; fake orders and MUSTER prescriptions only)
security:
  - apiKey: []
tags:
  - name: Account
  - name: Orders
  - name: Events
  - name: Inventory
  - name: Webhooks
    description: What GO JOE sends to your webhook URL.
  - name: Sandbox
    description: >-
      Simulator endpoints. They exist on the sandbox only and answer 404 on
      production.
paths:
  /inventory:
    get:
      tags:
        - Inventory
      summary: Your articles as GO JOE holds them
      description: |
        Every article you pushed for a pharmacy, what you last sent, whether
        GO JOE has mapped it, and what the shop sells right now. Use it to
        check your pushes and to see which numbers still wait for mapping.
        Sorted by `pharmacy_sku` and paged: follow `next_cursor` until
        `has_more` is false.
      operationId: listInventory
      parameters:
        - name: pharmacy_id
          in: query
          required: true
          schema:
            type: string
            format: uuid
        - name: cursor
          in: query
          schema:
            type: string
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 200
      responses:
        '200':
          description: A page of the pharmacy's articles
          content:
            application/json:
              schema:
                type: object
                required:
                  - pharmacy_id
                  - data
                  - next_cursor
                  - has_more
                properties:
                  pharmacy_id:
                    type: string
                    format: uuid
                  next_cursor:
                    type:
                      - string
                      - 'null'
                    description: Pass as `cursor` for the next page; null on the last page.
                  has_more:
                    type: boolean
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/InventoryListRow'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/PharmacyNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    InventoryListRow:
      type: object
      properties:
        pharmacy_sku:
          type: string
        name:
          type: string
        last_pushed_at:
          type: string
          format: date-time
        pushed:
          type: object
          properties:
            available:
              type: boolean
            stock_grams:
              type:
                - number
                - 'null'
            price_cents:
              type:
                - integer
                - 'null'
            min_order_grams:
              type:
                - integer
                - 'null'
            order_increment:
              type:
                - integer
                - 'null'
        mapping:
          type: string
          enum:
            - mapped
            - unmapped
        in_shop:
          type:
            - object
            - 'null'
          description: What the shop sells now; null until GO JOE maps the article.
          properties:
            product_id:
              type: string
              format: uuid
            available:
              type: boolean
            stock_grams:
              type: number
            price_cents:
              type: integer
            min_order_grams:
              type: integer
            order_increment:
              type: integer
            updated_at:
              type: string
              format: date-time
        price_warning:
          type:
            - object
            - 'null'
          properties:
            old_price_cents:
              type: integer
            new_price_cents:
              type: integer
            at:
              type: string
              format: date-time
    Problem:
      type: object
      required:
        - status
        - code
        - detail
        - request_id
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
        code:
          type: string
          example: invalid_transition
          description: >
            Stable error code, e.g. `unauthorized`, `wrong_environment`,
            `insufficient_scope`,

            `rate_limited`, `order_not_found`, `not_accepted`,
            `already_accepted`,

            `invalid_transition`, `courier_managed_by_gojoe`, `order_cancelled`,

            `order_rejected`, `idempotency_key_reused`.
        detail:
          type: string
        request_id:
          type: string
          description: Quote this to GO JOE support.
  responses:
    BadRequest:
      description: Invalid query
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Unauthorized:
      description: Missing, unknown or revoked key, or a key for the other environment
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Forbidden:
      description: The key lacks the scope this call needs (`insufficient_scope`)
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    PharmacyNotFound:
      description: No such pharmacy for this key (also for pharmacies of other accounts)
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    RateLimited:
      description: More than the account's limit (default 120) requests per minute
      headers:
        Retry-After:
          schema:
            type: integer
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer gj_live_…` (production) or `gj_test_…` (sandbox).'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.